TensorFlow Word2Vec で「源氏物語」解析
TensorFlow Word2Vec による日本語テキスト解析
自然言語処理の基本と言える Word2Vec については TensorFlow のチュートリアル 単語のベクトル表現 / Word2Vec がありますが、まだ日本語テキストで試していなかったので青空文庫の源氏物語(訳: 與謝野晶子)を題材に解析してみました。桐壺から夢浮橋の帖までの全テキストを使用しています。
Wikipedia によれば …
『源氏物語』は平安時代中期に成立した日本の長編物語、小説である。文献初出は1008年(寛弘五年)でこの頃には相当な部分までが成立していたと思われる。
母系制が色濃い平安朝中期(概ね10世紀頃)を舞台に、天皇の親王として出生し、才能・容姿ともにめぐまれながら臣籍降下して源氏姓となった光源氏の栄華と苦悩の人生、およびその子孫らの人生を描く。通説とされる三部構成説に基づくと、各部のメインテーマは以下とされ、長篇恋愛小説としてすきのない首尾を整えている。
- 第一部:光源氏が数多の恋愛遍歴を繰り広げつつ、王朝人として最高の栄誉を極める前半生
- 第二部:愛情生活の破綻による無常を覚り、やがて出家を志すその後半生と、源氏をとりまく子女の恋愛模様
- 第三部:源氏没後の子孫たちの恋と人生
日本語テキストを Word2Vec に持ち込む場合には形態素解析がつきまといます。今回は自然言語処理ツールキットの定番 NLTK をベースに改良しましたが、MeCab なども試すべきかもしれません。
取りあえず、源氏物語のテキストを形態素解析してトークン化してリストを入力として、Word2Vec の基本実装 word2vec_basic.py を実行してみました。視覚化されたグラフが以下です(画像はクリックして拡大できます)。官職名の距離が近いことなどが見て取れます。 :
Word2Vec で Cos 距離
視覚化だけでなく単語間の具体的な cos (コサイン)距離を測るために、元祖 Word2Vec を利用しました。
以下はその例で「光源氏」「無常」「嫉妬」「寵愛」それぞれの単語と距離が近い単語を pick up しています :
|
| |
|
| |
光源氏がどのような人物像として描かれているか一目瞭然ですし、無常・嫉妬・寵愛のような固有名詞でない単語の場合でも性質が良く表れています。
結論として、日本語テキストの場合でも Word2Vec は機能するようです。
補記
word2vec_basic.py の embedding 層のサイズと window サイズをそれぞれ 512, 2 に変更して得られた画像は以下になります。注意深く観察すれば改良されていることが分かりますが、二次元画像に射影すると分かりにくいかもしれません :
以上