欅坂46 ブログの自動生成 (開発日記)

 

以下は先日ポストした欅坂ブログ自動生成アプリ「zelkova」

github.com

 

の開発日記です。

当初はアンドロイドアプリとして動かそうと思っていましたが、PCのターミナル上で自動生成できたところで、日記として掲載します。

 

-----------------------------------------------------------------------------------------------------

20180905

 

pythonwebスクレイピングを行った。

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ではそれを克服し、長期的な依存関係を学習できるようになった。

これを日本語文の自動生成に当てはめると、今までの単語の列を時系列データとして、次に予想される単語を生成することができるようになる(らしい)

 

 

参考文献

1. https://qiita.com/t_Signull/items/21b82be280b46f467d1b#%E7%AC%AC4%E9%83%A8rnn%E7%9C%9F%E3%81%AB%E6%B7%B1%E3%81%84%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF

 

2. https://qiita.com/KojiOhki/items/89cd7b69a8a6239d67ca

 

 

今の所、理論よりもすぐに日本語を自動生成した意欲が勝っている。

 

なにか本を買うべきなのか?

 

明日は、今開いているLSTM文章生成ページのどれかを参考にし、文章を生成したい

 

 

 

20180907

 

pipインストールがうまく動かない。python3mecab(日本語形態素解析ツール)を入れようとしたが通らず。

 

この記事を参考にアナコンダをアンインストールした。

https://qiita.com/pickles/items/12c8c73d3d4bbd61f738

python3, pip3も再インストールした。

 

mecabインストールできた。

 

ブログの各文から、mecabを使い形態素に分解できた

ex.

'5', '', '', 'もうすぐ', '', '終わり', '', '', '', '', 'そう', 'いえ', '', '', 'これ', 'といった', '五月', '', '', 'かかっ', '', 'ない', 'かも', 'しれ', '', '!', '', '', '', '', '今年', '', '小林', '', '一味', 'ちがう', '', '', '!', '小林', '由依', 'です'

 

 

アンドロイドアプリはうまくいくのかな?

 

ストップウォッチアプリを作ろうと思い

https://employment.en-japan.com/engineerhub/entry/2017/06/23/110000
を試した。初kotlin。たくさんエラーが出て放置。

 

 

 

20180908(土)

 

できていないこと

・分割した各形態素を学習し、文章をLSTMにて自動生成すること

androidアプリをつくり、実機でテストすること。

 

python3へのtensorflowのインストールに手間取った。

pyenvpython 3.6.0へダウングレードしてから、

pip3 install tensorflow

で通った

 

いまのところLSTMを用いた文章生成のサンプルソースコードを見てもよくわからない。

なので、本「ゼロから作るDeep Learning 自然言語処理編」を注文した。

 

届くまでの間、kotlin入門をやろうと思う。

http://www.atmarkit.co.jp/ait/series/8323/

 

 

 

20180913(木)

ブログの最終更新日時取得のコードはpythonで書いた。

android studiokotlinを用い、androidアプリでそれを利用したい場合、

pythonコードをサーバー上において、androidアプリからはそのresponseを受け取る形にしてはどうか?(竹宮)

 

 

 

20180920(木)

 

本「ゼロから作るDeep Learning 自然言語処理編」の71節「言語モデルを使った文章生成」まで読んだ。

学習済みの重み行列を用いてはいないが(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, word2vecCBOWモデルを用い, 指定した単語と類似度の高いものを列挙できるようになった。

なお、この場合の類似度は、メンバーが書いたブログをもとに、生成するもの。

[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. SGDS(stochastic: 確率的)のイミ。

2. Adamとは

 

1. そもそもNNの学習手順は

mini-batch処理、勾配の算出、パラメータの更新を繰り返す。

このときのmini-batch処理とは、訓練データの中からランダムに一部のデータを選び出す。

その選出がstochasticの由来

2. AdamAdaGradMomentumという、2つのパラメータの更新方法を融合したもの。

AdaGradは、大きく学習すると学習率を小さくし、小さく学習すると学習率を大きくするように調整する、パラメータの更新法。

Momentumは重みWの更新に、速度ベクトルvを導入したもの。

 

 

本「ゼロから作るDeep Learning 自然言語処理編」の「6.3RNNLMのさらなる改善」では

RNNLM(recurrent neural network language model)の改善モデルBetter RNNLMモデルを導入した。

そのモデルの学習用コードではcorpus, corpus_val, corpus_testptbのデータセットから得られるcorpus3つ作成していた。

その意図がわからない。

ptb.train.txtptb.valid.txtptb.test.txtとあるが、ある全体の文章を8:1:1に分割してそれぞれ作成してみてはどうか?

した。うまくいきそう。明日の朝結果を確かめる

 

今の所ブログをスクレイピングしてきたデータは時系列順になっている。

corpus8: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