Colab環境と自作日本語コーパスでWord2Vecを試したい
##やること
前回記事 青空文庫からテキストをダウンロードしてプレーンにする の続きです。
自分で準備したテキストをコーパスとし、Word2Vecで小規模ながら機械学習を行います。
前回記事ではプレーンなテキストを準備するところまで行いました。
変数dataにプレーンなテキストが入っていることを前提に進めます。
##環境
- Colaboratory環境
- ブラウザはChrome推奨
- 前回記事が実行済みで、colab上の変数dataにテキストが入っている状態。
##やり方
###テキストデータから余分なものを取り除く
import re
text = data.replace('、','')
text = text.replace('「','')
text = text.replace('」','')
句点(、)や括弧を削除します。読点(。)は次に使うのでそのままにします。
###Word2Vecで学習できる形に精製していく
テキストをWord2Vecで学習できるようにするには、
① センテンスごとにLISTに格納されている
② そのセンテンスの内容も形態素解析され、LISTとして格納されている
という二次元のリストになっている必要があります。
形態素解析というのは簡単にいえば単語ごとに区切る作業です。
###センテンスごとに区切ってリストに格納する
text = text.split('。')
まず、テキストを。でsplitすることで、センテンス単位でリスト化していきます。
###MeCabを導入する
! pip install mecab-python3 unidic-lite
センテンスを形態素解析するために、MeCabを導入します。 (2021.04.24更新)
MeCabの使い方については、「Colab環境でMeCabを使う」でも説明しています。
###形態素解析してリストに入れ子リストで格納していく
import MeCab #形態素解析ライブラリMeCabを導入する
tagger = MeCab.Tagger("-Owakati") #分かち書き用の関数を設定
j=0 #リスト番号を数えるための変数
for i in text: #textをリストの長さだけ処理していく
i = tagger.parse(i) #リストi番目のセンテンスを処理
i2 = i.split(" ") #i番目のセンテンスを処理してi2とする
del i2[-1] #単語リストの最後に改行が入るので削除しておく
text[j]= i2 #リストj番目(=i番目)のデータを処理済みのものと差し替える
j +=1 #リスト番号を数えるための変数を更新
リストに格納されたセンテンスをデータとして読み込み、
それをMeCabで形態素解析した上でリストに変換してから戻します。(2021.04.24更新)
イメージ的には、
['センテンス', 'センテンス', 'センテンス',]
という1次元のリストを
[['単語', '単語', '単語'], ['単語', '単語', '単語'], ['単語', '単語', '単語']]
という2次元のリストにしています。
この入れ子化の作業をしておかないと、学習させたときに1文字1文字が単語とみなされてしまいうまくいきません。
###gensimをインストールする
Word2Vecなどが使えるgensimライブラリをインストールします。
! pip install gensim
###機械学習を行う
import gensim
model = gensim.models.Word2Vec(text, size=100,min_count=1,window=5,iter=100)
gensimを導入し、準備したデータを使って学習を行います。
gensimの簡単な説明については、同じシリーズの
word2vecをColab環境で使う。5行で使う。 でも解説しています。
上記を実行するだけで機械学習は完了です。データがとても小さいので計算も一瞬で終わります。
早速試してみましょう。
###単語の類似度を見る
model.wv.most_similar("濁流")
[('氾濫', 0.9948636293411255),
('荒れ狂う', 0.9944183826446533),
('滔々', 0.9943510890007019),
('華やか', 0.994020938873291),
('ますます', 0.9937014579772949),
('激しく', 0.9936937093734741),
('こめ', 0.9935926795005798),
('せせら笑う', 0.9934155941009521),
('相手', 0.9933393597602844),
('乱れ', 0.993290364742279)]
「濁流」という単語に近いのは、「下流」と出ました。
コーパスが小さすぎるのであまり意味はなさないかもしれません。やんぬるかな。
###このあとやること
精度を上げていくためには文章サイズを大きくしていくことはもちろん、
助詞や動詞などを削除して対象を名詞だけに絞るなどの下準備や工夫も必要になります。
doc2vec, LSTM、seq2seqなどにも進みたくなりますが、あわてず理解を進めていきましょう。
前回記事:青空文庫からテキストをダウンロードしてプレーンにする
前々回記事:Colab環境でMeCabを使う3行
前々々回記事:word2vecをColab環境で使うための5行
##参考