こんにちは。
いつもの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)
参考サイト様
おわりに
こちらも結構簡単に出せますね。
チューニングするとどんどん精度が上がりそうです。
またもう少し遊んでみたらご報告として続きを書きます。
それでは、また次回!