knaka Tech-Blog

AI, IoT, DIYエレクトロニクス, データサイエンスについて投稿予定です。

doc2vec + janome で、類似文章の評価。 自然言語処理(2)


index:

概要

前回の、word2vec の関連となりますが。
doc2vec + janome で、NLP( 自然言語処理 )
してみたいと思います。
今回は、類似の文章を抽出する例です。

環境

python 3.5.2
janome
gensim

形態素解析

追加がカンタンそうな janome を、使いました。

コード

・学習、モデル保存
train.py
モデル生成(Doc2Vec) の、パラメータは
任意で、変更する必要がありそうです。

#
words1=tokenize("女ははじめて関西線で四日市の方へ行くのだということを三四郎に話した。")
words2=tokenize("例の女はすうと立って三四郎の横を通り越して車室の外へ出て行った。")
words3=tokenize("けれども暑い時分だから町はまだ宵の口のようににぎやかだ。")
print(1, words1 )
print(2, words2 )
print(3, words3 )
#quit()
#
training_docs = []
#quit()
sent1 = TaggedDocument(words=words1 ,  tags=[1])
sent2 = TaggedDocument(words=words2 ,  tags=[2])
sent3 = TaggedDocument(words=words3 ,  tags=[3])

training_docs.append(sent1)
training_docs.append(sent2)
training_docs.append(sent3)
#quit()

model = Doc2Vec(documents=training_docs, dm=1,
                vector_size=300, window=8, min_count=1, workers=4)
#model = Doc2Vec(documents=training_docs, dm=1,
#                size=100, window=8, min_count=1, workers=4)

model.train(training_docs, total_examples=model.corpus_count, epochs=50)
model.save("./book.model")


・評価
モデルのロード、評価

# encoding: utf-8
from gensim.models import word2vec
import numpy as np

model = word2vec.Word2Vec.load("./book.model")
#
def cos_sim(v1, v2):
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

ret2 =cos_sim(model.docvecs[1], model.docvecs[2])
ret3 =cos_sim(model.docvecs[1], model.docvecs[3])
print("1-2:", ret2 )
print("1-3:", ret3 )

・結果

1 ['女', '関西', '線', '四日市', '方', '行く', 'の', 'こと', '三', '四', '郎', '話す']
2 ['例', '女', 'すう', '立つ', '三', '四', '郎', '横', '通り越す', '車', '室', '外', '出る', '行く']
3 ['暑い', '時分', '町', '宵の口', 'よう', 'にぎやか']
1-2: 0.231663
1-3: 0.0584926

=> 3種類の文、読み込み。
1-2の比較、1-3比較、類似度の出力

1-2が、似ているようです。

関連のページ

knaka0209.hatenablog.com


Github

github.com


サンプルのコードです。