2194


現在word2vecのdistance.cを学習していますが、コサイン類似度計算部がよくわかりません。

[word2vecのdistance.c](https://gist.github.com/anonymous/051324db98614eaed22f)

現在pythonを用いて次のようなコードを書いています。

[自分で書いたpythonコード](https://gist.github.com/anonymous/1068397a74ef7bdeedf9)
（このコードを実行する際は、word2vecで270次元のベクトルを作成する必要があります。※オプションで -binary 0 指定の必要あり）

中でも、コサイン類似度を求める部分は次のようになっています。

[code]

        cos={} # コサイン類似度を格納する辞書型リストの初期化
        queryVec = vocab[query]
        # 全単語について探索する
        for word in vocab.keys():
            tlist = vocab[word]
            i = 0
            # 内積の初期化
            inpro = 0
            # 内積の計算
            for i in range(1,271):
                inpro = queryVec[i] *tlist[i]
            # 内積÷長さ
            cos[word] = inpro / (queryVec[0]*tlist[0])
    
[/code]

続いてソート部分です。ソート結果は毎回同じ単語の並びになってしまいます。

[code]

        # 上位N位を初期化
        i = 0
        bestd = {}
        for i in range(0,N):
            bestd[i]=[-1,'']
        count = 0
        # この中から上位N位を選出
        for word in vocab.keys():
            #print word,cos[word]
            a =0
            # 自分と同じ単語以外
            if query != word :
                for a in range(0,N):
                    if cos[word] > bestd[a][0] :
                        b = N-1
                        count +=1
                        for b in range(b,a,-1):
                            temp = bestd[b-1]
                            bestd[b] = temp
                        bestd[a] = [word,cos[word]]
                        break
                    a+=1
    
[/code]

結果例（3100さんの訂正後の結果です。input wordにどんな単語を用いても結果はこれになります）

[code]

    please input word >愛
    
    愛
                                              Word       Cosine　distance
    
[/code]

* * *
[code]

    20
                                            出産      0.353152
                                               團        0.178738
                                            仙界      0.262659
                                               土        0.295177
                                               園        0.140053
                                         遂げる        -0.178689
                                         シルク        0.286873
    
[/code]


CC BY-SA 3.0
2014-12-20T01:21:53.623
2177
2014-12-20T05:31:25.017
2014-12-20T04:49:05.943
2155
2155
question
python c word2vec 自然言語処理
word2vecのdistanceのソート部分（コサイン類似度）アルゴリズムについて

[code]

     for i in range(1,271):
            inpro = queryVec[i] *tlist[i]
    
[/code]

ここ、inproの値が毎回書き換わってますが、内積計算ということなので、加算していかないといけない気がしました。

[code]

     for i in range(1,271):
            inpro += queryVec[i] *tlist[i]
    
[/code]

またソートについては

[code]

    max = N
    for k,v in sorted(cos.items(), key=lambda x:x[1], reverse=True):
        if max == 0:
            break
        if query == v:
            continue
        print '%50s\t\t%f' % (k,v)
        max -= 1
    
[/code]

などとしたほうが処理がスッキリします。（まだ綺麗にする余地はあると思いますが)


CC BY-SA 3.0
2014-12-20T03:16:33.130
2194
2014-12-20T05:31:25.017
2014-12-20T05:31:25.017
3313
3313
2177
answer