ノート

gensim-word2vecでベクトル空間を試す
gensim-word2vecでベクトル空間を試す(2)

gensim-word2vecでベクトル空間を試す(3) 2015-01-27

(続きです)

差分ベクトルの続き 〜 語の「関係性」は、差分ベクトル上でどう見えるかを考える。

たとえば、「動物」 と {イヌ, ウシ, ブタ, ...} の関係性、この場合はis-a関係、つまり集合{イヌ, ウシ, …} の名前が「動物」なのだが、このis-aという特定の関係が、ベクトル空間で共通性を持つのか、それとも、動物の is-a と、自動車の is-a はかなり別物なのか、という疑問である。

1つのグループ(集合)について、語ベクトル空間上での語間の差分ベクトルは、前のページでいろいろ見た結果、

では、いくつかのグループを用意して、それぞれの「グループ名」→「要素」ベクトルを求め、それらのお互いの関係がどうであるか見てみる。次の3つのグループについて計算する。

首都 東京 モスクワ 北京 アンカラ ワルシャワ ベルリン パリ ローマ アテネ マドリード リスボン
果物 リンゴ バナナ ミカン イチゴ メロン
動物 イヌ ネコ ウシ ブタ サル ゾウ シカ ウマ カバ クマ ウサギ ネズミ トラ イタチ

先頭の要素が、グループ名を示している。このグループ名と、他の要素との間の差分ベクトルを作る。

この3つのグループを混合して、階層型クラスタ分析をした結果が下図である。

isa-fru-mam-cap_diff.png

明瞭に3つのグループ、首都、果物、動物に分かれている。

これから推測されることは、is-a という抽象的なグルーピングはまだはっきり見えておらず、特定の is-a-動物 とか is-a-首都 とかが明瞭にグループを作っていること、である。

となると、もし is-a を抽出したければ、その他の関係を並べた中で、is-a が(他のランダムな関係性に比べて)集まっているか、ということになるだろう。

既に得られている関係をもう少し詳しく見てみる?

「王様ー男+女=女王」の言い分

王様−男+女=女王 を変形すると、王様−女王 = 男−女

もし仮に、(男、女)に相当するペアが何種類かあったとすると、それを
それを(x1, x2), (y1, y2), ... のように書くとすると、
x2-x1 = y2-y1 = z2-z1 = 王様-女王 = 男-女
ということになるはずである。

otoko-onnna.png

国家−首都の言い分 (2015-02-11 〜 )

国−首都の関係で、同じようなことが成り立つのか?
前に見た、サンプルの世界では、x1-x2 = y1-y2 = z1-z2 = ... がある程度成り立っていた。

では、「国」(もしくは「国家」、「国名」)と「首都」の間ではどうか?

首都 国家 国 国名 東京 日本 ロシア モスクワ 中国 北京 トルコ アンカラ ポーランド ワルシャワ
ドイツ ベルリン フランス パリ イタリア ローマ ギリシャ アテネ スペイン マドリード
ポルトガル リスボン

以下のストーリーで試すと

> y <- read.csv("list-capital2-paired.diff", header=FALSE, row.names=1)
> dy <- dist(y)
> hy <- hclust(dy, method="ward.D2")
> plot(hy)

list-capital2-paired-diff-hc.png

主成分分析では、

list-capital2-pc.png

また、kmeansで試すと、3クラスタでは

K-means clustering with 3 clusters of sizes 4, 9, 4

Cluster means:
  国家-首都  国-首都  国-国家  国名-首都  国名-国家  国名-国  日本・東京
1   2.198047 2.156886 3.214276   3.088071   3.875954 3.551940    2.385694
2   2.793659 2.858178 3.064876   3.169969   3.512312 3.015930    2.760655
3   3.655263 2.987388 2.179308   2.048878   1.710203 1.986541    3.885986
  ソ・モス  中国・北京  トル・アン  ポー・ワル  ドイ・ベル  フラ・パリ
1  2.593728    2.853357    2.570053    2.721486    2.658955    2.667711
2  1.601711    1.869229    1.845983    1.749788    1.636944    1.686702
3  3.018687    3.182608    2.909319    3.191345    3.125887    3.156553
  イタ・ロー  ギリ・アテ  スペ・マド  ポル・リス
1    2.494594    3.491546    3.051974    2.910194
2    2.929289    2.267128    2.075422    1.769087
3    3.201605    3.663682    3.420503    3.048364

Clustering vector:
 国家-首都     国-首都     国-国家   国名-首都   国名-国家     国名-国
          1           1           3           3           3           3
日本・東京    ソ・モス  中国・北京  トル・アン  ポー・ワル  ドイ・ベル
          1           2           2           2           2           2
フラ・パリ  イタ・ロー  ギリ・アテ  スペ・マド  ポル・リス
          2           1           2           2           2

Within cluster sum of squares by cluster:
[1] 35.29224 45.83838 28.12399
 (between_SS / total_SS =  45.5 %)

4クラスタでは、

K-means clustering with 4 clusters of sizes 9, 2, 2, 4

Cluster means:
  国家-首都  国-首都  国-国家  国名-首都  国名-国家  国名-国  日本-東京
1   2.793659 2.858178 3.064876   3.169969   3.512312 3.015930   2.760655
2   3.336532 3.254210 3.217283   3.680672   3.787277 3.489949   1.584917
3   1.059563 1.059563 3.211269   2.495470   3.964631 3.613931   3.186470
4   3.655263 2.987388 2.179308   2.048878   1.710203 1.986541   3.885986
  ソ-モス  中国-北京  トル-アン  ポー-ワル  ドイ-ベル  フラ-パリ  イタ-ロー
1 1.601711   1.869229   1.845983   1.749788   1.636944   1.686702   2.929289
2 2.493044   3.007815   2.661292   2.711363   2.629066   2.583103   1.584917
3 2.694412   2.698900   2.478815   2.731609   2.688843   2.752318   3.404271
4 3.018687   3.182608   2.909319   3.191345   3.125887   3.156553   3.201605
  ギリ-アテ  スペ-マド  ポル-リス
1   2.267128   2.075422   1.769087
2   3.638657   3.021795   2.858611
3   3.344436   3.082154   2.961778
4   3.663682   3.420503   3.048364

Clustering vector:
国家-首都    国-首都    国-国家  国名-首都  国名-国家    国名-国  日本-東京
         3          3          4          4          4          4          2
 ソ-モス  中国-北京  トル-アン  ポー-ワル  ドイ-ベル  フラ-パリ  イタ-ロー
         1          1          1          1          1          1          2
ギリ-アテ  スペ-マド  ポル-リス
         1          1          1

Within cluster sum of squares by cluster:
[1] 45.838383 11.458680  6.203175 28.123990
 (between_SS / total_SS =  54.3 %)

それで、「差分ベクトルが近い」という状況を、差分ベクトルのユークリッド距離で見てみる。<国名-首都>の形の差分データのみを抽出し、それらの間の距離を計算する。 下のデータは、2つの差分ベクトル間の、ユークリッド距離とコサイン距離(角度に換算 したもの)である。但し「意味のある」差分の組合せつまり本物の首都と国名の差分の 組合せのみを挙げた。(1行目の例では、「ドイツ」と「ベルリン」の差分、「フランス」 と「パリ」の差分、の2つの差分の間の距離を求めている。)

 差分1  差分2  ユークリッド距離 コサイン距離
"ドイ-ベル フラ-パリ", 1.45256324844, 43.6347195442
"ロシ-モス ドイ-ベル", 1.47303684186, 43.5927964242
"ポー-ワル ポル-リス", 1.58100577318, 44.5871331147
"ロシ-モス フラ-パリ", 1.61495364924, 50.8447046042
"ポー-ワル ドイ-ベル", 1.64433200327, 47.3245840054
"ドイ-ベル ポル-リス", 1.64463479115, 46.727044402
"ロシ-モス トル-アン", 1.66520575039, 51.0804727686
"ロシ-モス ポー-ワル", 1.69881474412, 50.410026923
"ポー-ワル フラ-パリ", 1.73084079198, 52.3389398383
"ロシ-モス ポル-リス", 1.77407573504, 52.0453148026
"トル-アン ドイ-ベル", 1.80866111012, 53.9835733717
"ロシ-モス 中国-北京", 1.84776576346, 55.7355965439
"中国-北京 トル-アン", 1.85101720581, 55.4976301177
"中国-北京 フラ-パリ", 1.91633863338, 59.1454953795
"ロシ-モス スペ-マド", 1.94049688618, 51.1970911858
"フラ-パリ ポル-リス", 1.94706982656, 58.6602729642
"トル-アン ポー-ワル", 1.97797664006, 59.1442502949
"トル-アン フラ-パリ", 2.01047148166, 64.137501387
"中国-北京 ドイ-ベル", 2.07511421151, 61.3696294001
"トル-アン ポル-リス", 2.11472071319, 62.8000469431
"中国-北京 ポル-リス", 2.11861384962, 61.5983707108
"ポー-ワル スペ-マド", 2.1250485963, 55.6073775838
"中国-北京 ポー-ワル", 2.17515484476, 64.2832164842
"フラ-パリ スペ-マド", 2.18179399698, 59.3598272913
"スペ-マド ポル-リス", 2.25986489774, 59.0800074037
"中国-北京 ギリ-アテ", 2.27384381395, 55.9501706285
"ドイ-ベル スペ-マド", 2.30899706209, 61.3250571605
"ドイ-ベル ギリ-アテ", 2.32515967824, 57.3814661155
"フラ-パリ ギリ-アテ", 2.32628561145, 58.77983991
"トル-アン スペ-マド", 2.35104049408, 63.710693314
"ロシ-モス ギリ-アテ", 2.40104976427, 60.5639102604
"ギリ-アテ ポル-リス", 2.4817971806, 61.3233997941
"中国-北京 スペ-マド", 2.56521209526, 69.3790415727
"ロシ-モス イタ-ロー", 2.63445235874, 78.184571298
"フラ-パリ イタ-ロー", 2.66134393173, 80.7761225693
"ドイ-ベル イタ-ロー", 2.67671483475, 77.3075205822
"トル-アン イタ-ロー", 2.68989070994, 79.6747864228
"ポー-ワル ギリ-アテ", 2.81491808937, 71.8009750961
"トル-アン ギリ-アテ", 2.8347506366, 74.0162074098
"ポー-ワル イタ-ロー", 2.88783476027, 84.2720946055
"ギリ-アテ スペ-マド", 2.94634558249, 70.3167958756
"イタ-ロー ポル-リス", 3.00494775177, 87.4003083934
"中国-北京 イタ-ロー", 3.09417105707, -87.2401318834
"首都-国家 東京-日本", 3.13496525031, 71.0594101602
"イタ-ロー スペ-マド", 3.141019536, 84.2060392884
"首都-国家 イタ-ロー", 3.18099265303, 83.8758497142
"首都-国家 フラ-パリ", 3.47277414917, -75.0838409045
"首都-国家 ポル-リス", 3.54000242224, -80.2288862843
"イタ-ロー ギリ-アテ", 3.57322378255, -86.9568416536
"首都-国家 ロシ-モス", 3.59867755865, -72.0326058732
"首都-国家 ドイ-ベル", 3.69086228157, -71.9267641965
"首都-国家 ポー-ワル", 3.69447621665, -72.4932119282
"首都-国家 トル-アン", 3.70565957805, -67.9848441259
"首都-国家 中国-北京", 3.73611390752, -69.6393764195
"首都-国家 スペ-マド", 3.94002083437, -74.4837670038
"東京-日本 中国-北京", 4.01037653574, -71.0379048238
"東京-日本 イタ-ロー", 4.04680451244, -75.7164859289
"首都-国家 ギリ-アテ", 4.05013991197, -77.0900543924
"東京-日本 フラ-パリ", 4.10848697556, -59.7675205018
"東京-日本 ギリ-アテ", 4.11003117096, -84.0376827748
"東京-日本 トル-アン", 4.12398694129, -63.0721247002
"東京-日本 ポル-リス", 4.2314401527, -64.0656766536
"東京-日本 ドイ-ベル", 4.24540441114, -60.8572634148
"東京-日本 ロシ-モス", 4.26812650747, -54.7211298658
"東京-日本 ポー-ワル", 4.2943206619, -59.3618572719
"東京-日本 スペ-マド", 4.45641180601, -65.8295948606

これに対して、次のデータは「意味のない」組合せの場合の値の例(ごく一部)を載せる。 組合せの数は非常に多い(210,859の組合せがあった)ので、ごく一部を載せる。 4行目のデータで分かる通り、「日本」と「スペイン」の差分は国名と国名の差分であって、 国名と首都の差分ではない。

 差分1  差分2  ユークリッド距離 コサイン距離
"首都-スペ 首都-ポル", 0.861960374341, 21.7028057688
"国家-スペ 国家-ポル", 0.861960374341, 18.3345084744
"国名-スペ 国名-ポル", 0.861960374341, 17.1219994676
"日本-スペ 日本-ポル", 0.861960374341, 16.4477858692
"ロシ-スペ ロシ-ポル", 0.861960374341, 35.3735596332
"モス-スペ モス-ポル", 0.861960374341, 22.7400602111
"中国-スペ 中国-ポル", 0.861960374341, 21.7989870835
"北京-スペ 北京-ポル", 0.861960374341, 16.5338039842
"トル-スペ トル-ポル", 0.861960374341, 39.9474185335
"アン-スペ アン-ポル", 0.861960374341, 24.6265085
"ポー-スペ ポー-ポル", 0.861960374341, 34.5529117176
"ワル-スペ ワル-ポル", 0.861960374341, 20.7074737754
"ドイ-スペ ドイ-ポル", 0.861960374341, 30.8592415863
"ベル-スペ ベル-ポル", 0.861960374341, 20.5921560506
"フラ-スペ フラ-ポル", 0.861960374341, 29.1590602828
"パリ-スペ パリ-ポル", 0.861960374341, 21.0724832939
"イタ-スペ イタ-ポル", 0.861960374341, 43.3421386258
"ロー-スペ ロー-ポル", 0.861960374341, 23.0979973106
"ギリ-スペ ギリ-ポル", 0.861960374341, 37.7050874656
"アテ-スペ アテ-ポル", 0.861960374341, 18.040363092

これらを、ユークリッド距離・コサイン角度の2つの距離尺度に対する 出現頻度分布(横軸は距離、縦軸は頻度)にしたものが下の図である。 右側は、他のすべての(意味のない)組合せでの差分ベクトルの距離頻度分布にしたものが下の右図であるが、縦軸(頻度数)のスケールは右図は拡大してある。 この図を比較する限り、左図の「正しい対」は確かに全体の分布の左寄り(距離が小さい部分)に集まってはいるが、その部分では他の対と混在しており、この図から切り分けることは困難と思える。

距離「正しい対」の頻度分布その他全ての対の頻度分布
ユークリッドlist-capital2-good-euc-hist.pnglist-capital2-other-euc-hist.png
コサインlist-capital2-good-cos-hist.pnglist-capital2-other-cos-hist.png

但し、左右の図は縦軸の縮尺が異なるので、直接比較してはならない。左側の「正しい対」 の頻度は、右側の「その他すべての組合せ」に比較して非常に少ない、

ところが、下の表に見られるように、「首都→スペイン」のベクトルと「首都→ポルトガル」のベクトルは、ユークリッド距離が0.862程度であり、上記の表に比較して小さい。

首都-スペ 首都-ポル 0.861960374341
国家-スペ 国家-ポル 0.861960374341
国名-スペ 国名-ポル 0.861960374341
日本-スペ 日本-ポル 0.861960374341
ロシ-スペ ロシ-ポル 0.861960374341
モス-スペ モス-ポル 0.861960374341
中国-スペ 中国-ポル 0.861960374341
北京-スペ 北京-ポル 0.861960374341
トル-スペ トル-ポル 0.861960374341
アン-スペ アン-ポル 0.861960374341
ポー-スペ ポー-ポル 0.861960374341
ワル-スペ ワル-ポル 0.861960374341
ドイ-スペ ドイ-ポル 0.861960374341
ベル-スペ ベル-ポル 0.861960374341
フラ-スペ フラ-ポル 0.861960374341
パリ-スペ パリ-ポル 0.861960374341
イタ-スペ イタ-ポル 0.861960374341
ロー-スペ ロー-ポル 0.861960374341
ギリ-スペ ギリ-ポル 0.861960374341
アテ-スペ アテ-ポル 0.861960374341
スペ-首都 ポル-首都 0.861960374341
スペ-国家 ポル-国家 0.861960374341
スペ-国名 ポル-国名 0.861960374341
スペ-日本 ポル-日本 0.861960374341
スペ-ロシ ポル-ロシ 0.861960374341

(後略)

同様に、 ロシア→スペインの差分とロシア→ポルトガルの差分との間の距離も0.862である。 つまり、我々が期待した、

正しい国名-首都のペア(=差分ベクトル)はどれも同じようなベクトルである

という仮説は成り立っていないようである。少なくとも、正しいペア同士の差分より小さい組合せ(正しくない組合せ)でも、距離が小さいものがある、ということである。現在のデータを見る限り、差分ベクトル間の距離がある閾値以下ということだけによる判定は難しい(できない?)ということになる。

〜〜〜〜〜 〜〜〜〜〜 〜〜〜〜〜 〜〜〜〜〜 〜〜〜〜〜

ずっと通して眺めると、スペインとポルトガルはどうも同じ位置にあるのではないかと疑われる。なお、この表は距離の小さい順にソートしてある。

ところで、上記のデータで差分ベクトル間の距離が随分広く一致している(たとえば、この表に載っているすべての距離は0.86196...)というのはどういうことか? もちろん、この表の後ろの方では値が増えてゆく(小さい順にソートしたので)が、全く同じ値が続いているのは、計算手順を疑いたくなる。

そこで、例を取って計算の途中経過を見てみよう。例は、アンカラ→スペインとアンカラ→ポルトガルである。どちらも正しい首都→国名の組合せではないが、この2つの差分ベクトル間の距離が、0.861960...である計算は、次のようであった。

差分アン-スペ と 差分アン-ポル の間の距離は、0.861960374341
"アン-スペ" ,0.10835  ,-0.1716245  ,0.1414465  ,0.185386  ,-0.5107009  ,0.0897742  ,
0.140103  ,0.191504  ,-0.3872286  ,0.3584633  ,-0.1233425  ,0.087201  ,
0.300455  ,0.0801934  ,-0.273472  ,-0.179286  ,-0.16232902  ,-0.08303826  ,
-0.068188  ,0.14288  ,-0.1497642  ,-0.276481  ,0.015589  ,-0.3710862  ,0.318655  ,
0.258035  ,0.0287928  ,0.054204  ,-0.1771187  ,-0.242981  ,-0.3770764  ,0.4740664  ,
0.0534406  ,-0.0008444  ,0.324621  ,-0.0928343  ,0.0718725  ,-0.164425  ,-0.2306166  ,
0.163223  ,0.114993  ,0.0568694  ,-0.003845  ,0.43661737  ,-0.1693657  ,-0.15317  ,
0.093757  ,-0.148364  ,0.16043  ,0.067695  ,-0.068783  ,0.0271691  ,0.139666  ,
0.0835892  ,0.057052  ,0.0529415  ,-0.113659  ,0.1188703  ,0.1091913  ,0.3634971  ,
0.13981  ,-0.1854308  ,0.2964278  ,-0.1417346  ,-0.1211759  ,0.012103249  ,
-0.3546611  ,-0.100493  ,-0.3040212  ,-0.160078  ,-0.2221941  ,-0.073101  ,
-0.238044  ,-0.0472757  ,0.42736  ,0.310335  ,-0.045087  ,-0.01416  ,0.2948319  ,
-0.15346153  ,0.088281  ,0.056667  ,-0.151218  ,0.028694  ,0.05137184  ,0.0103511  ,
-0.315498  ,-0.131103  ,-0.002788  ,0.256663  ,-0.051478  ,0.1627858  ,-0.034232  ,
0.149326  ,0.0171631  ,0.135465  ,0.179691  ,0.1921576  ,0.242563  ,-0.1062754 

"アン-ポル" ,0.210255  ,-0.1785068  ,0.1254804  ,0.144805  ,-0.409747  ,0.096794  ,
0.055187  ,0.044344  ,-0.4404026  ,0.5148493  ,-0.0078817  ,0.078469  ,0.353179  ,
0.1455046  ,-0.300201  ,-0.271782  ,-0.12989602  ,0.0340853  ,-0.137283  ,0.216325  ,
-0.16921465  ,-0.202961  ,-0.002575  ,-0.441537  ,0.157934  ,0.239711  ,-0.009954  ,
-0.214321  ,-0.2176305  ,-0.189586  ,-0.25575  ,0.5354224  ,-0.0423973  ,-0.0387464  ,
0.322326  ,-0.0848244  ,0.2020098  ,-0.206008  ,-0.1390116  ,0.1465759  ,0.203689  ,
0.0532768  ,0.119245  ,0.3453582  ,-0.1504807  ,0.014695  ,0.057842  ,-0.094913  ,
0.0017  ,0.046935  ,-0.106178  ,-0.1365013  ,0.1868493  ,-0.0175975  ,0.06119  ,
-0.0348922  ,-0.030615  ,-0.081898  ,0.1248788  ,0.4352917  ,0.108159  ,-0.2992528  ,
0.3075993  ,-0.068296  ,-0.1155086  ,0.1053138  ,-0.303005  ,-0.3048847  ,-0.171692  ,
-0.093449  ,-0.1807936  ,-0.020304  ,-0.289596  ,-0.087034524  ,0.404112  ,0.243534  ,
-0.072602  ,-0.1818801  ,0.440831  ,-0.03078983  ,0.034088  ,0.085015  ,-0.088066  ,
0.09005  ,0.1072501  ,-0.022193  ,-0.369575  ,-0.134879  ,0.022898  ,0.283428  ,
-0.013999  ,0.1834663  ,-0.054343  ,0.108139  ,0.058281  ,0.18481  ,0.019403  ,
0.0889806  ,0.168561  ,-0.1665664 

この2つの差分ベクトルの間の、要素ごとの差分は、

[-0.101905    0.0068823   0.0159661   0.040581   -0.1009539  -0.0070198
  0.084916    0.14716     0.053174   -0.156386   -0.1154608   0.008732
 -0.052724   -0.0653112   0.026729    0.092496   -0.032433   -0.11712356
  0.069095   -0.073445    0.01945045 -0.07352     0.018164    0.0704508
  0.160721    0.018324    0.0387468   0.268525    0.0405118  -0.053395
 -0.1213264  -0.061356    0.0958379   0.037902    0.002295   -0.0080099
 -0.1301373   0.041583   -0.091605    0.0166471  -0.088696    0.0035926
 -0.12309     0.09125917 -0.018885   -0.167865    0.035915   -0.053451
  0.15873     0.02076     0.037395    0.1636704  -0.0471833   0.1011867
 -0.004138    0.0878337  -0.083044    0.2007683  -0.0156875  -0.0717946
  0.031651    0.113822   -0.0111715  -0.0734386  -0.0056673  -0.09321055
 -0.0516561   0.2043917  -0.1323292  -0.066629   -0.0414005  -0.052797
  0.051552    0.03975882  0.023248    0.066801    0.027515    0.1677201
 -0.1459991  -0.1226717   0.054193   -0.028348   -0.063152   -0.061356
 -0.05587826  0.0325441   0.054077    0.003776   -0.025686   -0.026765
 -0.037479   -0.0206805   0.020111    0.041187   -0.0411179  -0.049345
  0.160288    0.103177    0.074002    0.060291  ]

となっている。

次に、同じ距離を持つ別の差分ベクトルペア、ベルギー→スペインとベルギー→ポルトガルの距離を計算する。

差分ベル-スペ と 差分ベル-ポル の間の距離も、0.861960374341
"ベル-スペ" ,0.2258076  ,-0.1297075  ,0.2727885  ,0.442876  ,0.2453531  ,0.1223282  ,
0.015874  ,0.314027  ,-0.3866795  ,0.511617  ,0.2758604  ,0.226965  ,0.028367  ,
-0.0113965  ,0.052702  ,-0.211986  ,-0.1933138  ,-0.32381356  ,-0.446335  ,-3.6e-05  ,
-0.001108  ,-0.248353  ,0.107337  ,-0.2211032  ,0.382  ,-0.139387  ,0.2056422  ,
-0.353445  ,0.1378833  ,-0.340893  ,-0.2015294  ,0.648549  ,-0.1126041  ,0.043526  ,
0.206512  ,0.1190487  ,0.1957485  ,-0.258834  ,-0.119049  ,0.1795235  ,0.2825953  ,
0.0175781  ,0.1238325  ,0.54957037  ,-0.1100236  ,-0.062075  ,0.2978434  ,-0.204307   ,
0.030349  ,0.084398  ,-0.155216  ,-0.3067416  ,0.040495  ,0.03955325  ,-0.0476152  ,
-0.121462  ,-0.192387  ,0.0032251  ,0.0159735  ,0.4367121  ,-0.0336639  ,-0.2352343  ,
0.1680278  ,0.06086558  ,-0.2142519  ,-0.078912751  ,-0.0811152  ,-0.010598  ,
0.0788038  ,-0.143188  ,-0.3220361  ,-0.133626  ,-0.215869  ,0.0284124  ,0.10092  ,
0.351439  ,-0.324653  ,-0.019024  ,0.0981426  ,-0.015235  ,0.2252566  ,0.058488  ,
-0.263055  ,0.002446  ,-0.01831936  ,-0.0628718  ,-0.379734  ,-0.039333  ,0.342846  ,
-0.075999  ,-0.065456  ,0.3040735  ,0.0793893  ,-0.219628  ,-0.0754537  ,-0.067309  ,
0.249127  ,0.2601766  ,0.201764  ,-0.0961529 

"ベル-ポル" ,0.3277126  ,-0.1365898  ,0.2568224  ,0.402295  ,0.346307  ,0.129348  ,
-0.069042  ,0.166867  ,-0.4398535  ,0.668003  ,0.3913212  ,0.218233  ,0.081091  ,
0.0539147  ,0.025973  ,-0.304482  ,-0.1608808  ,-0.20669  ,-0.51543  ,0.073409  ,
-0.02055845  ,-0.174833  ,0.089173  ,-0.291554  ,0.221279  ,-0.157711  ,0.1668954  ,
-0.62197  ,0.0973715  ,-0.287498  ,-0.080203  ,0.709905  ,-0.208442  ,0.005624  ,
0.204217  ,0.1270586  ,0.3258858  ,-0.300417  ,-0.027444  ,0.1628764  ,0.3712913  ,
0.0139855  ,0.2469225  ,0.4583112  ,-0.0911386  ,0.10579  ,0.2619284  ,-0.150856  ,
-0.128381  ,0.063638  ,-0.192611  ,-0.470412  ,0.0876783  ,-0.06163345  ,-0.0434772  ,
-0.2092957  ,-0.109343  ,-0.1975432  ,0.031661  ,0.5085067  ,-0.0653149  ,-0.3490563  ,
0.1791993  ,0.13430418  ,-0.2085846  ,0.0142978  ,-0.0294591  ,-0.2149897  ,0.211133  ,
-0.076559  ,-0.2806356  ,-0.080829  ,-0.267421  ,-0.011346424  ,0.077672  ,0.284638  ,
-0.352168  ,-0.1867441  ,0.2441417  ,0.1074367  ,0.1710636  ,0.086836  ,-0.199903  ,
0.063802  ,0.0375589  ,-0.0954159  ,-0.433811  ,-0.043109  ,0.368532  ,-0.049234  ,
-0.027977  ,0.324754  ,0.0592783  ,-0.260815  ,-0.0343358  ,-0.017964  ,0.088839  ,
0.1569996  ,0.127762  ,-0.1564439 

この2つの差分ベクトルの間の、要素ごとの差分は、

[-0.101905    0.0068823   0.0159661   0.040581   -0.1009539  -0.0070198
  0.084916    0.14716     0.053174   -0.156386   -0.1154608   0.008732
 -0.052724   -0.0653112   0.026729    0.092496   -0.032433   -0.11712356
  0.069095   -0.073445    0.01945045 -0.07352     0.018164    0.0704508
  0.160721    0.018324    0.0387468   0.268525    0.0405118  -0.053395
 -0.1213264  -0.061356    0.0958379   0.037902    0.002295   -0.0080099
 -0.1301373   0.041583   -0.091605    0.0166471  -0.088696    0.0035926
 -0.12309     0.09125917 -0.018885   -0.167865    0.035915   -0.053451
  0.15873     0.02076     0.037395    0.1636704  -0.0471833   0.1011867
 -0.004138    0.0878337  -0.083044    0.2007683  -0.0156875  -0.0717946
  0.031651    0.113822   -0.0111715  -0.0734386  -0.0056673  -0.09321055
 -0.0516561   0.2043917  -0.1323292  -0.066629   -0.0414005  -0.052797
  0.051552    0.03975882  0.023248    0.066801    0.027515    0.1677201
 -0.1459991  -0.1226717   0.054193   -0.028348   -0.063152   -0.061356
 -0.05587826  0.0325441   0.054077    0.003776   -0.025686   -0.026765
 -0.037479   -0.0206805   0.020111    0.041187   -0.0411179  -0.049345
  0.160288    0.103177    0.074002    0.060291  ]

これを見ると、(差分アン-スペ − 差分アン-ポル)のベクトルと、(差分ベル-スペ −  差分ベル-ポル)のベクトルは、要素ごとに同じ値になっているが、元の値である 差分アン-スペ と 差分ベル-スペ や、差分アン-ポル と 差分ベル-ポル の値は異なっている。

幾つかの要素を手計算で検算してみたが、((アン-スペ)−(アン-ポル))と((ベル-スペ)−(ベル-ポル))は同じ値になるのは、計算上正しいようである。

さて、これの原因、示唆するところは、はっきり言って未だ分からないし、想像できない。

用いたプログラムは、

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# diff2cost.py
# cos距離の計算,距離行列として出力 #

import sys, string, codecs
import numpy as np
import scipy.cluster.hierarchy
import matplotlib
from matplotlib.pyplot import show
import math
font = {'family': 'VL Gothic',
        'size': '9' }
matplotlib.rc('font', **font)

sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
argvs = sys.argv;  argc = len(argvs)

def testprint(data, x, y):
      print u'xの要素', x, data[x,1:].astype(float), '\n', u'yの要素', y, data[y,1:].astype(float)
      print 'x^2:', np.power(data[x,1:].astype(float),2 ), '\n', 'y^2:', np.power(data[y,1:].astype(float),2 )
      print 'sum(x^2):', np.power(data[x,1:].astype(float),2 ).sum(), \
         '   sum(y^2):', np.power(data[y,1:].astype(float),2 ).sum()
      print '|x| = sqrt(sum(x^2)):', math.sqrt(np.power(data[x,1:].astype(float),2 ).sum()), '\n', \
         '|y| = sqrt(sum(y^2)):', math.sqrt(np.power(data[y,1:].astype(float),2 ).sum())
      print u'xとyの内積 = dot(data[x,1:], data[y,1:]): ', \
          np.dot(data[x,1:].astype(float), data[y,1:].astype(float) )
      diff = np.dot(data[x,1:].astype(float), data[y,1:].astype(float) ) / \
               ( math.sqrt( np.power(data[x,1:].astype(float), 2 ).sum() ) * math.sqrt( np.power(data[y,1:].astype(float), 2 ).sum() ) )
      print u'内積/(|x|*|y|):  ', diff

# 差分ベクトルファイルを読み込む
#infname = 'list-capital-paired.diff'
try:
  infname = argvs[1]
except IndexError:
  print u'  入力ファイル名を指定してください'
  exit()
[fname,fext] = infname.split('.')
if fext!='diff':
  print "input file extension '" + fext + "' is invalid (not 'diff')"
  exit()

######### 元のtxtファイルを読んで、ペアを再構築する ##########
txtfname = fname + '.txt'
try:
  txtdata = (codecs.open(txtfname, 'r', encoding='utf-8').read()).split(' ')
except IOError:
  print u'  入力ファイル ' + txtfname + u' が見つかりません'
  exit()

# 1次元で読んだtxtdataを、2次元に変換
goodpairs = []
u = iter(txtdata)
ary = zip( *[u]*2 )
for v in ary:
  goodpairs.append('"'+v[0][:2]+'-'+v[1][:2]+'"')

# goodpairs はたとえば ["首都-国家", "東京-日本", "ロシ-モス", "中国-北京", "ト ル-アン", "ポー-ワル", "ドイ-ベル", "フラ-パリ", "イタ-ロー", "ギリ-アテ", "スペ-マド", "ポル-リス"]
#for v in goodpairs:
#  print '>'+v+'<'

#goodpairs = [u"国家-首都",u"国-首都",u"国-国家",u"国名-首都",u"国名-国家",u"国 名-国",u"日本-東京",u"ソ-モス",u"中国-北京",u"トル-アン",u"ポー-ワル",u"ドイ-ベ ル",u"フラ-パリ",u"イタ-ロー",u"ギリ-アテ",u"スペ-マド",u"ポル-リス"]

# ベクトルをファイルから読み込む
try:
  data = np.loadtxt(infname, delimiter=',', dtype=object)
except IOError:
  print u'  入力ファイル ' + infname + u' が見つかりません'
  exit()

outgoodfname = fname + '-good.dist'
outgoodf = codecs.open(outgoodfname, 'w', encoding='utf-8')
outotherfname = fname + '-other.dist'
outotherf = codecs.open(outotherfname, 'w', encoding='utf-8')

maxitem = len(data[:,0])
gooddistarray = []
otherdistarray = []

for x in range(0,maxitem):
  for y in range(x+1,maxitem):
      ### testprint(data, x, y)
      cosdiff = np.dot(data[x,1:].astype(float), data[y,1:].astype(float) ) / \
               ( math.sqrt( np.power(data[x,1:].astype(float), 2 ).sum() ) * math.sqrt( np.power(data[y,1:].astype(float), 2 ).sum() ) )
      if x==y:
        cosdiff = 1.0
      if (0.0 <= cosdiff) and (cosdiff <= 1.0):
        # pythonのarccosは,ラジアンで0〜180度を返す。
        acosdif = math.acos(cosdiff)
      elif (-1.0 <= cosdiff) and (cosdiff <= 0.0):
        acosdif = math.acos(cosdiff) - 3.1416
      elif (cosdiff <= 1.0) and (cosdiff <= 1.00001):
        acosdif = math.acos(1.0)
      elif (-1.000001 <= cosdiff) and (cosdiff <= -1.00000):
        acosdif = math.acos(-1.0) - 3.1416
      else:
        acosdif = 0.0
        print u'cosの値が範囲外', cosdiff
      cosdist = acosdif*180.0/3.1416

      # Euclidean distance
      eucdist =  math.sqrt( \
        np.power( (data[x,1:].astype(float) - data[y,1:].astype(float)), 2 ).sum() )

      xhead = data[x,0].decode('utf-8')[0:-1].strip('"')
      yhead = data[y,0].decode('utf-8')[0:-1].strip('"')

      print "xhead:", xhead, str(xhead in goodpairs)

      if (x != y) and (('"'+xhead+'"') in goodpairs) and (('"'+yhead+'"') in goodpairs):
        gooddistarray.append([ xhead, yhead, eucdist, cosdist ])
      else:
        otherdistarray.append([ xhead, yhead, eucdist, cosdist ])

for u in sorted(gooddistarray, key=lambda x: x[2]):
  outgoodf.write('"'+u[0]+' '+u[1]+'", '+ str(u[2]) + ", " + str(u[3]) + '\n')

for u in sorted(otherdistarray, key=lambda x: x[2]):
  outotherf.write('"'+u[0]+' '+u[1]+'", '+ str(u[2]) + ", " + str(u[3]) + '\n')

〜〜〜 〜〜〜 〜〜〜

1つに固定した差分ベクトルと、他の差分ベクトルとの距離を見てみる (2015-02-20)

上記ではあまり区別がはっきりしなかったため、内容をもう少し詳しく見てみることにする。

1つに特定した差分ベクトル(たとえばフランス-パリ)と、他の差分ベクトルとの関係を 見てみることにする。

まず、「正しい」差分ベクトル集合の中で、「フラ-パリ」と他の正しい差分ベクトルとの距離をリストしてみると(ユークリッド距離で昇順ソート)、

2つの差分ベクトル  ユークリッド距離 コサイン距離(角度、度)
"ドイ-ベル フラ-パリ", 1.45256324844, 43.6347195442
"ロシ-モス フラ-パリ", 1.61495364924, 50.8447046042
"ポー-ワル フラ-パリ", 1.73084079198, 52.3389398383
"中国-北京 フラ-パリ", 1.91633863338, 59.1454953795
"フラ-パリ ポル-リス", 1.94706982656, 58.6602729642
"トル-アン フラ-パリ", 2.01047148166, 64.137501387
"フラ-パリ スペ-マド", 2.18179399698, 59.3598272913
"フラ-パリ ギリ-アテ", 2.32628561145, 58.77983991
"フラ-パリ イタ-ロー", 2.66134393173, 80.7761225693
"首都-国家 フラ-パリ", 3.47277414917, -75.0838409045
"東京-日本 フラ-パリ", 4.10848697556, -59.7675205018

次に、「その他の」差分ベクトル集合の中で、「フラ-パリ」と他の(その他の)差分ベクトルとの距離をリストしてみると、(ユークリッド距離で2.4以下のものを表示(計115個)、 それ以上の距離なのでここに表示していないものが523個)

"フラ-ベル フラ-パリ", 1.18006855249, 38.1739492133   ×
"ドイ-パリ フラ-パリ", 1.18766309869, 31.5471731826   ×
"フラ-パリ イタ-パリ", 1.29973922179, 39.1592837099   ×
"フラ-モス フラ-パリ", 1.36515153893, 42.6407632105   ×
"ドイ-モス フラ-パリ", 1.48147760284, 43.945126143
"ロシ-パリ フラ-パリ", 1.48741878604, 41.8644718432   ×
"フラ-パリ スペ-パリ", 1.54287862884, 42.8024011513   ×
"トル-パリ フラ-パリ", 1.56399870381, 41.9604908267   ×
"ポー-パリ フラ-パリ", 1.58726147238, 42.3510802461   ×
"フラ-ワル フラ-パリ", 1.68618589022, 49.9214534821   ×
"ポー-モス フラ-パリ", 1.6867521235, 50.8183966766
"フラ-パリ イタ-モス", 1.709358001, 54.0952369875
"トル-モス フラ-パリ", 1.7228956802, 51.5103866432
"ドイ-ワル フラ-パリ", 1.72788733633, 49.2655836854
"フラ-パリ フラ-リス", 1.73970281275, 51.7552775689   ×
"フラ-パリ ギリ-パリ", 1.73978693663, 43.9816032297   ×
"フラ-パリ スペ-モス", 1.74687173736, 53.2462053935
"ベル-パリ フラ-パリ", 1.76207337743, 67.34961975   ×
"フラ-パリ ポル-パリ", 1.76907404784, 47.1312859024   ×
"トル-リス フラ-パリ", 1.77377641275, 54.0348015375
"フラ-パリ イタ-ベル", 1.81452041079, 56.3599310832
"ドイ-イタ フラ-パリ", 1.84203397826, 71.5460326438
"フラ-パリ ギリ-モス", 1.85282576968, 52.636331554
"ロシ-ベル フラ-パリ", 1.86579136509, 55.7495232441
"モス-パリ フラ-パリ", 1.91062938552, 71.4544292818   ×
"ドイ-ロシ フラ-パリ", 1.92273725306, 75.9103322551
"トル-ワル フラ-パリ", 1.92434128525, 55.5883426575
"ポー-ベル フラ-パリ", 1.94578671811, 55.4632743197
"ロシ-ワル フラ-パリ", 1.94864869846, 57.4712572688
"フラ-パリ スペ-リス", 1.94932361551, 58.2914627983
"トル-ベル フラ-パリ", 1.98191494789, 56.0316319291
"フラ-パリ スペ-ベル", 1.98378268228, 57.4292033268
"フラ-パリ ポル-モス", 1.98811058622, 57.5436381545
"ドイ-リス フラ-パリ", 2.00327831346, 54.4805417536
"フラ-パリ イタ-リス", 2.00710723006, 60.8375410044
"フラ-パリ フラ-イタ", 2.00933500165, 77.4843519265   ×
"フラ-パリ スペ-ポル", 2.01041273071, 88.4524021546
"フラ-パリ スペ-イタ", 2.02270439105, 84.6561881589
"フラ-パリ イタ-ワル", 2.03876825704, 60.3050017051
"トル-イタ フラ-パリ", 2.03879385956, 81.448978723
"ロシ-リス フラ-パリ", 2.04065683386, 59.7683207902
"フラ-パリ ギリ-リス", 2.04077328767, 57.096351867
"フラ-アン フラ-パリ", 2.04094332526, 62.6178897979   ×
"フラ-パリ ポル-スペ", 2.05256970632, -88.4528230719
"トル-ロシ フラ-パリ", 2.05342611269, 85.2174263639
"フラ-パリ ギリ-ベル", 2.06927232988, 56.1541686764
"アン-パリ フラ-パリ", 2.06959357434, 64.2138602013   ×
"ドイ-アン フラ-パリ", 2.07277039599, 61.439076459
"ポー-リス フラ-パリ", 2.07499691775, 58.6566819293
"フラ-パリ ギリ-トル", 2.07531933922, 86.4567036762
"アン-モス フラ-パリ", 2.08165125677, 73.71763126
"フラ-パリ ギリ-ロシ", 2.0874731231, 82.7681900817
"フラ-パリ ギリ-イタ", 2.09312169916, 79.7786772791
"フラ-パリ ギリ-ワル", 2.10263980233, 57.013162229
"フラ-パリ リス-パリ", 2.10782127647, 72.0933201063   ×
"フラ-パリ ギリ-アン", 2.10925701777, 64.2446317071
"ワル-パリ フラ-パリ", 2.11274294855, 73.481437658   ×
"ドイ-フラ フラ-パリ", 2.11334707024, 85.6854963123   ×
"ドイ-スペ フラ-パリ", 2.11357406811, 79.0420739125
"ポー-イタ フラ-パリ", 2.11654263366, 82.2097747536
"ポー-アン フラ-パリ", 2.12292273215, 65.6528110868
"ドイ-トル フラ-パリ", 2.12994874209, 81.8528983106
"フラ-パリ スペ-アン", 2.13091333024, 67.4037612477
"ドイ-ポー フラ-パリ", 2.13695647694, 81.9900110196
"フラ-パリ ギリ-ポル", 2.13705740698, 82.6753913096
"ロシ-イタ フラ-パリ", 2.13962287796, 85.9193345707
"フラ-パリ ギリ-スペ", 2.13977636607, 83.5388383577
"フラ-パリ スペ-ワル", 2.14540038953, 60.0659433364
"トル-スペ フラ-パリ", 2.14615251711, 86.2048342087
"フラ-パリ ロー-パリ", 2.14776529917, 59.6788878346   ×
"トル-ポル フラ-パリ", 2.15667115377, 85.3183398405
"フラ-パリ ポル-イタ", 2.15891233897, 86.6503143273
"ロシ-アン フラ-パリ", 2.16556468325, 68.0033563232
"フラ-パリ ポル-マド", 2.17373964151, 59.6517550997
"フラ-パリ フラ-マド", 2.18162692696, 56.3004109845   ×
"首都-パリ フラ-パリ", 2.18207193217, 63.8067371771
"フラ-パリ イタ-スペ", 2.19015442433, -84.6566090762
"トル-ギリ フラ-パリ", 2.19054657415, -86.4571245935
"フラ-パリ ポル-アン", 2.19580799567, 68.6700157745
"ポー-ロシ フラ-パリ", 2.20462251033, 86.0828855785
"トル-首都 フラ-パリ", 2.20520776931, 68.6902910623
"ロシ-トル フラ-パリ", 2.20865581084, -85.2178472812
"フラ-ロシ フラ-パリ", 2.20972190941, 82.5036980682   ×
"フラ-パリ イタ-マド", 2.2155382078, 61.4037749971
"中国-パリ フラ-パリ", 2.23229727383, 57.6351633929   ×
"フラ-パリ イタ-アン", 2.23776913395, 70.644483401
"フラ-首都 フラ-パリ", 2.23905899868, 67.0351778458
"フラ-パリ ポル-ベル", 2.24353914467, 61.2421588232
"フラ-パリ ポル-ワル", 2.24369083711, 61.6713441298
"アン-リス フラ-パリ", 2.24494855526, 78.1498504742
"ドイ-ギリ フラ-パリ", 2.2450098725, 85.0103136361
"フラ-パリ スペ-ロシ", 2.24707926272, 89.6365614076
"フラ-パリ フラ-スペ", 2.25417418181, 83.0834919132   ×
"ベル-モス フラ-パリ", 2.25443570955, 89.1280922967
"アン-ワル フラ-パリ", 2.25472189063, 76.8065755914
"ロシ-スペ フラ-パリ", 2.26055440687, -89.6369823249
"ドイ-ポル フラ-パリ", 2.26059719338, 79.7708728436
"ポー-ポル フラ-パリ", 2.26273728567, 85.7932968687
"フラ-ドイ フラ-パリ", 2.26355954327, -85.6859172296   ×
"ポー-スペ フラ-パリ", 2.27101234684, 86.6713137827
"トル-マド フラ-パリ", 2.27136064732, 59.0849598046
"フラ-パリ イタ-ポル", 2.27926803704, -86.6507352446
"フラ-パリ スペ-トル", 2.28184822101, -86.205255126
"トル-中国 フラ-パリ", 2.28487227775, 78.5665345158
"フラ-パリ イタ-ロシ", 2.28532019534, -85.919755488
"モス-ベル フラ-パリ", 2.28725394739, -89.1285132141
"ポー-トル フラ-パリ", 2.29327426639, 89.9117470098
"アン-ベル フラ-パリ", 2.29551262267, 76.5653257051
"フラ-パリ ギリ-ポー", 2.29600152013, 87.4565073627
"トル-ポー フラ-パリ", 2.29665435193, -89.9121679271
"ワル-モス フラ-パリ", 2.30824106185, 88.2155567828
"ロシ-北京 フラ-パリ", 2.31161776739, 59.9386289967
"ドイ-首都 フラ-パリ", 2.32147076181, 66.2737290056
"フラ-パリ ポル-トル", 2.32881390282, -85.3187607578
"国家-パリ フラ-パリ", 2.33026987052, 54.8507519135
 (以下省略)

この2つの表を比較しても、まだ重なっている部分がある。

更によく見てみると、「その他」群の中で距離の小さいデータは、"フラ-パリ"ではないもう一方の差分の中に、「パリ」もしくは「フラ」を含んでいるものが多くみられる。

そこで、「パリ」もしくは「フラ」を含んでいる差分を除去してみる。その理由は、<パリ−フランス+(パリ以外のどこかの国の首都)>という計算を想定すると、「もう一方の差分」にはパリやフランスが入ることは無いから、である。上記の表の右端に「×」を付けたのが、除外すべき行である。残ったエントリは541個であった。

"ドイ-モス フラ-パリ", 1.48147760284, 43.945126143
"ポー-モス フラ-パリ", 1.6867521235, 50.8183966766
"フラ-パリ イタ-モス", 1.709358001, 54.0952369875
"トル-モス フラ-パリ", 1.7228956802, 51.5103866432
"ドイ-ワル フラ-パリ", 1.72788733633, 49.2655836854
"フラ-パリ スペ-モス", 1.74687173736, 53.2462053935
"トル-リス フラ-パリ", 1.77377641275, 54.0348015375
"フラ-パリ イタ-ベル", 1.81452041079, 56.3599310832
"ドイ-イタ フラ-パリ", 1.84203397826, 71.5460326438
"フラ-パリ ギリ-モス", 1.85282576968, 52.636331554
"ロシ-ベル フラ-パリ", 1.86579136509, 55.7495232441
"ドイ-ロシ フラ-パリ", 1.92273725306, 75.9103322551
"トル-ワル フラ-パリ", 1.92434128525, 55.5883426575
"ポー-ベル フラ-パリ", 1.94578671811, 55.4632743197
"ロシ-ワル フラ-パリ", 1.94864869846, 57.4712572688
"フラ-パリ スペ-リス", 1.94932361551, 58.2914627983
"トル-ベル フラ-パリ", 1.98191494789, 56.0316319291
"フラ-パリ スペ-ベル", 1.98378268228, 57.4292033268
"フラ-パリ ポル-モス", 1.98811058622, 57.5436381545
"ドイ-リス フラ-パリ", 2.00327831346, 54.4805417536
"フラ-パリ イタ-リス", 2.00710723006, 60.8375410044
"フラ-パリ スペ-ポル", 2.01041273071, 88.4524021546
"フラ-パリ スペ-イタ", 2.02270439105, 84.6561881589
"フラ-パリ イタ-ワル", 2.03876825704, 60.3050017051
"トル-イタ フラ-パリ", 2.03879385956, 81.448978723
"ロシ-リス フラ-パリ", 2.04065683386, 59.7683207902
"フラ-パリ ギリ-リス", 2.04077328767, 57.096351867
"フラ-パリ ポル-スペ", 2.05256970632, -88.4528230719
"トル-ロシ フラ-パリ", 2.05342611269, 85.2174263639
"フラ-パリ ギリ-ベル", 2.06927232988, 56.1541686764
"ドイ-アン フラ-パリ", 2.07277039599, 61.439076459
"ポー-リス フラ-パリ", 2.07499691775, 58.6566819293
"フラ-パリ ギリ-トル", 2.07531933922, 86.4567036762
"アン-モス フラ-パリ", 2.08165125677, 73.71763126
"フラ-パリ ギリ-ロシ", 2.0874731231, 82.7681900817
"フラ-パリ ギリ-イタ", 2.09312169916, 79.7786772791
"フラ-パリ ギリ-ワル", 2.10263980233, 57.013162229
"フラ-パリ ギリ-アン", 2.10925701777, 64.2446317071
"ドイ-スペ フラ-パリ", 2.11357406811, 79.0420739125
"ポー-イタ フラ-パリ", 2.11654263366, 82.2097747536
"ポー-アン フラ-パリ", 2.12292273215, 65.6528110868
"ドイ-トル フラ-パリ", 2.12994874209, 81.8528983106
"フラ-パリ スペ-アン", 2.13091333024, 67.4037612477
"ドイ-ポー フラ-パリ", 2.13695647694, 81.9900110196
"フラ-パリ ギリ-ポル", 2.13705740698, 82.6753913096
"ロシ-イタ フラ-パリ", 2.13962287796, 85.9193345707
"フラ-パリ ギリ-スペ", 2.13977636607, 83.5388383577
"フラ-パリ スペ-ワル", 2.14540038953, 60.0659433364
"トル-スペ フラ-パリ", 2.14615251711, 86.2048342087
"トル-ポル フラ-パリ", 2.15667115377, 85.3183398405
"フラ-パリ ポル-イタ", 2.15891233897, 86.6503143273
"ロシ-アン フラ-パリ", 2.16556468325, 68.0033563232
"フラ-パリ ポル-マド", 2.17373964151, 59.6517550997
"フラ-パリ イタ-スペ", 2.19015442433, -84.6566090762
"トル-ギリ フラ-パリ", 2.19054657415, -86.4571245935
"フラ-パリ ポル-アン", 2.19580799567, 68.6700157745
"ポー-ロシ フラ-パリ", 2.20462251033, 86.0828855785
"トル-首都 フラ-パリ", 2.20520776931, 68.6902910623
"ロシ-トル フラ-パリ", 2.20865581084, -85.2178472812
"フラ-パリ イタ-マド", 2.2155382078, 61.4037749971
"フラ-パリ イタ-アン", 2.23776913395, 70.644483401
"フラ-パリ ポル-ベル", 2.24353914467, 61.2421588232
"フラ-パリ ポル-ワル", 2.24369083711, 61.6713441298
"アン-リス フラ-パリ", 2.24494855526, 78.1498504742
"ドイ-ギリ フラ-パリ", 2.2450098725, 85.0103136361
"フラ-パリ スペ-ロシ", 2.24707926272, 89.6365614076
"ベル-モス フラ-パリ", 2.25443570955, 89.1280922967
"アン-ワル フラ-パリ", 2.25472189063, 76.8065755914
"ロシ-スペ フラ-パリ", 2.26055440687, -89.6369823249
"ドイ-ポル フラ-パリ", 2.26059719338, 79.7708728436
"ポー-ポル フラ-パリ", 2.26273728567, 85.7932968687
"ポー-スペ フラ-パリ", 2.27101234684, 86.6713137827
"トル-マド フラ-パリ", 2.27136064732, 59.0849598046
"フラ-パリ イタ-ポル", 2.27926803704, -86.6507352446
"フラ-パリ スペ-トル", 2.28184822101, -86.205255126
"トル-中国 フラ-パリ", 2.28487227775, 78.5665345158
"フラ-パリ イタ-ロシ", 2.28532019534, -85.919755488
"モス-ベル フラ-パリ", 2.28725394739, -89.1285132141
"ポー-トル フラ-パリ", 2.29327426639, 89.9117470098
"アン-ベル フラ-パリ", 2.29551262267, 76.5653257051
"フラ-パリ ギリ-ポー", 2.29600152013, 87.4565073627
"トル-ポー フラ-パリ", 2.29665435193, -89.9121679271
"ワル-モス フラ-パリ", 2.30824106185, 88.2155567828
"ロシ-北京 フラ-パリ", 2.31161776739, 59.9386289967
"ドイ-首都 フラ-パリ", 2.32147076181, 66.2737290056
"フラ-パリ ポル-トル", 2.32881390282, -85.3187607578
距離「正しい対」の頻度分布その他全ての対の頻度分布
ユークリッドlist-capital2-good-フラパリ-euc-hist.pnglist-capital2-other-フラパリ-euc-hist.png
コサインlist-capital2-good-フラパリ-cos-hist.pnglist-capital2-other-フラパリ-cos-hist.png

ファイルは、プログラム

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# filterrelevant.py
# 差分間の距離ファイルを読んで、自明な組合せを取り除くフィルタ
# たとえば、"フラ-パリ"と入れると、一方の差分が"フラ-パリ"だが、もう一方の
# 差分には"フラ"もしくは"パリ"は含まないものだけを抜き出す。

import sys, string, codecs
import numpy as np
import scipy.cluster.hierarchy
import matplotlib
from matplotlib.pyplot import show
import math
font = {'family': 'VL Gothic',
        'size': '9' }
matplotlib.rc('font', **font)

sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
argvs = sys.argv;  argc = len(argvs)

# 差分ベクトル間の距離データファイルを読み込む
# 形式は、"フラ-パリ 中国-北京", 2.3232, 62.365
#infname = 'list-capital2-other-dist'
try:
  infname = argvs[1]
  inword1 = argvs[2].decode('utf-8')
  inword2 = argvs[3].decode('utf-8')

except IndexError:
  print u'  filterrelevant.py 入力ファイル名 単語1 単語2'
  exit()
[fname,fext] = infname.split('.')
if fext!='dist':
  print "input file extension '" + fext + "' is invalid (not 'dist')"
  exit()

######### 入力ファイルを読んで、表を再構築する ##########
try:
  data = codecs.open(infname, 'r', encoding='utf-8').readlines()
except IOError:
  print u'  入力ファイル ' + infname + u' が見つかりません'
  exit()

outfname = fname + '-' + inword1 + inword2 + '.dist'
outf = codecs.open(outfname, 'w', encoding='utf-8')

pairword = inword1 + '-' + inword2
inwords = [inword1, inword2]
distarray = []

for line in data:
  u = line.split(',')

  (pair1, pair2) = u[0].strip('"').split(' ')
  if (pair1 == pairword):
     [w1,w2] = pair2.split('-')
     if not ( ( w1 in i nwords ) or ( w2 in inwords) ):
       outf.write(line)

  if (pair2 == pairword):
     [w1,w2] = pair1.split('-')
     if not ( ( w1 in inwords ) or ( w2 in inwords) ):
        outf.write(line)

を用いて

grep "フラ-パリ" list-capital2-good.dist > list-capital2-good-フラパリ.dist
filterrelevant.py list-capital2-other.dist フラ パリ

のように処理をして作成した。また、グラフはRを用いて

> good <- read.csv("list-capital2-good-フラパリ.dist", sep=',', header=FALSE, row.names=1)
> other <- read.csv("list-capital2-other-フラパリ.dist", sep=',', header=FALSE, row.names=1)
> hist(other[,1], xlim=c(0,5), break=15)
> hist(good[,1], xlim=c(0,5), break=15)
> hist(good[,2], xlim=c(-90,90), ylim=c(0,5), breaks=34)
> hist(other[,2], xlim=c(-90,90), ylim=c(0,70), breaks=34)

のようにして描いた。

多次元尺度法(根本くん提案)では? (2015-02-20)

cap <- read.table("list-capital.out",header=F,row.names=1)
dcap <- dist(cap)
ccap <- cmdscale(cap)
plot(cccap, type="n")
text(ccap,rownames(ccap))

list-capital-cmdscale.png

ここで第2次元の厚みが非常に薄いことが気になる。

同じ処理を、今度は、isaファイル、つまりグループ名とアイテムが入っているデータで試す。しかも、3種類(動物、果物、都市)が入っている。

isa-mam-cap-fru-cmdscale.png

前と同様に第2次元の厚みが薄いこと、さらに、種類グループによって、なんとなく3つに集まっていること(動物名称と「動物」、果物名称と「果物」、都市名と「都市」)が見える。


>> ノート/テキストマイニング/gensim-word2vecでベクトル空間を試す(4)


添付ファイル: fileisa-mam-cap-fru-cmdscale.png 243件 [詳細] filelist-capital-cmdscale.png 228件 [詳細] filelist-capital2-good-フラパリ-euc-hist.png 221件 [詳細] filelist-capital2-other-フラパリ-euc-hist.png 224件 [詳細] filelist-capital2-other-フラパリ-cos-hist.png 225件 [詳細] filelist-capital2-good-フラパリ-cos-hist.png 220件 [詳細] filelist-capital2-good-cos-hist.png 228件 [詳細] filelist-capital2-other-euc-hist.png 274件 [詳細] filelist-capital2-other-cos-hist.png 244件 [詳細] filelist-capital2-good-euc-hist.png 234件 [詳細] filelist-capital2-paired-diff-hc.png 230件 [詳細] fileotoko-onnna.png 243件 [詳細] filelist-capital2-pc.png 228件 [詳細] fileisa-fru-mam-cap_diff.png 274件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-02-24 (火) 10:30:43 (906d)