star-code.net

自動連想ゲームを作った

はじめに

2 つ単語を与えると,連想ゲームで繋いでくれるツールを作りました. こちらから遊べます.

例えば,「飴」から「免責」までの連想を計算させる(閾値:0.5)と, 飴→菓子→リキュール→酒→飲酒→飲酒運転→事故→損害→免責 となります.

閾値を少し下げる(0.4)と, 飴→砂糖→原料→品質→保証→免責 となります.

閾値を下げると,より単語間の意味が開いて,短い経路が見つかるようになります.

仕組み

word2vec です.以前から何度もこれで遊んでいますね. 単語をベクトル化することで,類似度であったり,計算であったりができるという代物です.

語彙の絞り込み

以前からずっと語彙の選定に苦労していました.

今回の用途では,日本語頻出単語リストとして多くとも 30000 語程度(これより多いと計算が厳しい)必要で,いい感じに絞る方法を考えました.

まず考えたのは,Wikipedia の見出し語を使う方法です. 日本語 Wikipedia エンティティベクトルでは,Wikipedia の見出し語のベクトル表現を得ることができます. Wikipedia のアクセス数の多いほうの見出し語を使えば頻出単語リストとして使えるのではと思った,のですが,これがあまり面白くなりませんでした. 知らない人の名前ばかりが連鎖してしまうのです.

そこで,別の方法を考えました. 今回使用した単語ベクトルは,chiVe: Sudachi による日本語単語ベクトルです.以前も用いました. このうち,v1.3 mc90 を用いました. これは,最低頻度として 90 回以上出現する単語を対象として学習されたベクトルです. このベクトルを使うことで,語彙数を約 40 万語にまで絞ることができました. まだ多いですね.

余談ですが,Sudachi 辞書では表記揺れへの対応がされています. 例えば,「りんご」や「リンゴ」は「林檎」に正規化されます. もしかしたら,漢字表記などを試してみると,求めている単語が出てくるかもしれません.

さらなる絞り込みのために,The JMDict Projectという,日本語を中心とする多言語語彙リストを作成するプロジェクトの語彙リストを用いました. こちらも以前,二字熟語リストを作る際に用いました. この JMDict の語彙リストには common というフラグが存在しています. これにより,メジャーな単語のみを抽出することができます. 加えて,品詞や,かな表記が一般的かどうかなどの情報も含まれているので,これらも活用して,最終的に 17724 語に絞りました.テキストファイルはこちら.

最短経路の計算

閾値を上回る単語ペアに対して辺を張り,最短経路を計算します. これは幅優先探索(BFS)で実装しています.

高速化の工夫として,スタートとゴールの双方向から BFS を行っています.

おわりに

友人からアイデアをもらったので,作るしかない,ということで作ってみました.これでいいですか?

今回,日本語の頻出単語リストを作れたので,まだ何か遊べるかも. 以前は語彙リストが曖昧だからといった理由で漢字に限定して単語ベクトルの足し引きで遊んでいましたが,今回のリストを使えばより自由に遊べそう.作ってみようかな.

追記:作りました(リンク).