如何在python中改善移词器距离相似度并使用加权句子提供相似度得分

时间:2019-02-05 13:28:16

标签: python algorithm text nlp spacy

动词器距离可用于识别文本之间的相似性。 这种相似性可用于比较多个文本以查找最接近的相似文本。 但是,我无法自定义算法来执行以下操作 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酒店与饮食方面有关。

查询: 如何消除由于位置而映射的其他酒店?

1 个答案:

答案 0 :(得分:0)

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

确定要使用spacy吗?您似乎正在使用WMD by gensim。 无论如何,要回答您的第二个问题:您可以使用任何NLP库以句子的形式解析和拆分公司描述。然后,您可以为每个句子创建嵌入,而不是为当前实现中的每个文档(整个描述)创建嵌入。 Gensim在上述链接中使用了Word2vec-您也可以使用它来获取嵌入。然后,您可以根据两家公司的句子进行比较,当两家公司的第一句向量匹配时,您可以赋予较高的权重,第二句的向量匹配时可以给予较低的权重,以此类推。我不知道任何现有的库这样就可以了,但是如果您在spacy之上实现它,则可以自由调整权重和逻辑。

关于您的第一个问题:我认为大规模杀伤性武器应该考虑地点,因为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))

This是将WMD集成到spacy中的实现。

由于您要查找最接近的相似文本,因此可以查看this示例代码。您可以调用一个nearest_neighbors函数,以将与WMD为基础的查询文本相似的文本。您还可以定义自己的嵌入,如在class SpacyEmbeddings中看到的那样,以防创建新的嵌入而有利于专门针对您的用例的句子。