言語処理100本ノック 2015の96本目「国名に関するベクトルの抽出」の記録です。
ノック90本目で保存したGensim版の単語ベクトルから国名に関するものだけを抽出します。技術的には簡単ですが、国名に関する部分が少し面倒です。
参考リンク
リンク | 備考 |
---|---|
096.国名に関するベクトルの抽出.ipynb | 回答プログラムのGitHubリンク |
素人の言語処理100本ノック:96 | 言語処理100本ノックで常にお世話になっています |
環境
種類 | バージョン | 内容 |
---|---|---|
OS | Ubuntu18.04.01 LTS | 仮想で動かしています |
pyenv | 1.2.15 | 複数Python環境を使うことがあるのでpyenv使っています |
Python | 3.6.9 | pyenv上でpython3.6.9を使っています 3.7や3.8系を使っていないことに深い理由はありません パッケージはvenvを使って管理しています |
上記環境で、以下のPython追加パッケージを使っています。通常のpipでインストールするだけです。
種類 | バージョン |
---|---|
gensim | 3.8.1 |
numpy | 1.17.4 |
pandas | 0.25.3 |
課題
第10章: ベクトル空間法 (II)
第10章では,前章に引き続き単語ベクトルの学習に取り組む.
96. 国名に関するベクトルの抽出
word2vecの学習結果から,国名に関するベクトルのみを抜き出せ.
課題補足(国名に関して)
「言語処理100本ノック-81(一括置換):複合語からなる国名への対処」で使った国名ファイルを使おうと考えたのですが、そのファイルには1単語の国名("England"など)がありません。ステップ「4. 単一名削除」で消してしまったからです。
もう一度、ステップ「4. 単一名削除」で削除した国名を追加して使いました。
回答
回答プログラム 096.国名に関するベクトルの抽出.ipynb
import numpy as np
import pandas as pd
from gensim.models import Word2Vec
model = Word2Vec.load('./090.word2vec.model')
print(model)
index = []
vector = []
with open('./096.countries.txt') as file_in:
for line in file_in:
country = line.rstrip().replace(' ', '_')
try:
vector.append(model.wv[country].tolist())
index.append(country)
except KeyError:
pass
pd.DataFrame(vector, index=index).to_pickle('096.country_vector.zip')
回答解説
ファイルを1行ずつ読んで、国名のベクトルを取得しリストに追加しています。スペースをアンダーバーに置換しているのは「言語処理100本ノック-81(一括置換):複合語からなる国名への対処」で同じことをやったからです。
中にはコーパスに含まれていないものや出現回数が少なく除外したものもあるので、except KeyError
でエラー捕捉しています。
for line in file_in:
country = line.rstrip().replace(' ', '_')
try:
vector.append(model.wv[country].tolist())
index.append(country)
except KeyError:
pass
あとはDataFrameに国名をインデックスとして入れてあげてファイル出力です。238ヶ国が出力されます。元ファイルには416ヶ国だったので6割弱の単語ベクトルが存在しています。
pd.DataFrame(vector, index=index).to_pickle('096.country_vector.zip')