[英]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 吗? 看起来您正在使用gensim的WMD 。 无论如何,要回答您的第二个问题:您可以使用任何 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.