word2vecでコパアメリカ 日本vsチリ戦の敗因を分析する
word2vecでコパアメリカ 日本vsチリ戦の敗因を分析します。word2vecは文章中の単語をベクトル化する技術で、関連する単語の抽出や単語同士の類似度を調べたり単語の線形計算ができるようになります。ベクトル化処理をするためには単語の区切りを示す必要があるため、先に文章を分かち書きします。手順は以下の通りです。
- 形態素解析ライブラリJanomeで形態素解析、分かち書き
- 自然言語処理ライブラリgensimでword2vecを実行しモデルファイルを作成、
- 自然言語処理ライブラリgensimでword2vecを実行し類似単語の抽出
関連記事
環境
準備
コパアメリカ 日本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)