お遊びアプリとして
BertとWord2vecを組み合わせて謎かけAIを作ってみた。
どんなアプリ
お題を入れると、謎かけを回答してくれるアプリ
> python .\nazokake.py
Please input odai : 利根川
2022-09-06 22:49:41.121694
「利根川」とかけて「出産」と説く その心は!
どちらも「用水/羊水(ヨウスイ)」がつきものです
2022-09-06 22:49:44.241902
Please input odai : 野球
2022-09-06 22:51:30.649636
「野球」とかけて「システム」と説く その心は!
どちらも「捕手/保守(ホシュ)」がつきものです
2022-09-06 22:51:33.327652
Please input odai : 銀行
2022-09-06 22:52:44.977923
「銀行」とかけて「禁止」と説く その心は!
どちらも「現金/厳禁(ゲンキン)」が欠かせません
2022-09-06 22:52:45.417922
Please input odai :
アルゴリズム
- 何個かの定型文を用意する。
XXXにYYYは必要です
XXXはYYYが課題です
2.定型文のXXX(例:利根川)の部分にお題をいれる。YYYをマスクする。
利根川に[MASK]は必要です
3.上記をBERTを使って、複数の[MASK]の候補リスト(100個ほど)する。
4.上記だけだと、お題と無関係な単語も出てきやすいので、
word2vec.most_similarを使って、候補リストで、お題と関係性の強い単語に
絞り込む
(今回は用水(ようすい)が候補の一つ)
5.上記で絞り込んだ候補リストのうち、同音異義語のDB に該当する単語があるか
求めて、同音異義語の候補リストを求める(今回は羊水(ようすい)が候補の一つ)。
6.候補リストを定型文のYYYにおいてXXXをマスクする。
[MASK]に羊水は必要です
7.上記をさらにBERTを使って、複数の[MASK]の候補リストを求める(100個ほど)。
8.上記だけだと、候補と無関係な単語も出てきやすいので、
word2vec.most_similarを使って、候補と関係性の強い単語に
絞り込む(この場合:出産)
9.上記で複数候補がでてくるので,ランダムに並べ替えて早く答えが出てきたものを
解答する。
同音異義語のDB
こちらのVocabulary Database for Reading Japanese (VDRJ) Ver. 1.1
重要度順語彙データベース (Top 60894) 重要度順位 00001-60894 (42MB)
から作成
http://tatsuma2010.web.fc2.com/VDRJ_Ver1_1_Research_Top60894.xlsx
感謝です。
ソースコード
今後の課題
- 時事問題に弱い。BERTや同音異義語の辞書を改める。
- いくつかの候補の中から、何が最適解かを判断するのが難しい。
- WEBサイトとかで公開したい。でも8GB以上のRAMが必要。ラニングが心配