るりぺこ。

koruriデータベースのアルゴリズム †

名詞注目パース †

koruriはオープンソースの形態素解析エンジンmecabを使って、文章を解析しその結果を保存しますが基本「名詞」にのみ注目をします。

これは名詞をランダムで入れ替えるだけのランダム作文ゲームからスタートしているからですが、名詞だけでも十分文章の特徴を出すことができるためそこだけに注視するようにしました。また「名詞」と「その他」で割り切ることで、扱う要素も簡素なレベルで押さえられるといった軽さも持っています。

fig1.jpg
mecabでの解析結果から名詞だけを注目して取り出し、それぞれをデータベースの名詞テーブルに登録します。

fig2.jpg
名詞以外の品詞は全て「その他」としてまとめ、名詞に続く文節「名詞follower」として取り出されそれぞれをデータベースの名詞followerテーブルに登録します。

fig3.jpg
このようにkoruriデータベースでは名詞を中心に扱い、文章は「名詞+follower」がいくつか集まったものとして解析・生成を行います。

るりぺこ。のアルゴリズム †

るりぺこ。のアルゴリズムはVer0.2までランダムテンプレート型でした。ただ単純に文章中の名詞をランダムに入れ替えたものを生成するといった内容。

でもそれでは意味のある文章になかなかなってくれないので、名詞の連続移行のあたりから確率統計的な推移パターンを導入しました。過去のデータを元にしたマルコフ連鎖による過程推測です。

現在は全てのパーツ間を過程推測で繋いでいるため、意味はありませんが文章にはなっているというパターンが多くなっています。今後、統計情報がたまるほど精度が上がっていくといった期待が持たれます。

Ver 0.3以降 のアルゴリズム †

名詞注目型生成 †

るりぺこ。が文章を生成する際、必ず1つの名詞を与えます。この名詞をタネにそれ以降を繋げていくことで、一つの文章を生成する形です。

このタネとなる名詞を「注目語」と呼んでいます。

注目語を今話題の単語に設定することで、流れに乗っているような文を生成することができます。また反応元から名詞を抽出してそれを注目語に設定することで、返事をしたり、コメントをつけたりといった「外していない流れに乗った」文章を生成する事が可能になります。

特に状態がないときの注目語は完全ランダムで選出されますが、後の文節が続かないと意味がないのである程度後続リンクを多く持つ名詞を選出しています。

統計的連続名詞過程 †

名詞をランダムに選出して入れ替えるというのがるりぺこ。の初出でしたが、本当にランダムな名詞だと文が発散して全く意味を持たないということがわかりました。このため、ある程度一緒に出現する名詞群のクラスター化というのを最初に実装します。

fig4.jpg
名詞とその他が交互に連続するのが基本ですが、このとき元となる1つの文の中にあった名詞達は一緒に出やすい傾向があると重み付けしてやります。1の名詞の後には2や3が出やすいので、(1→2)と(1→3)という二つの後続リンク情報を登録します。2の名詞の後は3が出る確率が高いということで(2→3)というリンク情報を持ちます。

3から1といった逆方向については扱いません。

fig5.jpg
こういった得られたリンク情報を全て記録し、統計的確率から今現在扱っている名詞の後に来る(来やすい)名詞というのをピックアップします。マルコフ連鎖というより、近しい名詞クラスタの形成といった方が正しいかもしれません。

これにより名詞の指すモノが発散しにくくなり、まとまった文が構成されやすくなります。

統計的連続文節過程 †

るりぺこ。は「名詞」と「名詞follower(その他)」といった二つの品詞を組み上げて文を作りますが、この名詞とfollowerの間での意味連続性を保つために「この名詞の後にはこのfollowerが続きやすい」というリンク情報も抽出し利用することにしました。

fig6.jpg
(名詞→follower)リンク情報はある名詞の後にはどんなfollowerが来るか、収集した統計から候補を選び出します。

同じように(follower→名詞)というリンク情報も収集しており、これらを交互に繋いでいくことで一つの文を生成することになります。

(follower→名詞)情報から候補を選ぶ際、先の統計的連続名詞過程に即した「後続しやすい名詞」をさらに条件として選択することでよりそれっぽい文章生成となります。

注目語の任意配置 †

Ver0.4.02までは注目語が必ず文の先頭に来る形でした。先の統計的連続過程がどれも順方向のみだったからというのも理由の一つです。

ですが、同じ語句を注目語として連続させたときに同じ名詞が必ず先頭にあるというのはいまひとつ深みに欠けますし、何が注目語だったのかが丸わかりでいささか興ざめするところでもありました。

fig7.jpg
そこで、注目語を最初に任意位置に置きその左右へとリンク生成することで文を作成するアルゴリズムを導入しました。

注目語が先頭以外の所に登場することで、倒置法のような味がでたり別な単語から注目語へスライドしていくような効果が現れる、ときもあります。

連続過程で使う統計情報は変わりませんが、順方向で展開するか逆方向で展開するかといったルーチンを二つ用意することで機能を実現しています。

Ver 0.2 までのアルゴリズム †

テンプレート †

koruriでいうテンプレートとは、収集した文から名詞を取り去りその穴をワイルドカードで埋めておいた文章の元を指します。

通常の意味の通った文が最初にあって、その名詞部分をめちゃくちゃに入れ替えたものをるりぺこ。はさえずっています。

元の文
私の名前は中野です。
取り出された名詞
私 名前 中野
テンプレート
(*)の(*)は(*)です。
ランダムに抽出した名詞
空飛ぶ円盤 こたつ 地中海
生成文
空飛ぶ円盤のこたつは地中海です。

テンプレートの選出 †

現在のところ、テンプレートもランダムに選出しています。

ただし、テンプレート自体意味不明だったり名詞が一つだけとか文をなさないものもありますので、手作業でスコアリングして使えないテンプレートはマイナススコアにしておき選ばれないようにしています。

文章の連結 †

実際に収集した文からテンプレートを生成していますが、一言二言といった短文が多くなる傾向にあります。

「(*)だ」みたいに極端に短いテンプレートだと面白みにかけるしそれがランダム作文であっても意味をなさないため、一回の生成でいくつの名詞を使うかといった制約をつけました。 現在のところ、毎回2〜6個(数はランダム)の名詞を含んだ文にすることと内部で決めており、選出したテンプレートに含まれる名詞数がそれより少ない場合はさらにテンプレートを選出して後ろに結合していきます。

結合時、前のテンプレートが句読点で終わっていたらそのままくっつけます。句読点なしで終わっていた場合は「、」を間にはさみます。

これにより複文節あるように見える文が生成されますが、大抵の場合意味が連続していませんのでとんちんかんなテイストとなります。

このページの添付ファイル

fig1.jpg
fig2.jpg
fig3.jpg
fig4.jpg
fig5.jpg
fig6.jpg
fig7.jpg

添付ファイル: filefig6.jpg 245件 [詳細] filefig7.jpg 252件 [詳細] filefig5.jpg 244件 [詳細] filefig4.jpg 252件 [詳細] filefig2.jpg 253件 [詳細] filefig3.jpg 242件 [詳細] filefig1.jpg 255件 [詳細]

Last-modified: 2017-11-06 (月) 01:22:22 (3271d)