※このページではアフィリエイト広告を利用しています

【Python応用】Gensimを用いたベクトル変換-概要-

Python

ここではGensimを用いた形態素解析における、ベクトル変換について解説しています。

スポンサーリンク
スポンサーリンク

Gensimとは

「Gensim」とは「Word2Vec」を利用できるライブラリになります。

「Word2Vec」は単語の意味をベクトルで表現するツールになります。関連単語の抽出、類似度の算出ができる便利なツールです。

Gensimのインストール

Gensimを用いる前にライブラリをインストールしておく必要があります。

pipでインストールします。

$ pip install gensim

Gensimを用いた使用例

以下のプログラムではGensimを用いた使用例として、青空文庫の「黙々静観」を解析しているものになります。以下のプログラムでWord2Vecでモデルを作成した後に、類義語を抽出しています。

from janome.tokenizer import Tokenizer
from gensim.models import word2vec
import re

#1---ファイル読み込み
bindata = open('mokumokuseikan.txt', 'rb').read()
text = bindata.decode('shift_jis')

#2---先頭にあるヘッダとフッタを削除
text = re.split(r'\-{5,}',text)[2]
text = re.split(r'底本:', text)[0]
text = text.strip()

#3---形態素解析
t = Tokenizer()
results = []
#4---一行ずつの処理
lines = text.split("\r\n")
for line in lines:
    s = line
    s = s.replace('|', '')
    s = re.sub(r'《.+?》', '', s) 
    s = re.sub(r'[#.+?]', '', s) 
    tokens = t.tokenize(s) 
    r = []
    for tok in tokens:
        if tok.base_form == "*": 
            w = tok.surface
        else:
            w = tok.base_form
        ps = tok.part_of_speech 
        word_h = ps.split(',')[0]
        if word_h in ['名詞', '形容詞', '動詞', '記号']:
            r.append(w)
    rl = (" ".join(r)).strip()
    results.append(rl)

#5---書き込み先を開く
wakati_file = 'mokumokuseikan.wakati'
with open(wakati_file, 'w', encoding='utf-8') as fp:
    fp.write("\n".join(results))

#6---Word2Vecでモデルを作成
data = word2vec.LineSentence(wakati_file)
model = word2vec.Word2Vec(data, 
size=200, window=10, hs=1, min_count=2, sg=1)
model.save('mokumokuseikan.model')

それでは解説していきます。

#1---ファイル読み込み
mokumoku_data = open('mokumokuseikan.txt', 'rb').read()
text = mokumoku_data.decode('shift_jis')

1の部分では、テキストファイルを読み込んでいます。

#2---先頭にあるヘッダとフッタを削除
text = re.split(r'\-{5,}',text)[2]
text = re.split(r'底本:', text)[0]
text = text.strip()

2の部分では、テキストファイルの整形を行っています。不要なヘッダとフッタを削除しています。

#3---形態素解析
t = Tokenizer()
results = []

3の部分では、janomeを呼び出しています。その下にはfor構文で使用するリストを生成しています。

#4---一行ずつの処理
lines = text.split("\r\n")
for line in lines:
    s = line
    s = s.replace('|', '')
    s = re.sub(r'《.+?》', '', s) 
    s = re.sub(r'[#.+?]', '', s) 
    tokens = t.tokenize(s) 
    r = []
    for tok in tokens:
        if tok.base_form == "*": 
            w = tok.surface
        else:
            w = tok.base_form
        ps = tok.part_of_speech 
        word_h = ps.split(',')[0]
        if word_h in ['名詞', '形容詞', '動詞', '記号']:
            r.append(w)
    rl = (" ".join(r)).strip()
    results.append(rl)

4の部分では、一行ずつ処理しています。最初に分割し、その分割したものの中からルビ(re.sub(r’《.+?》’, ”, s))と入力注(re.sub(r’[#.+?]’, ”, s))を削除しています。その下(t.tokenize(s))で形態素解析を行っています。

r=[]以降の行では、活用の基本系(“*”)を用いて、「名詞」「形容詞」「動詞」「記号」意外の単語を除外しています。

#5---書き込み先を開く
wakati_file = 'mokumokuseikan.wakati'
with open(wakati_file, 'w', encoding='utf-8') as fp:
    fp.write("\n".join(results))

5の部分では、4で行ったこと結果の書き込み先を指定しています。

#6---Word2Vecでモデルを作成
data = word2vec.LineSentence(wakati_file)
model = word2vec.Word2Vec(data, 
size=200, window=10, hs=1, min_count=2, sg=1)
model.save('mokumokuseikan.model')

最後に6の部分では、Word2Vecでモデルを作成しています。

これでモデルが完成しました。

以下は、「大臣」の類義語を抽出した結果です。

from gensim.models import word2vec
model = word2vec.Word2Vec.load('kokoro.model')
model.most_similar(positive=['大臣'])
#[('もの', 0.9746307730674744),
# ('、', 0.9739990234375),
# ('右筆', 0.973025918006897),
# ('これ', 0.9726450443267822),
# ('いふ', 0.9723975658416748),
# ('事', 0.9722230434417725),
# ('孔子', 0.9719905853271484),
# ('時', 0.9719443917274475),
# ('。', 0.9719370603561401),
# ('なる', 0.9709278345108032)]

結果を見ると孔子が出てくるなど何となく、政治について書かれているのかなと、分からなくもないですね。

ちなみに本文は政治に関する内容になっています。お時間ある方は読んでみて下さい「黙々静観」。

その他、Gensimを用いた使用例

項目内容
Under construction . . .Under construction . . .
タイトルとURLをコピーしました