欅坂46 ブログの自動生成 (開発日記)
以下は先日ポストした欅坂ブログ自動生成アプリ「zelkova」
の開発日記です。
当初はアンドロイドアプリとして動かそうと思っていましたが、PCのターミナル上で自動生成できたところで、日記として掲載します。
-----------------------------------------------------------------------------------------------------
20180905
urllib3ライブラリを使い、<script>タグの中にあるブログ更新日時文字列の取得に成功した。
その文字列からメンバーIDを鍵、更新日時を値とした辞書"member_update_time"を作成した
20180906
webスクレイピングにより、blogのタイトルと文面を取得できた。
CSSセレクターを使うことでより直接値を取得できた。(昨日のやり方では、存在する<script>タグのループを回し、該当箇所を見つけていた)
LSTM(long short term memory)の概要を学んだ。
RNN(Recurrent neural network)の拡張であり、どちらも時系列データ(sequential data)を扱う。
時系列順にならんだデータに対し、入力と出力のデータの位置が時系列として近い場合、RNNは過去のデータをもとに学習できる。
だが、その位置が遠い場合(長期依存性の問題という)、RNNでは学習が進まなかった。
LSTMではそれを克服し、長期的な依存関係を学習できるようになった。
これを日本語文の自動生成に当てはめると、今までの単語の列を時系列データとして、次に予想される単語を生成することができるようになる(らしい)
参考文献
2. https://qiita.com/KojiOhki/items/89cd7b69a8a6239d67ca
今の所、理論よりもすぐに日本語を自動生成した意欲が勝っている。
なにか本を買うべきなのか?
明日は、今開いているLSTM文章生成ページのどれかを参考にし、文章を生成したい
20180907
pipインストールがうまく動かない。python3にmecab(日本語形態素解析ツール)を入れようとしたが通らず。
この記事を参考にアナコンダをアンインストールした。
https://qiita.com/pickles/items/12c8c73d3d4bbd61f738
python3, pip3も再インストールした。
mecabインストールできた。
ex.
'5', '月', 'も', 'もうすぐ', 'で', '終わり', '、', '、', 'あ', '、', 'そう', 'いえ', 'ば', '、', 'これ', 'といった', '五月', '病', 'に', 'かかっ', 'て', 'ない', 'かも', 'しれ', 'ん', '!', 'こ', '~', 'れ', 'は', '今年', 'の', '小林', '、', '一味', 'ちがう', 'ぞ', 'っ', '!', '小林', '由依', 'です'
アンドロイドアプリはうまくいくのかな?
ストップウォッチアプリを作ろうと思い
https://employment.en-japan.com/engineerhub/entry/2017/06/23/110000
を試した。初kotlin。たくさんエラーが出て放置。
20180908(土)
できていないこと
・分割した各形態素を学習し、文章をLSTMにて自動生成すること
・androidアプリをつくり、実機でテストすること。
python3へのtensorflowのインストールに手間取った。
pyenvでpython 3.6.0へダウングレードしてから、
pip3 install tensorflow
で通った
いまのところLSTMを用いた文章生成のサンプルソースコードを見てもよくわからない。
なので、本「ゼロから作るDeep Learning ❷ ―自然言語処理編」を注文した。
届くまでの間、kotlin入門をやろうと思う。
http://www.atmarkit.co.jp/ait/series/8323/
20180913(木)
ブログの最終更新日時取得のコードはpythonで書いた。
android studioでkotlinを用い、androidアプリでそれを利用したい場合、
pythonコードをサーバー上において、androidアプリからはそのresponseを受け取る形にしてはどうか?(竹宮)
20180920(木)
本「ゼロから作るDeep Learning ❷ ―自然言語処理編」の7章1節「言語モデルを使った文章生成」まで読んだ。
学習済みの重み行列を用いてはいないが(CPUで計算する場合、学習に2日かかると記述があり、怖気づいた)、文章生成は行えた。
うまくいきそう。アンドロイドアプリとなるかはおいといて。
githubにレポジトリを作成。最近、覚えたて。嬉しくてよくpushしてる。
pythonによるwebscrapingも久しぶりに行った。
主な変更点は、
現在(18/09/20)までの過去の全ブログ(小林由依の)の、文章、タイトル、更新日をカラムとするcsvファイルを生成できた。
できていないこと、改良点は、
・メンバーごとの変数(ブログでの管理番号)は別ファイルに定数として保存
・各メンバーブログの最初のポストがあるurlまで、for文をまわすこと
例:
メンバーのブログは、ポストが新しい順にならんでいる。いかのurlにおいて
http://www.keyakizaka46.com/s/k46o/diary/member/list?ima=0000&cd=member&ct=07&page=XXXX
XXXXが大きいほど、古いブログポスト。XXXX=nが最初のポストがあるページだとすると、
http://www.keyakizaka46.com/s/k46o/diary/member/list?ima=0000&cd=member&ct=07&page=n+1
まではforループが回ってほしくない
・csvファイルを読み取りcorpusを作ること(mecabを使う)
20180921(金)
改良点は主に2点。
1, word2vecのCBOWモデルを用い, 指定した単語と類似度の高いものを列挙できるようになった。
なお、この場合の類似度は、メンバーが書いたブログをもとに、生成するもの。
[query] 織田
鈴本: 0.86669921875
今泉: 0.828125
菅井: 0.8173828125
娘: 0.787109375
米谷: 0.78662109375
[query] see
おやすみなさい: 0.92431640625
you: 0.92236328125
again: 0.82763671875
うら: 0.8037109375
では: 0.78173828125
2, 関数と定数をそれぞれディレクトリ"functions", "datasets"の中に入れ、共通パーツ化した。
なお、関数のコード自体は数日前に書いたものもある。
関数は
getUpdateTime(): ブログの最新更新日時を取得する
getBlogPutCSV(): webサイトへスクレイピングに行き、全投稿ブログの、投稿日時、タイトル、本文を取得し、csvファイルとして出力する
generatePkl(): NNで学習や推論時、使用するcorpus, word_to_id, id_to_word, wordsを格納した辞書型ファイルをpickleファイルとして生成する
次に目指すことは、時系列データを生成し(改良点の1ではtargetとなる単語のの両脇の単語を、同等のものとして学習した、これは時系列データの学習ではない)、ブログの文面を自動生成することを目指す。
20180922(土)
備忘のため。
1. SGDのS(stochastic: 確率的)のイミ。
2. Adamとは
1. そもそもNNの学習手順は
mini-batch処理、勾配の算出、パラメータの更新を繰り返す。
このときのmini-batch処理とは、訓練データの中からランダムに一部のデータを選び出す。
その選出がstochasticの由来
2. AdamはAdaGradとMomentumという、2つのパラメータの更新方法を融合したもの。
AdaGradは、大きく学習すると学習率を小さくし、小さく学習すると学習率を大きくするように調整する、パラメータの更新法。
Momentumは重みWの更新に、速度ベクトルvを導入したもの。
本「ゼロから作るDeep Learning ❷ ―自然言語処理編」の「6.3節RNNLMのさらなる改善」では
RNNLM(recurrent neural network language model)の改善モデルBetter RNNLMモデルを導入した。
そのモデルの学習用コードではcorpus, corpus_val, corpus_testとptbのデータセットから得られるcorpusを3つ作成していた。
その意図がわからない。
ptb.train.txtとptb.valid.txtとptb.test.txtとあるが、ある全体の文章を8:1:1に分割してそれぞれ作成してみてはどうか?
→した。うまくいきそう。明日の朝結果を確かめる
今の所ブログをスクレイピングしてきたデータは時系列順になっている。
corpusを8:1:1に分割してDLするなら、1ブログ単位でシャッフルしたほうが良いと思う。
→やろう
python3でサーバーをたて、ブログの最新更新日時や、自動生成したブログを返すようなコードをサーバー上で実行し、
アンドロイドアプリとして受け取るのはどうか?python3のサーバーは簡単に建てられたと思う。
20180923(日)
ch06/zelkova_train_better_rnnlm.pyを行った。8時間ぐらいかかった。
学習ではppl(パープレキシティ)が良い方向に更新されたときに、パラメータのsaveを行うのだが、
学習開始1時間半後が最終更新となっていた。そのため、あとの6時間半はpplを更新できていなかったのかも。
とにかく昨晩作成したパラメータ(zelkova_trained_weight_better_rnnlm_kobayashi.pkl)を用いて、
ch07/zelkova_generate_better_text.pyでブログの文章生成を行おうと思う。
→エラー
toasa:ch07 $ python3 zelkova_generate_better_text.py
Traceback (most recent call last):
File "zelkova_generate_better_text.py", line 25, in <module>
model.load_params('../ch06/zelkova_trained_weight_better_rnnlm_kobayashi.pkl')
File "../common/base_model.py", line 49, in load_params
param[...] = params[i]
ValueError: could not broadcast input array from shape (7647,650) into shape (10000,650)
20180924(月)
toasa:ch07 $ python3 /Users/tohyama/sample/python/zelkova/dl-master/ch07/zelkova_generate_better_text.py
私 の マスカラ に 踊っ て しまい まし た 。 ホワイト もらい まし た それ と 2017 みん が 信じ ない 方 は もう 出来る ん です よ よ ね ~ なんて 幸せ な ん です ファン 番組 の 大好き な 気分 は あっ たら 大丈夫 な そう だ な ~ と 思っ て い ます 。 ららぽーと 使い ない 力 。 という こと で どっち の こと で こういう 期生 の 人間 観 ましょ う (°´ ˘ `°)/ さあ どんどん 撮り は ます 。 明日 から 、 握手 会 汚れ 握 で 大阪 でし た ! ZIP の CM
できた。はじめての文章生成、小林由依のブログ。
こちらで最初の一文字目"私"を選択。残りの99文字は自動生成されている。
20180925(火)
ブログを取得し、csvファイルとして出力し、corpusまで作成するファイルをprepare/prep_all.pyとして実装した。コマンドライン引数にメンバーの
名前を書くことで実行できる
ex.
$ python3 prep_all.py kobayashi