word2vecを使った謎かけ作成アルゴリズムの刷新

データベースを大きく改良したので、それに応じて、謎かけシステムを大幅に改良する。まだ、未完成だが、メモがわりに以下に基本的な手続きを書いておく。データベースとしては、国語辞典、類義語辞典、wikipediaの語彙、wikipedia日本語全文から作ったword2vecベクトル、2500万のツイートコーパスから作ったword2vecベクトルをつかう。どれも、mariadbでデータベース化している。raspberrypi3にも入れることができている。

あまりいい謎かけになっていないが、お題が「ロボット」の例で記述する。まず、出力を示して、のちに説明する。まだ、システム自体も荒削りなので仕方がない。

定義が [ 22 ] ありました
関連性ウェイトの計算に [ wikipedia ] を使います
最良定義 [ ロボット ] => (6:0.83665484)[ 自立歩行する小型ヒューマノイドロボット ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) 自立 => 0.47648025
(1) 歩行 => 0.61083984
(2) 小型 => 0.5767887
(3) ヒューマノイド => 0.83665484
(4) ロボット => 1.0000004
同音異義語を探します word = ヒューマノイド yomi = ひゅうまのいど
最良候補に同音異義語がなかったので、セカンドベストを試みます base:歩行 yomi:ほこう
同音異義語を探します word = 歩行 yomi = ほこう
kokugo word0:歩行 yomi:ほこう ==> word1:浦項
kokugo word0:歩行 yomi:ほこう ==> word1:補考
kokugo word0:歩行 yomi:ほこう ==> word1:補講
Wikipedia word0:歩行 yomi:ほこう ==> word1:葆康
同音異義語を解析します
-------------------------------------
定義が [ 1 ] ありました
定義が1個しかないので、それを最良とみなします
最良定義 [ 浦項 ] => [ ポハン ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) ポ => 0.2070303
(1) ハン => 0.32192305
語:歩行 読み:ほこう 同音異義語:浦項 句:ハン スコア:0.32192305
-------------------------------------
定義が [ 1 ] ありました
定義が1個しかないので、それを最良とみなします
最良定義 [ 補考 ] => [ 本論を補足する考察 ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) 本論 => NaN
(1) 補足 => 0.29759088
(2) 考察 => 0.3297671
語:歩行 読み:ほこう 同音異義語:補考 句:考察 スコア:0.3297671
-------------------------------------
定義が [ 1 ] ありました
定義が1個しかないので、それを最良とみなします
最良定義 [ 補講 ] => [ 補充のための講義 ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) 補充 => 0.22250648
(1) 講義 => 0.15278976
語:歩行 読み:ほこう 同音異義語:補講 句:補充 スコア:0.22250648
-------------------------------------
定義が [ 1 ] ありました
定義が1個しかないので、それを最良とみなします
最良定義 [ 葆康 ] => [ 中華民国・満州国の政治家 ]
関連性ウェイトの計算に [ wikipedia ] を使います
(0) 中華民国 => NaN
(1) 満州国 => 0.16425252
(2) 政治家 => 0.121589884
語:歩行 読み:ほこう 同音異義語:葆康 句:満州国 スコア:0.16425252
-------------------------------------
謎かけに使えそうな同音異義語とその定義文
同音異義語:補考 定義:本論を補足する考察
-------------------------------------
<<謎かけ>>
[ ロボット ] とかけて [ 本論を補足する考察 ] とときます
そのこころは
どちらも [ 歩行 (補考:ほこう) ] がつきものです

まず、お題のロボットの定義文は、先に記載のデータベースの中には、22個もある。ロボットと題するチャペックの小説もあり、いろいろだ。ただ、どれを選ぶかが非常に重要だ。お客さんからお題をロボットともらっても、チャペックの小説のことと受け取ったら駄目である。

そこでどうするのか。22個のそれぞれの定義の中に、ロボットという言葉とword2vecで測って、一番近い距離を有する名詞を含んでいる定義を、定義として採用する。ここでは、6番目の定義が、distanceが0.83665484となって一番高く、ロボット一般というよりも、ヒューマノイドロボットの定義になっている。

次に、このロボットの定義の中にある6個の名詞に注目する。その中で、word2vecで測って、最も近い距離の名詞を取り上げる。ただし、お題のロボットと同じ名刺は距離1.0になって一番近くなることは明らかで、謎かけにならないから外す。

そうすると、ヒューマノイドという言葉が、最もロボットと近親性を持つ言葉であることがわかる。そこで、この言葉と同音異義語の言葉を探す。すなわち、先のデータベース全体の中で「ひゅーまのいど」という読みを持って、意味が異なる言葉を探すのである。

もちろん、そんなものはありそうにない。実際、なかった。そこで、セカンドベストで、先の6個の名詞の中で、次に良い、というかロボットとの距離が0.6以上のことばを調べる。すると「歩行」であることがわかる。そこで「ほこう」という同音を持つ異議語をデータベースの中から探す。

すると、4つあることがわかる。この中でまたどれを選ぶかが問題になる。本当は、私としては、大学の講義の補講を選んで欲しいが、その根拠をなかなか作れない。まずさしあたって、各同音異義語の言葉と、定義の中にある名詞の関係が強いものを選び出すというアルゴリズムにした。すなわち、同音異義語が定義の中にある最も高い関連性を持つ名詞の、その距離が一番近いものが、一番、世間的にありそうなもので、共感を得やすいだろうということである。この計算をすると、結局補講ではなく、補考がそれだということになる。

で、結局、最後に次のような謎かけになるわけである。

<<謎かけ>> [ ロボット ] とかけて [ 本論を補足する考察 ] とときます そのこころは どちらも [ 歩行 (補考:ほこう) ] がつきものです

講義を選べばもっと面白くなるが、これではあまり面白くない。ただ、講義の定義「補充のための講義」の補充も、講義も、補講との距離がそれほど近くないために選ばれなかった。もし選ばれたら、

<<謎かけ>> [ ロボット ] とかけて [ 補充のための講義 ] とときます そのこころは どちらも [ 歩行 (補講:ほこう) ] がつきものです

こちらも大して面白くないか(笑)

word2vecのベクトルをwikipediaのものばかりになっていて、それが補講が選ばれない理由のような気がする。wikipediaはある意味、フォーマルなものが、関連性が高くなるが、twitterは、より普段に使われることばを踏まえた関連性スコアになる。まあ、その辺りも改良の余地がある。