自然言語処理

【2020年版】言語処理100本ノック 第7章を解いてみた

第7章: 単語ベクトル

今回は2020年版の言語処理100本ノック 第7章を解いていきます

単語の意味を実ベクトルで表現する単語ベクトル(単語埋め込み)に関して,以下の処理を行うプログラムを作成せよ.

60. 単語ベクトルの読み込みと表示

Google Newsデータセット(約1,000億単語)での学習済み単語ベクトル(300万単語・フレーズ,300次元)をダウンロードし,”United States”の単語ベクトルを表示せよ.ただし,”United States”は内部的には”United_States”と表現されていることに注意せよ

ほとんどの人はgensimをインストールしていないと思うので、まずはここから

データセットを整形していきます

<出力>

61. 単語の類似度

“United States”と”U.S.”のコサイン類似度を計算せよ

<出力>

62. 類似度の高い単語10件

“United States”とコサイン類似度が高い10語と,その類似度を出力せよ.

most_similarを使っていきます

63. 加法構成性によるアナロジー

“Spain”の単語ベクトルから”Madrid”のベクトルを引き,”Athens”のベクトルを足したベクトルを計算し,そのベクトルと類似度の高い10語とその類似度を出力せよ.

先ほどと同じようにmost_similarを使います。

positiveで足す部分を、negativeで引く部分を指定できます

64. アナロジーデータでの実験

単語アナロジーの評価データをダウンロードし,vec(2列目の単語) – vec(1列目の単語) + vec(3列目の単語)を計算し,そのベクトルと類似度が最も高い単語と,その類似度を求めよ.求めた単語と類似度は,各事例の末尾に追記せよ.

これはめちゃくちゃ時間がかかるので注意しましょう。あとパソコンが熱くなります。

tqdmを使うことで処理の進行度が分かるようになります。

65. アナロジータスクでの正解率

64の実行結果を用い,意味的アナロジー(semantic analogy)と文法的アナロジー(syntactic analogy)の正解率を測定せよ.

カテゴリがgramから始まるものを文法的アナロジーの計算用として、gramから始まらないものを意味的アナロジーの計算用として使うことにします。

66. WordSimilarity-353での評価

The WordSimilarity-353 Test Collectionの評価データをダウンロードし,単語ベクトルにより計算される類似度のランキングと,人間の類似度判定のランキングの間のスピアマン相関係数を計算せよ.

この時点での出力はこんな感じになります。

Word1 Word2 Human(mean) Similarity(Vec)
0 love sex 6.77 0.263938
1 tiger cat 7.35 0.517296
2 tiger tiger 10.00 1.000000
3 book paper 7.46 0.363463
4 computer keyboard 7.62 0.396392
5 computer internet 7.58 0.406862
6 plane car 5.77 0.377970
7 train car 6.31 0.340256
8 telephone communication 7.50 0.332184
9 television radio 6.77 0.611497
10 media radio 7.42 0.389916
11 drug abuse 6.85 0.240858
12 bread butter 6.19 0.641726
13 cucumber potato 5.92 0.567856
14 doctor nurse 7.00 0.631952

それでは相関係数を計算していきます。

67. k-meansクラスタリング

国名に関する単語ベクトルを抽出し,k-meansクラスタリングをクラスタ数k=5として実行せよ

重複を避けるためにリストではなくセットを使っています。

<出力>

k=7でも分類してみます。

<出力>

68. Ward法によるクラスタリング

国名に関する単語ベクトルに対し,Ward法による階層型クラスタリングを実行せよ.さらに,クラスタリング結果をデンドログラムとして可視化せよ

めんどくさいのでscipyで一瞬で終わらせます。

いい感じですね。

69. t-SNEによる可視化

国名に関する単語ベクトルのベクトル空間をt-SNEで可視化せよ.