遅ればせながら、Doc2Vecで遊んで見る

こんにちは。
いつものtaanatsuです。

今回はDoc2Vecで遊んでみます。
前回に引き続き、なぜかこれもちゃんと触ったことがないのでやっていきましょう。

それでは、やっていきましょうか。

前準備

venv

恒例のやつです。

$ python3 -m venv venv
$ source venv/bin/activate

必要ライブラリ

mecabを事前にお使いのPCにインストールを済ませておいてください。

$ pip install gensim
$ pip install BeautifulSoup4
$ pip install mecab-python3 

前処理

日本語は形態素解析(文章を「名詞」「動詞」「形容詞」のように形態素に分解すること)を行い、
単語の意味のある最小の単位に分解します。

後、HTMLなども消し去ります。

「raw_data.csv」に文章を1行で入れておいてください。

文章1
文章2
文章3
...
文章N

これを整形し、「wakachi.txt」というファイルに書き出します。

import csv
from bs4 import BeautifulSoup
import MeCab

wakachiTagger = MeCab.Tagger('-Owakati')

with open('wakachi.txt', 'w') as wCsvFile:
    with open('raw_data.csv', newline='') as csvfile:
        reader = csv.reader(csvfile)
        for row in reader:
            text = BeautifulSoup(row[0]).text.replace('\n', '')
            wakachi = wakachiTagger.parse(text).replace('\n', '')

            writer = csv.writer(wCsvFile)
            writer.writerow([wakachi])

学習

「前処理」で作成した「wakachi.txt」を利用します。
wakachi.txtをベースに「doc2vec.model」を作成します。

from gensim.models.doc2vec import Doc2Vec, TaggedDocument

with open('wakachi.txt', 'r') as file:
    sentences = file.readlines()

documents = [TaggedDocument(doc, [doc]) for i, doc in enumerate(sentences)]
model = Doc2Vec(documents, vector_size=500, alpha=0.0015, window=5, min_count=1, workers=4, sample=1e-4)

model.save('doc2vec.model')

予測1:Model内のテキスト同士で比較

「doc2vec.model」を読み込み、文章間の類似度を出力します。 これはwakachi.txt内の文章同士を比較しています。

from gensim.models.doc2vec import Doc2Vec, TaggedDocument

model = Doc2Vec.load('doc2vec.model')

print(model.dv.most_similar(0))

予測2:外部文章とModel内部の文章の類似度

「新ゲームリリース」という文章に関連のありそうな文章を抽出してみます。

まずは、「新ゲームリリース」という文章を分かち書きに変換します。 「新ゲームリリース」 -> 「新 ゲーム リリース」

その状態でsimple_preprocessメソッドに入れてあげます。

from gensim.models.doc2vec import Doc2Vec, TaggedDocument
from gensim.utils import simple_preprocess

model = Doc2Vec.load('doc2vec.model')

vector = model.infer_vector(simple_preprocess("新 ゲーム リリース"))

result = model.dv.most_similar(vector)
print(result)

参考サイト様

おわりに

こちらも結構簡単に出せますね。
チューニングするとどんどん精度が上がりそうです。
またもう少し遊んでみたらご報告として続きを書きます。

それでは、また次回!