言語処理100本ノック 2015の第10章: ベクトル空間法 (II)の10問です。
第10章では,前章に引き続き単語ベクトルの学習に取り組む.
90. word2vecによる学習
81で作成したコーパスに対してword2vecを適用し,単語ベクトルを学習せよ.さらに,学習した単語ベクトルの形式を変換し,86-89のプログラムを動かせ.
まずは、word2vecで単語ベクトルを学習します。問題文のリンクはシェルスクリプトなのとSVNがリンク切れしているようなので、Githubのコピー版を使いました。 第9章に合わせて引数を指定しています(default値と同じものもありますが、合わせてる意図を込めて明示的に記載しています)。
❯ ./word2vec -train <PATH_TO>/q81.out.txt -output ./trained_model.txt -size 300 -window 5 -negative 5
gist3119b38c63d0bd410eda14984c5d84f7
❯ go run q90.go ------------------------------ 86. 単語ベクトルの表示 United_States [1.823542 0.998212 0.151048 -0.756645 1.062619 1.191252 -1.759574 0.093121 -0.225518 -0.293923 -0.021835 -0.36047 0.672428 -0.316323 0.304076 0.622363 -0.327869 0.557787 0.303997 -0.940469 -0.303781 0.679504 -0.780764 0.235443 0.232059 0.787089 -0.503982 -0.413358 -0.577007 -1.864737 0.285715 0.063075 -0.653608 -0.666802 -0.401068 -0.225341 -0.076025 0.597728 -0.323169 1.686404 0.298269 0.329775 -1.483898 -0.060094 0.38326 -1.090787 -0.401468 0.584051 0.483002 0.289693 -1.364987 1.05808 1.084504 0.758496 -0.700064 0.921075 -0.389838 0.557126 -0.623444 0.545065 -1.866777 -1.540459 1.311491 1.252319 0.584708 -0.154731 1.178817 0.145006 -1.706097 -1.087952 -0.094799 -0.308998 -0.412141 0.747653 2.131562 0.277976 0.198845 1.520575 -0.453697 -0.340365 0.949026 -0.940041 0.362253 0.049247 0.16048 -0.014336 -1.221997 -0.341103 -1.099968 -0.17678 -1.028104 1.222829 -0.116968 -0.874536 -1.352752 -0.337586 0.153726 0.579554 1.410893 0.468515 -1.762948 0.614649 -0.508029 1.843732 2.288618 0.165021 -0.006009 -1.207882 -1.004512 0.660928 0.515029 0.591341 0.323199 1.665782 -1.4572 0.073172 -0.635124 -1.256417 1.200009 0.773504 0.258664 0.897132 -0.431907 0.014102 -0.112152 -0.070823 0.695606 -1.465958 -0.108996 -0.74142 0.804069 0.519639 0.821394 -1.453141 0.468004 1.578241 -0.163182 0.910499 0.310518 0.19384 -1.736236 -0.587345 0.305146 -0.955576 -1.035768 0.599607 -0.326483 -0.009862 -1.529698 -0.566457 0.233704 0.179851 -0.4688 -0.276734 0.579735 0.494316 -1.086717 -0.186733 -0.430683 0.061927 0.117999 -0.238442 1.233732 -0.431326 0.158956 1.685206 0.689615 1.619143 -0.512952 -1.22104 0.772325 -0.222188 -1.231234 0.127665 0.533659 2.21996 -0.220213 1.019247 -0.677278 -0.2214 -0.357192 1.181603 -1.539749 0.452797 1.653844 0.00879 0.271083 0.091245 -0.554843 -0.198385 -0.695354 -0.549476 -0.176233 0.779347 0.180929 0.028113 -0.33744 -1.248068 -1.201352 1.12126 0.239276 -0.086537 -0.847377 1.124556 -0.540444 1.216385 0.264993 -1.182609 -0.306502 0.783623 0.056023 -0.558314 0.707812 -0.169515 0.096631 0.444101 1.047364 -0.872509 -0.020277 1.113677 -1.054098 -2.080168 -2.928403 0.592833 -0.539894 0.34649 -2.267012 -0.184786 -0.975977 -0.045709 -0.022163 -0.288505 1.045948 -0.659885 -0.128221 -1.098224 -1.027867 0.375439 -0.435416 -1.238411 2.494976 0.797522 -0.704402 0.91279 -1.0877 -0.417203 -1.122003 0.06181 -1.862646 0.039802 0.147812 0.598384 0.06901 0.504204 0.778565 1.255542 -0.272787 1.952137 0.68609 1.174417 -0.386691 -0.239997 -0.05854 0.032976 -1.42854 0.638762 0.967045 0.75671 -0.599432 0.962889 -1.163935 0.57435 -1.434526 -0.838759 -0.423522 1.184661 0.49942 0.541755 -0.663361 -0.103821 0.315 0.847865 0.156598 1.353468 -0.383525 0.892902 0.247807 0.091043 0.789759 0.365569 -0.163217 1.9303 -1.300313 -1.616886 -1.752266 0.6924 -0.864655 -2.085828 1.231503 -0.501419] ------------------------------ 87. 単語の類似度 United_Stetes v.s. U.S. 0.7745992551063425 ------------------------------ 88. 類似度の高い単語10件 1 England : 1 2 Wales : 0.6799484101924722 3 Scotland : 0.6601875749325679 4 Ireland : 0.576445075380364 5 Britain : 0.5294550459380852 6 Hampshire : 0.5080241507481739 7 Somerset : 0.5048523334327183 8 Lancashire : 0.4975930638881287 9 London : 0.49608850575325425 10 Glasgow : 0.490454852366284 ------------------------------ 89. 加法構成性によるアナロジー 1 Spain : 0.6948565586316053 2 Athens : 0.681273120661114 3 Greece : 0.564727893639371 4 Denmark : 0.5412544877031749 5 Romania : 0.5190412855968768 6 Armenia : 0.5134651735824168 7 Egypt : 0.5112680989598707 8 Argentina : 0.5040413172446792 9 Portugal : 0.5017621437939799 10 Austria : 0.4927839578682253
8章で苦労したものと違って学習にかかる時間も短く、結果も直感どおりでGoogleすごいなと実感させられますね。。。
91. アナロジーデータの準備
単語アナロジーの評価データをダウンロードせよ.このデータ中で": "で始まる行はセクション名を表す.例えば,": capital-common-countries"という行は,"capital-common-countries"というセクションの開始を表している.ダウンロードした評価データの中で,"family"というセクションに含まれる評価事例を抜き出してファイルに保存せよ.
gist82757c3b8676b53ccfd7cdcde06b2349
❯ go run q91.go ❯ head -10 ../data/q91.out.txt : family boy girl brother sister boy girl brothers sisters boy girl dad mom boy girl father mother boy girl grandfather grandmother boy girl grandpa grandma boy girl grandson granddaughter boy girl groom bride boy girl he she
こちらも評価データがリンク切れしているので、こちらを使いました。
92. アナロジーデータへの適用
91で作成した評価データの各事例に対して,vec(2列目の単語) - vec(1列目の単語) + vec(3列目の単語)を計算し,そのベクトルと類似度が最も高い単語と,その類似度を求めよ.求めた単語と類似度は,各事例の末尾に追記せよ.このプログラムを85で作成した単語ベクトル,90で作成した単語ベクトルに対して適用せよ.
前処理
Q85のモデルのフォーマットをQ90と同一にするため以下前処理を行います。
gist0bb71f60790e48b728636e259707691f
❯ go run q92pre.go ❯ head -2 ../data/q85_model.txt 23699 300 Tibet 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
本題
gist33df6b590a9ea39ddb3735bb0926537a
❯ go run q92.go // 題意に従い、modelを変えて二度実行しています。 ❯ head -20 ../data/q92_model_q85.out.txt : family boy girl brother sister brother 1.000000 boy girl brothers sisters Undifined -1.100000 boy girl dad mom Undifined NaN boy girl father mother Undifined -1.100000 boy girl grandfather grandmother Undifined -1.100000 boy girl grandpa grandma Undifined NaN boy girl grandson granddaughter Undifined -1.100000 boy girl groom bride Undifined NaN boy girl he she he 1.000000 boy girl his her his 1.000000 boy girl husband wife Undifined -1.100000 boy girl king queen king 1.000000 boy girl man woman Undifined -1.100000 boy girl nephew niece Undifined -1.100000 boy girl policeman policewoman Undifined NaN boy girl prince princess Undifined -1.100000 boy girl son daughter son 1.000000 boy girl sons daughters Undifined -1.100000 boy girl stepbrother stepsister Undifined NaN ❯ head -20 ../data/q92_model_q90.out.txt : family boy girl brother sister brother 0.877781 boy girl brothers sisters brothers 0.824237 boy girl dad mom girl 0.698522 boy girl father mother father 0.870984 boy girl grandfather grandmother grandfather 0.759021 boy girl grandpa grandma Undifined NaN boy girl grandson granddaughter grandson 0.724518 boy girl groom bride girl 0.670416 boy girl he she he 0.881071 boy girl his her his 0.865413 boy girl husband wife husband 0.893910 boy girl king queen king 0.857420 boy girl man woman man 0.870114 boy girl nephew niece nephew 0.743345 boy girl policeman policewoman girl 0.700381 boy girl prince princess prince 0.755579 boy girl son daughter son 0.879387 boy girl sons daughters sons 0.880932 boy girl stepbrother stepsister Undifined NaN
Q85のほうはダメダメですね。Q90も正解率は高くなさそうです。
93. アナロジータスクの正解率の計算
92で作ったデータを用い,各モデルのアナロジータスクの正解率を求めよ.
gist68faf311e8fe37dacde2b1fd69682492
// Q85 ❯ go run q93.go 0
// Q90 ❯ go run q93.go 0.043478260869565216
Q85のmodelではひとつも正解できませんでした。Q90でも4%と精度はあまりよくないですね。
Q92で見たように零ベクトルが多くUndifined
になってしまいました。
94. WordSimilarity-353での類似度計算
The WordSimilarity-353 Test Collectionの評価データを入力とし,1列目と2列目の単語の類似度を計算し,各行の末尾に類似度の値を追加するプログラムを作成せよ.このプログラムを85で作成した単語ベクトル,90で作成した単語ベクトルに対して適用せよ.
gist79cb64278142bed6d7ca1b58c5529ec8
// Q85 ❯ go run q93.go ❯ head -10 ../data/q94_model_q85.out.txt Word 1,Word 2,Human (mean) love,sex,6.77,NaN tiger,cat,7.35,NaN tiger,tiger,10.00,NaN book,paper,7.46,NaN computer,keyboard,7.62,NaN computer,internet,7.58,NaN plane,car,5.77,NaN train,car,6.31,NaN telephone,communication,7.50,NaN
// Q90 ❯ go run q93.go Word 1,Word 2,Human (mean) love,sex,6.77,0.344764 tiger,cat,7.35,0.650308 tiger,tiger,10.00,1.000000 book,paper,7.46,0.457775 computer,keyboard,7.62,0.448387 computer,internet,7.58,0.518989 plane,car,5.77,0.397299 train,car,6.31,0.460842 telephone,communication,7.50,0.441498
人力で評価した関連する単語とこれまで学習してきたモデルの比較をしていきます。
Q85はすべてがNaN
になっているわけではないのですが、大部分がNaN
ですね。
一方でQ90はなかなか良さそうです。集計は次の問題です。
95. WordSimilarity-353での評価
94で作ったデータを用い,各モデルが出力する類似度のランキングと,人間の類似度判定のランキングの間のスピアマン相関係数を計算せよ.
gist7d5274b15f7a20948013658fd297bbfa
// Q85 ❯ go run q95.go -0.010072800290837701 // Q90 ❯ go run q95.go 0.5951617769609865
今回はQ85で同順位が多いので、スピアマンの順位相関係数 - Wikipediaにも載っている同順位の場合で実装しようと思いましたが、dgryski/go-onlinestatsを拝借しました。
96. 国名に関するベクトルの抽出
word2vecの学習結果から,国名に関するベクトルのみを抜き出せ.
gist448273c49432eb5c3e7b5fa0d0051fb5
❯ go run q96.go // 出力はgobでバイナリフォーマットのため省略
Q81でも用いたList of countries of the world in alphabetical orderの国名を抽出しました。
前処理として複合語から成る国名は_
で結合しています。
97. k-meansクラスタリング
96の単語ベクトルに対して,k-meansクラスタリングをクラスタ数k=5として実行せよ.
gisteeeff6fc40045a328486829456ddb759
❯ go run q97.go 4 : Sierra_Leone 3 : Wake_Island 2 : Virgin_Islands 3 : El_Salvador 1 : Costa_Rica 3 : Marshall_Islands 2 : American_Samoa 3 : Northern_Mariana_Islands 1 : Saudi_Arabia 4 : Cape_Verde 3 : Wallis_and_Futuna 3 : Central_African_Republic 3 : San_Marino 4 : Isle_of_Man 5 : United_Kingdom 3 : Bosnia_and_Herzegovina 4 : Puerto_Rico 3 : Cayman_Islands 5 : New_Zealand 3 : West_Bank 3 : Faroe_Islands 1 : Solomon_Islands 3 : Norfolk_Island 3 : United_Arab_Emirates 3 : Saint_Lucia 1 : Sri_Lanka 3 : Trinidad_and_Tobago 3 : Western_Sahara 2 : Hong_Kong 2 : United_States 1 : Dominican_Republic 3 : Cook_Islands 3 : Serbia_and_Montenegro 3 : French_Polynesia 3 : Saint_Helena 3 : Gaza_Strip 3 : French_Guiana 3 : Equatorial_Guinea 1 : Papua_New_Guinea 3 : Christmas_Island 3 : British_Virgin_Islands 1 : Czech_Republic 1 : New_Caledonia 1 : South_Africa 3 : Burkina_Faso 3 : Antigua_and_Barbuda
Q96で学習モデルに含まれていない(零ベクトルになる)国名は弾いてしまっているので46カ国での結果になりました。
k-meansの実体はkMeans
に実装し、各国が割り当てられたlabel
が変化しなくなるまでループを回しています。
98. Ward法によるクラスタリング
96の単語ベクトルに対して,Ward法による階層型クラスタリングを実行せよ.さらに,クラスタリング結果をデンドログラムとして可視化せよ.
gistb57d94e6ad48f7909011a28f0c1a0c3c
結果です。
本文で実装した内容でパッケージ化したので、以下に使い方を含めてまとめています。 【Golang】Ward法で階層的クラスタリングするパッケージを書いた - 逆さまにした
99. t-SNEによる可視化
96の単語ベクトルに対して,ベクトル空間をt-SNEで可視化せよ.
Q98と同様に可視化部分は自分で実装する必要があったのでgonum/plot
で以下のように実装しました。
gist63aad7d67083a70dc8230315588ae407
本題はこちら。
gistab950a1bd807782eab10859a55633e56
結果です。
t-SNEの計算は、tsne4goを使いました。 最初可視化した際には黒一色で表示していましたが、意味が理解できなかったので、Q97のk-meansで色分けしています。 そもそもt-SNEとk-meansの相性がいいのか知りませんが、気持ち分類できているかなというところでしょうか。
感想
以上で言語処理処理100本ノックの全100問完走です。 途中で半年くらい間開けてしまったりしたので結構長く掛かりましたが完走できてよかったです。 ただ、前章のQ85が微妙な結果だったので、Q85が実装できたら本章も再チャレンジしたいです。
もともとGoを触り始めて慣れるために始めたのですが、いろいろ実装できて自然言語処理の勉強に加えて、Goの勉強にもなりました。 特にGoで100本ノックやっている方をほかに見かけないので自力で頑張る必要があったのも結果的にはよかったのかと思います。 お付き合いありがとうございました。
コードはすべてまとめてGithubにも置いてあります。
Reference
- 言語処理100本ノック 2015
- Lev Finkelstein, Evgeniy Gabrilovich, Yossi Matias, Ehud Rivlin, Zach Solan, Gadi Wolfman, and Eytan Ruppin, "Placing Search in Context: The Concept Revisited", ACM Transactions on Information Systems, 20(1):116-131, January 2002.
- スピアマンの順位相関係数 - Wikipedia
- dgryski/go-onlinestats
- List of countries of the world in alphabetical order
- k平均法 - Wikipedia
- linkage - MathWorks
- ウォード法によるクラスタリングのやり方
- 【Golang】Ward法で階層的クラスタリングするパッケージを書いた - 逆さまにした
- t-SNEによるイケてる次元圧縮&可視化
- t-SNE を用いた次元圧縮方法のご紹介
- CSS Colors - w3schools.com
- tsne4go