Почему выходные данные model.wv.simility () в Word2Vec отличаются от model.wv.simil ()? - PullRequest
0 голосов
/ 17 октября 2018

Я обучил модель Word2Vec и пытаюсь ее использовать.Когда я ввожу наиболее похожие слова '动力', я получаю следующий вывод:

动力系统 0.6429724097251892
驱动力 0.5936785936355591
动能 0.5788494348526001
动力车 0.5579575300216675
引擎 0.5339343547821045
推动力 0.5152761936187744
扭力 0.501279354095459
新动力 0.5010953545570374
支撑力 0.48610919713974
精神力量 0.47970670461654663

Но проблема в том, что если я введу model.wv.similarity('动力','动力系统'), я получу результат 0.0, который не равен

0.6429724097251892

Что меня больше смутило, так это то, что когда я получил следующее сходство слов '动力' и слова '驱动 力', оно показало

3.689349e+19

Так почему?Я сделал недоразумение со сходством?Мне нужен кто-то, чтобы сказать мне!И код:

res = model.wv.most_similar('动力')
for r in res:
    print(r[0],r[1])
print(model.wv.similarity('动力','动力系统'))
print(model.wv.similarity('动力','驱动力'))
print(model.wv.similarity('动力','动能'))

вывод:

动力系统 0.6429724097251892
驱动力 0.5936785936355591
动能 0.5788494348526001
动力车 0.5579575300216675
引擎 0.5339343547821045
推动力 0.5152761936187744
扭力 0.501279354095459
新动力 0.5010953545570374
支撑力 0.48610919713974
精神力量 0.47970670461654663
0.0
3.689349e+19
2.0

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Это может быть проблема с кодировкой, когда вы на самом деле не сравниваете одни и те же токены.

Попробуйте выполнить следующее, чтобы увидеть, дает ли он результаты, близкие к ожидаемым.

res = model.wv.most_similar('动力')
for r in res:
    print(r[0],r[1])
print(model.wv.similarity('动力', res[0][0]))
print(model.wv.similarity('动力', res[1][0]))
print(model.wv.similarity('动力', res[2][0]))

Если это произойдет, вы можете подробнее узнать, почему модель может сообщать о строках, которые печатаются как动力系统 (и т. Д.), Но не соответствуют введенным строковым литералам, таким как '动力系统' (и т. Д.).Например:

print(res[0][0]=='动力系统')
print(type(res[0][0]))
print(type('动力系统'))
0 голосов
/ 18 октября 2018

Я написал функцию для замены метода model.wv.similarity.

def Similarity(w1,w2,model):
    A = model[w1]; B = model[w2]
    return sum(A*B)/(pow(sum(pow(A,2)),0.5)*pow(sum(pow(B,2)),0.5)

Где w1 и w2 - введенные вами слова, model - обучаемая вами модель Word2Vec.

0 голосов
/ 17 октября 2018

Использование метода подобия непосредственно из модели не рекомендуется.Он имеет немного дополнительной логики в том, что выполняет нормализацию вектора перед оценкой результата.Вы должны использовать vw напрямую, потому что, как указано в их документации, для векторов слов не имеет значения, как они обучались, поэтому их следует рассматривать в независимой структуре, модель - всего лишь средство для ее получения.

Вот краткое обсуждение , которое должно дать вам отправную точку, если вы хотите продолжить расследование.

...