0

この問題を攻撃する方法がわかりません。

ドキュメントに表示される単語、タグ、および番号を含む3つのリストがあります。

v1 = [['be', 'VSIS3S0', 1], ['scott', 'NP00000', 2], ['north', 'NCMS000', 1], ['revolution', 'NP00000', 1], ['name', 'VMP00SM', 1]]
v2 = [['mechanic', 'NCMS000', 1], ['be', 'VSIS3S0', 1], ['tool', 'AQ0CS0', 1], ['sam', 'NP00000', 1], ['frida', 'NP00000', 1]]
v3 = [['be', 'VSIP3S0', 1], ['scott', 'NP00000', 1], ['who', 'NP00000', 1]]

これらのリストを受け取って各単語を比較し、たとえば単語beinが 3 つのリストに 1 回表示されるようにする関数を作成するにはどうすればよいですか。その場合、結果リストにv1追加します。(1 * log(3/3))サブリストの 3 番目の要素)、対数分子 3 -> 定数、対数分母 3 -> 単語がv1v2およびに現れるためv3

次に、scott-> この場合、結果リスト(2 * log(3/2))2 に追加します -> 単語の出現の最大値、対数分子 3 -> 定数、対数分母 2 -> 'scott' という単語がv1およびに現れるためv2です。

次に、north-> この場合、結果リストに追加します(1 * log(3/1)), 1 -> 単語の出現の最大値, 対数分子 3 -> 定数, 対数分母 1 -> 単語「北」のみが出現するためv1.

次に、revolution-> この場合、結果リストに追加します(1 * log(3/1)), 1 -> 単語の出現の最大値, 対数分子 3 -> 定数, 対数分母 1 -> 単語「北」のみが出現するためv1.

次に、name-> この場合、結果リスト(1 * log(3/1))に追加します 1 -> 単語の出現の最大値、対数分子 3 -> 定数、対数分母 1 -> '名前' という単語のみが出現するためv1です。

さらに、、 、 などを他の単語とv2比較して同じことを行う必要があります。出現の最大値を計算し、その単語が および に出現するかどうかに応じて乗算します。mechanicbetoolw/ log(3/?)v1v3

これは私の試みですv1

def f1(v1, v2, v3):
    res =[]
    for e in v1:
        if e != 0:
            if e in v2 and e in v3:
                res.append(0)
            elif e in v2:
                res.append(e * math.log(3/2))
            else:
                res.append(e * math.log(3))
    return res  

戻る:[0, 2.1972245773362196, 0, 0, 0, 0]

これは明らかに結果ではありません

次のようなものを返す必要があります。

[['be', 0.47], ['scott', 0.35 ], ['north', 0.47], ['revolution', 0.47], ['north', 0.47]]
4

1 に答える 1

0

あなたの説明に応じて、私は得ました

import math
v1 = [['be', 'VSIS3S0', 1], ['scott', 'NP00000', 2], ['north', 'NCMS000', 1], ['revolution', 'NP00000', 1], ['name', 'VMP00SM', 1]]
v2 = [['mechanic', 'NCMS000', 1], ['be', 'VSIS3S0', 1], ['tool', 'AQ0CS0', 1], ['sam', 'NP00000', 1], ['frida', 'NP00000', 1]]
v3 = [['be', 'VSIP3S0', 1], ['scott', 'NP00000', 1], ['who', 'NP00000', 1]]

v = [v1,v2,v3]

countdict = {}
for vi in v:
    for e in vi:
        countdict[e[0]] = countdict.get(e[0],0) + 1

scoredict = {}
for vi in v:
    for e in vi:
        scoredict[e[0]] = scoredict.get(e[0],0) + (e[2] * math.log10(3.0/countdict[e[0]]))

print scoredict

出力をdictとして保存します。これは次のとおりです。

{'be': 0.0, 'revolution': 0.47712125471966244, 'north': 0.47712125471966244, 'name': 0.47712125471966244, 'sam': 0.47712125471966244, 'tool': 0.47712125471966244, 'who': 0.47712125471966244, 'scott': 0.5282737771670437, 'mechanic': 0.47712125471966244, 'frida': 0.47712125471966244}
于 2013-08-29T07:30:50.463 に答える