天海春香さんと会話したいシリーズ16
基本情報落ちた
作り直した
前々回ぐらいの記事で文章表現を増幅することで細かいニュアンスの変化に対応できるとかいうことを書いたが、色々とやり方が悪くて効果が出なかったのでそれを踏まえて作り直した
DB設計
単語に対して品詞データを全て保存しておくよりも、助詞かどうか、接続語かどうかだけ、と使う分だけ保存しておいて方がよい気がした 厳密な測定をしてないので効果はなんとも言えない
返答部分
https://github.com/sasamijp/Amami16/blob/master/roid/responder.rb
Aと言われたらBと返すという会話コーパスの集合があって、入力が与えられた時それがAである確率が最も高いものを選んでBを返すという基本的な部分は変えない
入力がAである確率を出すにあたって、単語を1単位として編集距離を出すのが一番強い気がした 例えば
["今日","の","ごはん"]と
["今日","の","うんこ"]
の編集距離は1である
しかしこれには弱点があって、例えば
["死ね"]と
["好き"]の編集距離が1である 意味が全然違うのに文章として近いと判定されてしまう
これを避けるため、助詞以外の品詞が最低1つ一致しない場合そのコーパスを除外する 残ったコーパスでそれぞれ入力との編集距離を算出する
効果
@whywaita いや、考えなくてもわかるよね? 当たり前の事だよね?
— 天海春香 (@sa2mi) 2014, 11月 13
@sasamijp なんでそうなる
— 天海春香 (@sa2mi) 2014, 11月 12
@sasamijp ありがと!!
— 天海春香 (@sa2mi) 2014, 11月 12
天海春香さんと会話したいシリーズ15
クソみたいなコーパス
つらみ
これは「トーク長え...」と言われたのに対して「久し振りに...」という返答があるコーパスなのだが、ラジオMC専用の対話システムでもない限り会話コーパスとしてはまず使い物にならない
こういった使い物にならない会話コーパスがとても多く滅茶苦茶な返答をする原因になっている
なんで
SSの種類っていうか内容を判別せずに収集させていたので使えないコーパスが大量に発生するっぽい
元のSSを読んでみるとラジオ番組の放送中という設定らしい、面白かった
どうすんの
ラジオSS、登場人物が多いSS、発言がいちいち長いSSなどを弾く基準を設定して会話コーパスを再収集する
どうやんの
パースされたSSがコーパスに適しているか判定するクラスを作った
https://gist.github.com/sasamijp/a997fcbef4e9c4c708a1
発言の平均の長さが20以下かつ一対一の会話が40%以上の場合と、発言の長さが20以上でも一対一の会話が80%以上の場合、コーパスとして適していると判断される
どうなの
まだちょっとしかテストしてないけど多分いい感じ
天海春香さんと会話したいシリーズ14
重い
18万件も会話コーパスがあるとDBから全部の文章を取り出してmecabで分かち書きして数値出してみたいなことをやるとものすごい時間かかる 10分ぐらいかかる
1回の返答に10分かけるとかやってられないので事前に分かち書きしてDBに保存しておくことにする
かなり雑だけどテーブルはこんな設計になった
これに従来のコーパスを放り込める状態に変換して放り込むのに7時間ぐらいかかった 多分やり方が悪かった
文章表現の増幅
細かいニュアンスは違うけど、言いたいことは同じ、みたいな文を検知して正しい返答を返したい
文章中の名詞と助詞を置換可能なものに置換することで、より正確にその文章の言いたいことがわかるようにしたかった
置換可能名詞の推定
日本語 Wordnetという日本語の意味辞書を使う
入力した名詞に対する類義語、上位語、下位語を置換可能な名詞として扱う
「電車」を例にするとこんな感じで置換可能名詞がとれる
置換可能助詞の推定
もうマルコフ連鎖みたいな感じで置換可能な助詞とれるんじゃね?みたいなノリだった 甘かった
入力した文章中に含まれる助詞の前後の単語と品詞が一致する助詞をコーパスから検索し置換可能助詞として扱う
よくできた例
いい感じに語尾が置換されて表現が増幅されている
悪い例
「私は元気です」とは文章の意味自体が違うものが多く出てきている そもそも日本語として成り立ってないものも多い
調べてみると、格パターン分析とかいうことをやらないと置換可能な助詞はちゃんととれないらしい
ムビマスBD届いた
BD再生機器ないから本編とシャイニーフェスタ観れないんだけど特典CDが素晴らしかった 生きててよかった
天海春香さんと会話したいシリーズ13
戦いは数だよ兄貴
前々回の記事でノイズの少ない会話コーパスを集めるのが大事といった話を書いたが、それにしても会話コーパスの量が3000とかだと会話するには全然足りないと感じた
ノイズの少なさを保ったまま会話コーパスの量を増やすために適当なSSまとめサイトの記事を全部保存するスクリプトを書いてみた
記事のurl全部取得するやつ :
https://gist.github.com/sasamijp/b9c1f8a5f3f554060f1d
記事の内容を会話コーパスに変換して保存するやつ :
https://gist.github.com/sasamijp/c845f4784c050789a434
SSから会話コーパスへの変換をするクラス :
https://gist.github.com/sasamijp/4df8193b80c4007dd185
会話コーパスのテーブルはこんな感じで用意した
以前までは発言者が春香のコーパスのみを集めていたがほかのキャラの会話も色々と使いようがあるので保存しておくことにする
それでも大体18万ぐらいの会話コーパスが集まったので以前より600倍ぐらい強い春香さんができると思う
泣きそう
大きさ18万のデータとなると今まで適当にループ回して2秒ぐらいで終わった処理に1分ぐらいかかったりするのであらかじめ文を分かち書きしておくなどといった工夫が必要になる
つらい
今日は、このへんに、しときます、それではみなさん、さよなら〜
天海春香さんと会話したいシリーズ12.5
悲しみ
sa2miのツイッターのアイコンが固定なのがちょっと寂しいので会話の内容に応じて変わるようにしたい
ミリマス
アイドルマスターミリオンライブで会話ダイアログに使われる画像を使う
ベイジアンフィルター
文章から感情を判定するためにclassifierというgemを使った
5種類の表情に分けるために手動で教師データを作る
https://gist.github.com/sasamijp/3a5f0ee3f468282f368c
精度
結構よくできた感じするけど、夜フクロウ側がたまにアイコンをすぐに読み込まないのですぐに顔が見えずとても悲しい気持ちになった
天海春香さんと会話したいシリーズ12
前回のラブライブ!
ノイズの少ない学習データ(SS)を用意することが一番重要だとわかったのでSS収集をもっとしっかりできるように作ろう
ショートストーリーの収集
まとめブログの本文抽出にextractcontentというgemを使っていたのだが精度がよくなくて記事の半分ぐらいまでしか読み込めないので自分で本文抽出を書いた
https://gist.github.com/sasamijp/702cd781aebdc97deae1
返答の仕組み
与えられた入力と学習データのin_reply_toがある程度一致するとserifが返る
ほとんど従来型と変わらないが名詞と動詞に対して重くスコアを振る感じにしたので「ちょっと来て」という文に対し「ちょっと」という部分に対してしか返答できなかったのが「来て」に対しての返答をしてくれるようになった
https://gist.github.com/sasamijp/67de96c5a246224d7e27
いい感じになった
学習データ数が3600ぐらいと今までと比べるとだいぶ少ないのでもっと増やしてあげたい
オーストラリアにきた
「こんにちWAR〜!」と元気に話しかけられるが、そこから一歩でも近づいたら戦争が始まるぞという意味である