Pythonでいろいろやってみる

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

word2vecでコパアメリカ 日本vsチリ戦の敗因を分析する

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

関連記事

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

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • Janome 0.3.8
  • gensim 3.7.2
準備

コパアメリカ 日本vsチリ戦を報じた記事を10件ほどメモ帳にコピーし、ファイル名'Japan_Chile.txt'で、jupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。

コード
from janome.tokenizer import Tokenizer   # Tokenizerのインポート  
from gensim.models import word2vec   # word2vecのインポート

# テキストファイルの読み込み
with open('Japan_Chile.txt',mode='r',encoding = 'utf-8-sig') as f:
    text = f.read()

# 分かち書き
wakati = ''
t = Tokenizer() 
for token in t.tokenize(text):  # 形態素解析
    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('Japan_Chile_wakati.txt',mode='w',encoding = 'utf-8') as f:
    f.write(wakati)      

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

ここまででベクトル化されたモデルファイルが保存されます。

実行結果

モデルファイルより単語の線形計算をします。「チリ」-「日本」、つまり「チリ」に関連が高く、「日本」に関連の低い単語を示します。

from gensim.models import word2vec

model = word2vec.Word2Vec.load('Japan_Chile_save.model')
results = model.wv.most_similar(positive=['チリ'], negative=['日本'])
for result in results:
    print(result)

監督が一番に挙がっています。

('監督', 0.5896586179733276)
('現地', 0.5544111728668213)
('17', 0.5540474653244019)
('対戦', 0.550078809261322)
('南米', 0.5172796845436096)
('選手権', 0.5150519609451294)
('一', 0.5119668841362)
('森保', 0.504438042640686)
('王者', 0.5023344159126282)
('代表', 0.49357718229293823)

続いて「日本」-「勝利」、つまり「日本」に関連が高く、「勝利」に関連の低い単語を示します。

from gensim.models import word2vec

model = word2vec.Word2Vec.load('Japan_Chile_save.model')
results = model.wv.most_similar(positive=['日本'], negative=['勝利'])
for result in results:
    print(result)

パスやシュートが足りなかったということでしょうか。

('パス', 0.5247867107391357)
('左', 0.48910748958587646)
('右', 0.4881371259689331)
('シュート', 0.4850040376186371)
('GK', 0.4818071722984314)
('多く', 0.47601693868637085)
('展開', 0.4720226526260376)
('%', 0.4632538855075836)
('攻め', 0.4627285599708557)
('サイド', 0.4537152647972107)

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

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