繁体   English   中英

如何提高python中的词移动距离相似度并使用加权句子提供相似度得分

[英]How to improve word mover distance similarity in python and provide similarity score using weighted sentence

Word movers 距离可用于识别文本之间的相似性。 这种相似性可用于比较多个文本以查找最近的相似文本。 但是,我无法自定义算法来执行以下操作 1) 消除位置 (GPE) - 由 spacy 识别,在文本中比较相似性时具有任何权重。 2)对文本第一句中的特征给予更多权重,而不是在第二句和第二句中的特征上给予更多权重,依此类推。

instance = WmdSimilarity(wmd_corpus, loaded_model, num_best=10)
start = time()
sent = 'Abc hotel serves best in class drunken prawn in north america . ABC Hotel has branches in London, New York, Chicago and San Francisco.'
query = preprocess(sent)

sims = instance[query]  # A query is simply a "look-up" in the similarity class.

print('Cell took %.2f seconds to run.' % (time() - start))

print('Query:')
print(sent)
for i in range(num_best):
    print()
    print('sim = %.4f' % sims[i][1])
    print(documents[sims[i][0]])

在这个特殊的例子中,酒店描述被传递用于 WMD 相似性,结果识别描述,如

-DEF 是芝加哥的一家餐厅,自 1969 年以来一直供应纯素食品。 - JKL 现已在伦敦、纽约、芝加哥和旧金山提供服务 - 酒店的畅销品包括醉虾、千层面等。 (MNO酒店)

预期结果 上述结果中只有 MNO 酒店与食物方面相关。

查询:如何排除因位置映射的其他酒店?

这个问题已经很老了,但我会尝试回答它,因为我遇到了类似的问题,并且我认为 WMD 仍然是文本的 STOA 相似性指标之一。

你确定你在使用 spacy 吗? 看起来您正在使用gensimWMD 无论如何,要回答您的第二个问题:您可以使用任何 NLP 库在句子中解析和拆分您的公司描述。 然后,您可以为每个句子创建嵌入,而不是为当前实现中的每个文档(整个描述)创建嵌入。 Gensim 在上面的链接中使用 Word2vec - 您也可以使用它来获取嵌入。 然后,您可以根据他们的句子比较两家公司,当两家公司的第一个句子的向量匹配时,您可以赋予更高的权重,当他们的第二个句子匹配时,权重略低,等等。我不知道任何现有的库这样做,但是如果您在 spacy 之上实现它,您将可以根据需要自由调整权重和逻辑。

关于你的第一个问题:我认为 WMD 应该考虑位置,因为 ABC 不仅在食物方面类似于 MNO,而且在它们的共同位置方面也类似于 JKL 和 DEF。 删除文本的位置将在相似性结果中产生偏差。

如果你想这样做,你可以只标记文本,删除位置,然后再次创建文本字符串:例如:

# This can be part of your preprocessing function.
# You can apply it to all companies in advance.
import spacy
spacy_nlp = spacy.load('en_core_web_lg')
text = "Some hotel description"
doc = spacy_nlp(text)
current_tokens = [token.text for token in doc]
for item in doc:
   if item.ent_type_ == "the_type_to_be_removed":
     # remove word from `current_tokens` list
new_text = " ".join(current_tokens)
doc = spacy_nlp(new_text)
...
...

import wmd
spacy_nlp.add_pipe(wmd.WMD.SpacySimilarityHook(spacy_nlp), last=True)
doc_2 = spacy_nlp("Another hotel description")
print(doc1.similarity(doc_2))

是 WMD 集成到 spacy 中的实现。

由于您正在寻找最接近的相似文本,您可以查看示例代码。 您可以调用一个nearest_neighbors函数来获取与基于WMD 的查询文本相似的文本。您还可以定义自己的嵌入,如在class SpacyEmbeddings看到的class SpacyEmbeddings ,以防您创建新的嵌入,这些嵌入特别适合您的用例的句子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM