doc2vec + janome で、類似文章の評価。 自然言語処理(2)
index:
コード
・学習、モデル保存
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が、似ているようです。