Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

word2vecにより単語をベクトル化し類似語検索をする

word2vecは文章中の単語をベクトル化する技術で、関連する単語の抽出や単語同士の類似度を調べたり単語の線形計算ができるようになります。ベクトル化処理をするためには単語の区切りを示す必要があるため、先に文章を分かち書きします。手順は以下の通りです。

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • beautifulsoup4 4.6.3
  • Janome 0.3.8
  • gensim 3.7.2
使った関数・メソッド
  • requests.get() : Responseオブジェクトの取得
  • BeautifulSoup() : BeautifulSoupオブジェクトの取得
  • Tokenizer.tokenize() : 形態素解析
  • word2vec.LineSentence() : コーパスの作成
  • word2vec.Word2Vec() : テキストのベクトル化
  • model.wv.most_similar() : 類似語の検出
コード (モデルの保存まで)

首相官邸ウエブサイト掲載の「平成31年1月28日 第百九十八回国会における安倍内閣総理大臣施政方針演説」を分析します。

from bs4 import BeautifulSoup as bs #BeautifulSoupのインポート
import requests #requestsのインポート
from janome.tokenizer import Tokenizer   # Tokenizerのインポート  
from gensim.models import word2vec   # word2vecのインポート

url = 'https://www.kantei.go.jp/jp/98_abe/statement2/20190128siseihousin.html'  # urlの指定 
rs = requests.get(url)  # Responseオブジェクトの取得 
rs.encoding = rs.apparent_encoding  # 取得したオブジェクトの文字コードを文字コードに設定 
soup = bs(rs.text, 'html.parser')  # BeautifulSoupオブジェクトの取得
 
selected_tag = soup.select('p')  # オブジェクトからタグ<p>のみ選択

# 2つ目以降の<p>タグのテキストのみをselected_textsに代入
selected_texts = '' 
for i in selected_tag[1:]:  
    selected_text = i.text
    selected_texts += selected_text
    
wakati = ''
t = Tokenizer() 
for token in t.tokenize(selected_texts):  # 形態素解析
    hinshi = (token.part_of_speech).split(',')[0]  # 品詞情報を取得
    hinshi_2 = (token.part_of_speech).split(',')[1]  # 品詞情報の2項目目を取得
    if hinshi in ['名詞','動詞','形容詞','記号']:  # 品詞が名詞、動詞、形容詞、記号の場合のみ以下実行
        if not hinshi_2 in ['空白','*']:  # 品詞情報の2項目目が空白か*の場合は以下実行しない
            word = str(token).split()[0]  # 単語を取得
            if not ',*,' in word:  # 単語に*が含まれない場合は以下実行
                wakati = wakati + word +' ' # オブジェクトwakatiに単語とスペースを追加 

# 分かち書きしたデータをファイルに保存
with open('word2vec_test/wakati.txt',mode='w',encoding = 'utf-8') as f:
    f.write(wakati)  

sentences = word2vec.LineSentence('word2vec_test/wakati.txt')  # 分かち書きしたテキストデータからコーパスを作成
# ベクトル化
model = word2vec.Word2Vec(sentences,
                          sg = 1,  # Skip-Gram Modelを使用 
                          size = 100, # ベクトルの次元数
                          min_count = 2,  # 単語の出現回数によるフィルタリング
                          window = 30,  # 対象単語からの学習範囲
                          hs = 1)  # 階層化ソフトマックスを使用   
model.save('word2vec_test/save.model') # 作成したモデルをファイルに保存
実行結果

wakati.txtには次のように助詞を除いて、分かち書き(単語がスペースで区切られた形)された元文書が保存されます。

一 はじめ 平成 最後 施政 方針 演説 、 ここ 申し述べ 。 本年 四月 三 十 日 、 天皇陛下 退位 さ れ 、 皇太子 殿下 五月 一 日 即位 さ れ 。 国民 寿 ( こと ほ ) ぐことができるよう 、 万全 準備 進め まいり 。 「 平らか 外 成る 、 地 平らか 天 成る 」 自然 災害 相次い 平成 時代 。 被災 地 現場 、 天皇 、 皇后 陛下 姿 あり 。 阪神 ・ 淡路 大震災 全焼 し 神戸 市 長田 商店 街 、 皇后 陛下 焼け跡 献花 さ れ 水仙 、 復興 シンボル 、 今 、 地域 人々 記憶 刻ま れ い 。 商店 街 皆さん 、 復興 強い 決意 、 震災 後 仮設 店舗 営業 再開 。 全国 集まっ 延べ 二 百 万 人 超える ボランティア 復興 力 なり 。 水仙 置か れ 場所 今 、 公園 生まれ変わり 、 子ども たち 笑顔 あふれ い 。 東日本 大震災 直 ・・・・・・

また、ベクトル化したモデルファイル save.modelが保存されます。このモデルファイルを用いると類似語抽出ができます。


.most_similarメソッドにより類似語抽出します。「日本」、「東北」、「経済」、「平成」について類似語抽出します。

コード (類似語抽出)
from gensim.models import word2vec

model = word2vec.Word2Vec.load('word2vec_test/save.model')
results = model.wv.most_similar(positive=['日本'])
for result in results:
    print(result)
実行結果 「日本」の類似語抽出
('絆', 0.9714562892913818)
('きずな', 0.9677563905715942)
('米', 0.9606870412826538)
('深い', 0.9474159479141235)
('同盟', 0.9421813488006592)
('まいり', 0.934048593044281)
('さ', 0.9336345791816711)
('戻り', 0.9303835034370422)
('今', 0.9286391735076904)
('、', 0.9271832704544067)

実行結果 「東北」の類似語抽出
('復興', 0.9791179895401001)
('大震災', 0.971756100654602)
('東日本', 0.9662585258483887)
('福島', 0.9638371467590332)
('なし', 0.9609254598617554)
('地元', 0.9499247074127197)
('水仙', 0.9442213177680969)
('被害', 0.935907244682312)
('津波', 0.9305875301361084)
('被災', 0.9188611507415771)
実行結果 「経済」の類似語抽出
('協定', 0.9780798554420471)
('発効', 0.9604469537734985)
('連携', 0.9599527716636658)
('ルール', 0.9585147500038147)
('公正', 0.9438074827194214)
('引下げ', 0.9432494640350342)
('透明', 0.9396299719810486)
('欧州', 0.9373270273208618)
('財産', 0.931519091129303)
('国境', 0.9250264167785645)
実行結果 「平成」の類似語抽出
('向かっ', 0.9647971391677856)
('歴史', 0.961244523525238)
('「', 0.9597587585449219)
('切り', 0.9564018249511719)
('明日', 0.9531804323196411)
('上げ', 0.951911449432373)
('示し', 0.950386106967926)
('躍動', 0.9503416419029236)
('時代', 0.9469577074050903)
('いこ', 0.9453614950180054)

以下のサイトを参考にさせていただきました

gensim >> models.word2vec – Word2vec embeddings
【Python】Word2Vecの使い方
15分でできる日本語Word2Vec
Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村