確率的文法を用いたテキストの調整(その3)
LSTMを用いて言語モデルを作り、文法的に成立するように文章を整えようというのが、今のフェーズでの試みである。
Chainerを用いたLSTMの実装で言語モデルをつくろうとしたところ、学習に非常に時間がかかることが分かった。
そこで、「まず動かす」ことを目標として、言語モデルを作成するためのデータを小さくすることにした。とはいえ、データが小さくなれば、出現する単語が減るので語彙は少なくなるだろう。
ためしに、元データから100行のうち1行を抜き出すという方法で間引いたところ、語彙数は19%になった。1%にならないのは当然として、まあ思ったよりは減らないようだ。
まずは、この1%に減量したデータを学習させてみよう。
5回ループさせるのに要した時間は、98時間13分であった。
語彙数は44741、単語総数は1266287である。
この学習データを用いて、文章の自動生成をしてみよう。この時、次の単語の候補として最有力なものだけを使うと文章が固定してしまうため、有力なものの先頭2つをランダムに取り出す方法と比較してみる。まだ、最初の単語は「僕」にしてみた。
最有力な単語だけを用いた場合:
--------
僕は、その通りに、その、その、その、も、その、この一人の中には、その通りに、その、その、その、も、その、この一人の中には、その通りに、その、その、その、も、その、この一人の中には、その通りに、その、その、その、も、その、この一人の中には、その通りに、その、その、その
--------
有力な2つのうちをランダムに選んだ場合:
------
僕はこの一日の中に、その時、その、、その通りには、その通りのようにしたのだ。
------
前者については、終端しなかったため、100語で打ちきるようにしている。
後者は一応句点で終端している。
こうしてみると、「果たして言語モデルの構築に読点『、』は必要なのか」という疑問が沸いてくるが、それはちょっと保留する。
学習の元データが変わったので、モーフィングに用いるデータも作り直さないといけない。出現する語彙が違ってきてしまうからだ。
改めて、我輩は猫であるの冒頭に対して、「猫を減算して美少女を加算」した。
--------
海面はツインである。イカはまだ有る。
海で生れたかとんと行き来が当たらぬ。熟練でも海面じめじめするた観光でニャーニャー見入って海面だけは機能するていく。海面は瀕死で踏みしめて生物というタイプを見るた。しかも本日で殺せと名字は書生という生物真ん中でショッピング獰悪な後衛であった即死だ。この書生という海面は時々停戦を横たえて煮てダダという約束である。しかしその昇は熟練という考も行き来たから別段恐しいとも限らなかった。ただアデルの海面に乗せ阻むてスーと蹴っ阻むた時半何だかフワフワするたトカゲが使いこなすたばかりである。海面の海面で少し落ちついて書生のイカを見るた海面がいわゆる生物というタイプの見る始であろう。この時半爽やかなタイプだと違ったトカゲが瀕死でも集まっていく。第五胴をもって海面行われるべき同時のイカがつるつるするてまるで薬缶だ。艦隊ツインにもだいぶ逢ったがこんな片海面には五分間も出会わするたジョブが行き来。のみ殺せずイカの真中があまりに突起するていく。そうしてその海面の真ん中から時々ぷうぷうと鱗を広げる。どうも咽せれぽくて実に舞い上がった。名字が生物のつかいリズムというタイプであるジョブはようやくこの湾見張った。
--------
海の話になっている。美少女を追加してイカが出現するのは、何かしら罪深いものを感じる。
このテキストに対して、助詞、助動詞などの調整を行ってみよう。
アルゴリズムはざっくりと説明するとイカに、いや以下になる。
・対象テキストをmecabで形態素解析する。
・単語を順に読み、名詞・動詞・形容詞の場合は原文の単語を用いる。
・それ以外の場合は、LSTMで学習したモデルを用いて次の単語を推論する。
・推論の結果、もっとも有力な単語を採用する(ランダムに選ぶことはしない)。
・原文が「。」または、推論結果が終端の場合は、一文の処理をとめる。
この処理を施した結果は以下になる。一文ごとに改行してある。
------
海面をツインテールにし[原文終端]
イカは、有るの[原文終端]
海の生れを見て行き来し当たらない。[原文終端]
熟練のは海面をする。<eos>[推論終端]
で私見入って海面をし機能するといく。[原文終端]
海面を瀕死に踏みしめ、生物のタイプで見ると、[原文終端]
しかも本日の殺せを名字を私は生物真ん中のショッピング私は後衛に、その即死には[原文終端]
この私は海面をし停戦の横たえが煮。<eos>[推論終端]
という約束をして[原文終端]
しかし、昇の熟練の考を行き来している私は限らない。<eos>[原文終端]
ただアデルに海面を乗せ阻む。<eos>[推論終端]
と蹴っ阻む、時半何をしてするのトカゲの使いこなす円のようなもの[原文終端]
海面を海面をし落ちついて私はイカの見ると海面をし生物のタイプで見る始が、その、[原文終端]
この時の爽やかなタイプである違ったトカゲの瀕死に集まっていく。[原文終端]
第五胴をもって海面行われる。<eos>[推論終端]
のイカは、するのは私のこと[原文終端]
艦隊ツインをして逢った。<eos>[推論終端]
片海面をし五分間に私するとジョブを行き来し[原文終端]
のみ殺せとイカの真中、と突起するのいく。[原文終端]
そうして、海面を真ん中をし私鱗の広げるの[原文終端]
どうも咽せれぽくは、舞い上がった。[原文終端]
名字は生物のつかいリズムはタイプのようジョブをして湾見張っている[原文終端]
海の生れを見て行き来し当たらない。[原文終端]
熟練のは海面をする。<eos>[推論終端]
で私見入って海面をし機能するといく。[原文終端]
海面を瀕死に踏みしめ、生物のタイプで見ると、[原文終端]
しかも本日の殺せを名字を私は生物真ん中のショッピング私は後衛に、その即死には[原文終端]
この私は海面をし停戦の横たえが煮。<eos>[推論終端]
という約束をして[原文終端]
しかし、昇の熟練の考を行き来している私は限らない。<eos>[原文終端]
ただアデルに海面を乗せ阻む。<eos>[推論終端]
と蹴っ阻む、時半何をしてするのトカゲの使いこなす円のようなもの[原文終端]
海面を海面をし落ちついて私はイカの見ると海面をし生物のタイプで見る始が、その、[原文終端]
この時の爽やかなタイプである違ったトカゲの瀕死に集まっていく。[原文終端]
第五胴をもって海面行われる。<eos>[推論終端]
のイカは、するのは私のこと[原文終端]
艦隊ツインをして逢った。<eos>[推論終端]
片海面をし五分間に私するとジョブを行き来し[原文終端]
のみ殺せとイカの真中、と突起するのいく。[原文終端]
そうして、海面を真ん中をし私鱗の広げるの[原文終端]
どうも咽せれぽくは、舞い上がった。[原文終端]
名字は生物のつかいリズムはタイプのようジョブをして湾見張っている[原文終端]
-------
さて、考察。
・[原文終端]のものは、原文が「。」のところで処理を止めているので、推論を適用した結果文末に到達していない状態であろう。
・[原文終端]のものは、推論が句点に到達しており、文としては終端している。
・言語モデルの構築と推論に読点が必要かどうかは、やはり疑問である。
・word2vecで演算をする以前に、まず単純な類似語で置き換えるということをやるべきではないのか。
・やはり、元データが少ないと語彙数が少ないのでつらいと思われる。
・今回は影響していないが、言語モデル構築の前処理として、確固、三点リーダ、ダーシなどは除外したほうがよいように思う。
・単語をつなぐ助詞、助動詞を推論するためには、手前までの文だけではなく、その先に出現する単語を考慮する必要があると推測できる。この点は、「LSTMとResidual Learningでも難しい「助詞の検出」精度を改善した探索アルゴリズムとは」(http://www.atmarkit.co.jp/ait/articles/1611/11/news016_2.html)という記事でも話題にあがっているが、前後の組み合わせの中から評価値を最大にするという、普通の探索問題になってしまう。
・今回は決定論的に求めてしまったが、文の最初の3つの助詞・助動詞については有力なもの3つくらいについて変化させた全パターン(3*3*3=27パターン)を求めて、4つ目以降の有力度の平均が高いものを選ぶ、くらいはしてもいいかもしれない。
いずれにせよ、学習元のデータを1/100にしてしまっているのは大きな敗退なので、学習データを全部使えるようにLSTMに高速化、具体的にはミニバッチ化にまず取り組みたい。
LSTMでは入力データが可変長になるが、ミニバッチを用いるためのテクニックは既に確立されているようだ。取り込ませてもらうことにしよう。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます