地平線まで行ってくる。

記録あるいは忘備録。時には検討事項。

マルコフ連鎖による文章自動生成 #4 しっかり学習させると。

 pythonのお勉強とおもって「文章自動生成」にチャレンジ中。これまで分かち書きした文章の教師用データを作ってお試しでの文章自動生成に成功しました。今回は「猫」という言葉が入っている応答形式のツイートを一週間かけて集めたデータを使います。

 幾つかのテキストファイルにしちゃっているので、学習データのディレクトリに.txtファイルを置いておくと順に読み込んでくれるようにしました。トラブルで再開しやすいように、学習データは学習したら削除することにしました。

 

 ./corpus_data : 学習ファイル

 tweet_learned_data.json : 学習結果

 

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from glob import iglob
import re
import markovify
import os
import gc

def main():

learned_data = "tweet_learned_data.json"

if os.path.exists(learned_data):
with open(learned_data) as f:
combined_model = markovify.Text.from_json(f.read())
else:
print("no learned data.")
combined_model = None

#

for (dirpath, _, filenames) in os.walk('./corpus_data'):
for filename in filenames:
with open(os.path.join(dirpath, filename)) as f:
print(filename)
text_model = markovify.NewlineText(f, retain_original=False, state_size=2)

if combined_model:
combined_model = markovify.combine(models=[combined_model, text_model], weights=[1.0,1])
else:
combined_model = text_model

sentence = combined_model.make_sentence()
print(''.join(sentence.split()))
gc.collect()

with open(learned_data, 'w') as f:
f.write(combined_model.to_json())
print("saved")

#remove learned file.
os.remove(os.path.join(dirpath, filename))


if __name__ == '__main__':
main()

  Qiitaを中心に色々と参考にさせていただきました。ありがとうございます。

 

 これで学習させると・・・116Mの学習ファイルが出来上がり。

 

 文章を生成します。

 malkov_sentences.txt に200文例を表示します。単なる単語になりがちなので短い20文字以下は保存しません。

import os
import markovify

def main():

learned_data = "tweet_learned_data.json"

if os.path.exists(learned_data):
with open(learned_data) as f:
text_model = markovify.Text.from_json(f.read())
else:
print("no learned data.")
exit()

#
sentence = text_model.make_short_sentence(130, tries=10, max_overlap_ratio=0.7, max_overlap_total = 10)
print(str(len(sentence)) + ":" + ''.join(sentence.split()))

if len(sentence) > 20:
# save make sentences data
with open('malkov_sentences.txt', 'a', encoding = 'UTF-8') as f:
f.write(''.join(sentence.split()) + "\n")
else:
print("canceled")

if __name__ == '__main__':
for var in range(0,200):
main()

 で結果。

  • 猫を好きになる犬種分からんもんまで買っててドラズの中にはヒトのことなんだけど、野良猫でした。ガルボ食べるのにゃ!
  • 猫のやつをいつでもダンボールの可能性もありませんが可愛いので野良がいたので里親さん募集。Twitterログアウトしちゃった
  • 人慣れしてるんだけど最後らへんですね。️
  • そんで、これはたまらんですが、新猫が飼いたい。とても猫が、馬だけでも癒されます。
  • 1猫みたいにしてればあまり分からないが、神明かけてたら、次のゲーム。⁇何系男子高校生の頃から猫って毛玉ができて綺麗にするのよ。ボランティア減るぜ」→ちゅき。

 

 なんとなく、変な文書の生成に成功!しかし、ツイートの文章だからか、文章らしからないものが多い場合も。

 

 マルコフ連鎖の場合は、前後の言葉の関係性を学習するけれども、それが2つの言葉なのか3つなのか・・・で決定される。ツイートの場合は文書が短いためか、3つ以上にすると学習したデータが似かよることが多い。また、複数学習データをまとめて学習データにするという手法の場合は、それぞれのモデルの weights を調整することもできる。もうちょっと工夫できるところも多い。

 

 データが大きくなるとメモリーをあっという間に食い尽くして慌てたりと勉強しながらなんとか文章の自動生成ができるようになって、ほっとしました。 

 

 と、ここまでで、分かち書きまで前処理したデータを使って学習データを作成し、文章を生成するところまでてきました。初期目標はある程度達成。とりあえず、ツイートまではやってみたいと思います。

 

 つづく

 

 

bwgift.hatenadiary.jp

 

手持ちUSB扇風機

 暑くなると扇子とか団扇とかを持ち歩く季節。オフィスの机の上にはUSB扇風機を持ち込む人もちらほらと。書類が汗を吸うとメンドイし、ノートパソコンって熱を持つので手に汗をかく。

 持ち運び用のUSB扇風機が近所のお店でも見かけるようになったので、いいものがないか、探してみた。

 それがこれ、スマホスタンド付き・・・。

 もしかしたら、スマホ冷却作用も持たせられるのか。夏はスマホが熱持って動作が遅くなったり、カメラが起動しなかったりするから、興味あり。

 まだ、ポチってはない。スマホにも風をあてて冷却させることができれば買いかも。ポケモンGo遊んでいる人とか試してないかな。レビュー見てもそういう視点からのものがない。

 様子見かなぁ・・・。

 

 

マルコフ連鎖による文章自動生成 #3 学習させてテスト文章作る。

 分かち書きにした文章が用意出来たら、あとは簡単。といっても、すでにライブラリーがあるからなんですが・・・。 

 

github.com

 

 とりあえず、以下のサイトを見ながら学習&文章を生成してみます。 

qiita.com

 すでに、分かち書きは出来ているので簡単。

import markovify

# Load file
text_file = open("input.txt", "r")
text = text_file.read()

# Build model
text_model = markovify.Text(parsed_text, state_size=2)

# Output
sentence = text_model.make_short_sentence(140)
print(''.join(sentence.split()))


 とりあえず、何かの文章は出来た。

 

 これで動く目途がついた。モデルでの連鎖数をどうするのか、はたまた、もっと大きな辞書を学習させてみたい、と次のステップに進むのであった。

 

 つづく

 

 

bwgift.hatenadiary.jp

 

 

 

 

 

 

 

SanDisk SDカード128GB が安い・・・。

  並行輸入ものだがSanDiskで1850円(2019/5/31現在)。これは欲しいなぁ。

 

 

 ところがもっと気になったのは「よく一緒に購入されている商品」が容量がことなるもの。

 不思議な買い方だ。今一つ理解できない(笑)

 

f:id:bwgift:20190531214742p:plain

Amazonに・・・

 

ColaboratoryでGoogle Driveに一時退避

 Colaboratory で作業をしていると得られたデータを退避させる必要がある。

 大抵は、GoogleDriveでどうにかなる。

 お約束を唱える。

#Google Driveをマウント

from google.colab import drive
drive.mount('/content/drive')

google_drive_dir = 'drive/'

  大抵は作業フォルダー毎zipで固めて

!cp /content/hogehoge.zip "/content/drive/My Drive/temp/"

  とかでコピー。

 

 あまり多くはないかもしれないけれども、makeしてinstallするような場合は、makeしたあと、make installする前の状態でzipで固めてGoogle Driveに退避。次回からzipをコピーしてきて回答&make installを唱える。

 ちょっとした時間の節約にはなる。

 GoogleDriveの容量オーバーには注意。

 GoogleDriveもフォルダ毎に容量を制限できる機能とか、外部からはアクセスできるフォルダを認証コードで限定できるとか、実装してほしい。こういう実験にも安心して使いたい。

 

 と、Colaboratoryを使うとみんなやってるはずですよねぇ・・・。

 

マルコフ連鎖による文章自動生成 #2 文字列を分かち書き

 ツイートをひたすら収集して600MBくらいのテキストデータが得られました。行数カウントすると、1,965,620 の文を収集できました。どの程度の学習データがあればいいのか分からない。

 

分かち書きとデータ分類

 さて、得られた文章の前処理を進めます。

 単語単位に文章を分解します。せっかく、応答文で集めたデータなので、将来的にそのまま流用できるようにする。

 というわけで、MeCabを使って分かち書きと質問文と返答文を分けて保存の作業を行う。

 こちらのサイトを参考にして、ファイル名とかを適宜変更します。

qiita.com

 少ないデータを使って動作を確認し、あとは一気に処理をさせるだけ。

 でも、ふと困ったことが・・・Colaboratoryだと大量のデータをいちいちアップロードしたりダウンロードしたりするのは、時間も手間もかかる。

 そこで・・・Google Driveをマウントしてみることにした。

 

 つづく

 

 今回の記事は以下の流れの続きです。

bwgift.hatenadiary.jp

bwgift.hatenadiary.jp

 

洗濯物にサーキュレーター

  部屋干しでの洗濯物には風を当てとかないと、乾きが悪い。そんな季節がやってきた。冬は暖房を入れるからまだましだが、5月から6月が特にだめ。乾かないし、匂いもなんだか生乾きの匂いがしてくる。

 そこで、サーキュレータ。

 やっぱり、全然違う。

 

 洗濯物や熱こもりには首振りじゃなくても大丈夫。

 

  だけど首振りタイプもそんなに変わらない。

 

 たぶん、上記2つが安い。

マルコフ連鎖による文章自動生成 #1 とりあえずデータ集め

高度なチャットボットは無理だけど・・・

 pythonのお勉強としてchatbotを作ってみようと思い立った。いろいろとGoogleって見るといろいろある。ディープラーニングだけでもいろんな手法もあるし、どこから取り付いて良いのかわからない。TensolFlowのSeq2aeqモデルとかいい勉強になりどうだけれども難しそう。実際、そのまんま動かそうとすると環境構築だけで苦労した上にエラーの解決ができなかった。

 マルコフ連鎖であれば、markvify を使うとコードも理解しやすそう。マルコフ連鎖による文章自動生成に挑戦しました。その文章をツイートするところまでできました。

 そこでメモ代わりに書き留めます。

 

使った環境(マシンというか)

 ColaboratoryとメインPCでJupyter lab、借りているVPSを駆使することにしました。本当は駆使するというより、環境を持ち歩けないので仕方なく・・・です。

 

何はともあれ元データ

 まずは、文章集め。データが多ければ多いほどいいだろう。そこで、参考にしたのは、こちら。

 

qiita.com

 

 まずは、Colaboratoryで動作を確認。

!pip install requests requests_oauthlib

!pip install emoji

 くらいで、あとは引数を直接与える様にするくらい。 

args[1] = '私' # jupyter上で実行するとき

  これで無事に動作。

 収集できた文章も応答になっているので、なかなか良い感じ。URLや絵文字も削除できている。収集ペースも大体分かったので、これならサーバーに設定しても破綻しそうにない。

 ということで、VPS(CentOS)で収集を開始。そのまま1週間ほど放置して大量の会話データを収集すると600MBくらいに育ってました・・・。

 

 つづく。

 

Anaconda windows でMeCab

 日本語の処理には必須の分かち書きMeCabを使ってやるのが定番の様だ。Juman++というのもあるようだけれども、今日のところはMeCabのインストールにチャレンジ・・・。

 と言っても下記のサイトの通りでばっちりでした。

qiita.com

 

  ところが、UTF-8の文字列を取り扱うとエラー連発。困ったなぁ・・・。と思っていたら、デフォルトがCP932らしい。いちいち明示的にファイル取り扱うのが無難かなぁ。どこかで一発で宣言できれば便利なんだけれども。

qiita.com

 

 

スマホクリップ

  車載ホルダーって固定方法が難しい。加工までしちゃったり、強力両面テープなんて使ったら後悔しかない。

 クリップ式だと車だとびよんびよんしそうな感じ。

 

 とは言え、こんな感じならしっかりしている印象。サンバイザーにつけると視界を妨げ過ぎるから駄目。でも、荷物とかにクリップつけて固定したりでも十分。ブレーキかけて落ち込んだりしないだけでもOK。

 ドライブレコーダー代わりにもなりそう。 

  と、とりあえず試してみようっと。