4/27 研究メモ
この記事について
メモだお。ほとんどの人には役に立たないメモだお。
Word2Vec
Word2Vecとは
単語をベクトル化するモデル。単語の足し算や引き算ができることで有名で、king - man + woman = queen みたいなことができる。
連想ゲームで使うには
似ている単語を挙げていくタスクなんかもできるけど、今回は連想ゲームに使う刺激語に対する連想語を出力したいので、刺激語を上位概念として、連想語を下位概念に置きたい。つまり、刺激語を入力したら、その下位概念がいくつか出力されるようなモデルを構築する必要がある。うおおおお。
WordNetの上位概念と下位概念を切り出せるAPIがあるらしいので、上手くモデル構築できなかったら、そっちに逃げてしまえ。なんか無い。逃げ道はないかもしれない。NNをうまいこと階層化してあげないと、上位・下位概念を切り出せないってことか。
まだよくわかっていないので、とりあえず「Word2Vec 上位概念 下位概念」で出てきた上位6件の論文を読んでみる。飽きたらやめる。
(追記)3件でやめた。
ろんぶん よめたね
常識的知識を含んだ多属性記述に基づく分散表現型辞書の試作
概要
Word2VecなどのNNや機械学習を用いた意味表現の自動獲得が流行っている。だけど、人間が行うような会話文では主語や述語、目的語が頻繁に省略されたり、同じ対象を指す単語でも逐次言い替えて別の単語にしたりする。将来的に口語的なテキストの意味処理を実現するためには、従来の単語間の関係性だけでなく、人間が理解するのと同程度の常識的知識が必要になる。そのため、常識的知識を含んだ辞書を構築してみた。
という内容の論文。単語の意味を複数持たせたり、文脈によって意味が変化したり、そもそも文にないけど類推しないといけなかったり...常識的知識って難しいんだなぁ(日本語弱者の感想)
得られた豆知識
Word2Vecで得られた分散表現において、名詞の精度は高いけど、動詞の精度は低い。動詞には活用があるため、意味の変化の影響が出やすくてブレやすい、らしいぜ。
また、NNを用いた分散表現では全体的に構造を理解する方法が発見されていないらしく、類似度の高い語彙の関係が同義語なのか上位・下位語なのか全体語・部分語なのか、判別するのは容易ではないらしい。Oh My God.
あと、Word2Vecは単語概念の詳細化や高度化などの追加や更新などの処理には適していないらしい。おおおおお。
手法
レイドライズ。人が属性を用意してあげて、その枠組みでベクトル化させるらしい。人と機械のハイブリット。人間でも読める形式に仕上がっていた。
まとめ
やはり、全てを自動化するのは難しいらしい。
参考文献
https://confit.atlas.jp/guide/event-img/jsai2019/2L5-J-9-01/public/pdf?type=in
分散表現を利用したタグ集合の階層化
概要
Webのコンテンツにはタグがよく付けられてるけど、内容を示すタグが付けられているだけで、コンテンツの詳細な関係性が与えられているわけではない。だから、タグが付与されたコンテンツを構造化しよう。
という内容。単純な単語としての階層化ではなく、コンテンツの内容まで加味した階層化。
手法
- Word2Vecなどでタグやタグ集合の分散表現を獲得
- is-a関係から上位下位関係を抽出
- 上位ベクトルー下位ベクトルで差ベクトルを計算
- 下位概念を入力して上位概念を出力するモデルを構築
差ベクトルを利用した上位概念ベクトルの獲得について、様々な手法が試されていた。
- 近傍平均法
- セントロイド法
- 関数学習法
近傍平均法は、周囲の下位タグのベクトルを平均したものを上位語とする手法。セントロイド法は、クラスタとしてまとめたベクトルを使用して、同じ向きのベクトルを上位語とする手法。関数学習法はNNに、入力を下位タグ、出力を上位タグとしてブチ込む手法。
まとめ
自分がやろうとしていることと真逆かつ単純な単語ではないので、関連性は薄いけど、上位下位概念の抽出に近傍平均法とかセントロイド法が使えるのか~って勉強になった。
参考文献
https://www.jstage.jst.go.jp/article/pjsai/JSAI2017/0/JSAI2017_3A23/_pdf
ニューラルネットワーク型概念ネットワークの自動構築
概要
人間のような高度な自然言語の理解には、コンピュータで利用可能とした知識ベースが必要であり、脳の構造を模倣したNNを模した知識ベースの構築が提案されている。しかし、語彙のネットワークであるため、語彙の多義性に対応するには限界がある。そこで、NN型概念辞書の自動構築をしたみた。
という内容。単語と概念、概念と概念の間に結合荷重を有するネットワークを生成するらしい。ただの繋がりではなく、その繋がりの重要性を付与する感じなのかな。
手法
- 共起辞書
- コーパス
共起語の組(1)、句点で区切った文(2)を入力として、小さな概念ネットワークを出力する。これを逐次記録していくことで大きな概念ネットワークを構築していくという流れ。
コーパスを使うものには、Mecabで形態素分析を行い、名詞はそのまま登録、動詞や形容詞は原型のものを登録していく。概念ベクトルの生成は、概念に属する単語ベクトルの平均として表す。複数の概念がある単語に関しては、概念数によってベクトルの各要素を割るらしい。
概念ネットワークの候補選びは、色々やるらしい。本格的に必要になったら深く理解します。あと、結合荷重の最適化も色々。
まとめ
連想関係なので、概念ネットワークの構築も有りかもしれないけど、手間がヤバそう。
参考文献
file:///C:/Users/yuya1/Downloads/01-01_06-KBS-103-20141120-B402.pdf
連想ゲームシステムとテーマについて
単語を入力したら下位語を出力できるWord2Vecがそう簡単に見つからない上に、確立された実装方法もないらしいので、今は確実にできる日本語WordNetを使用するべきかもしれない。検索機能をPythonで作っておけば、後で組み込もうとした時に入れ替えできたりするのかな。
あと、書いてあること以外にも色々見たけど、WordNetのような連想概念辞書の作成を自動化しよう!みたいなテーマが多い印象。Word2Vecを使用して上位概念と下位概念を抽出するテーマが一般的、昨日みたいな部分・材料概念の抽出はかなり珍しいタイプだったらしい。
なんか研究のテーマだけ調べていても飽きるので、ゲーム製作に繋がる部分と並行してやることにした。雑食。とりあえずゲーム製作を実施してみて、そちらの方で研究テーマが見つかるかもしれないから、とりあえずプロト版を作ってみようと思う。
今のところ、研究テーマの候補は
- 連想概念辞書について(Word2Vec)
- 連想と対話文(今までの組み合わせ)
- 連想とBERT(連想概念辞書についてでもいいかも)
- 連想ゲームに関する研究(改善の自動化とか?)
全て連想に関わってくる。モデルはWord2Vec系列かBERT系列になる。内容は今のところ連想概念辞書が多いかな。
PythonでWordNetを遊ぶ
SQLって何
大量のデータを処理する時に使うらしい。
splite3でパッと見た感じ
文字列の中身に処理を書くのか、面白い。
WordNet
247528語も登録されているらしい。以前実装した霊夢botの4倍の語彙力、最強すぎる。(なお霊夢botは実働単語数10000程度の雑魚)
遊んでみた
類義語を出力。
【「うんち」の類似語を出力します】
1つめの概念 : turd
意味1 : 糞便を表すわいせつな言葉
類義語1 : turd
類義語2 : dirt
類義語3 : shit
類義語4 : shite
類義語5 : poop
類義語6 : crap
類義語7 : 屎
類義語8 : 糞
類義語9 : 汚穢
類義語10 : ばば
類義語11 : くそ
類義語12 : 大便
類義語13 : うんこ
明日は
下のやつを読む。読まなくてもええ。
https://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/P5-2.pdf
http://www.ar.media.kyoto-u.ac.jp/mori/research/public/hashimoto-NLP19.pdf
http://must.c.u-tokyo.ac.jp/sigam/sigam13/sigam1303.pdf
あと、下位概念検索機能の実装とWord2Vecを用いたcos類似度の計算の実装。Pythonでね。