Python: 字符串的语义相似度得分

47

有没有用于计算一对句子语义相似度分数的库?

我知道WordNet的语义数据库,以及如何为2个单词生成分数,但我正在寻找能够针对整个句子执行所有预处理任务(如端口词干提取、停用词删除等)并输出两个句子相关程度得分的库。

我发现了一个使用.NET框架编写的work,它使用一系列预处理步骤计算分数。是否有Python项目可以做到这一点?

我不是在寻找可以帮助我找到分数的操作序列(就像here所要求的那样)
我很乐意自己实现每个阶段,或者将来自不同库的函数粘合在一起,以便它适用于句子对,但我主要需要这个作为测试数据推理的工具。


编辑:我考虑使用NLTK计算遍历两个句子中每对单词的得分,然后从结果的标准偏差中推断,但我不知道这是否是相似度的合法估计。此外,对于长字符串,这将需要大量时间。
再次强调,我正在寻找已经智能实现这一点的项目/库。让我可以这样做:

import amazing_semsim_package
str1='Birthday party ruined as cake explodes'
str2='Grandma mistakenly bakes cake using gunpowder'

>>similarity(str1,str2)
>>0.889

考虑使用基于向量的语义模型或矩阵分解模型来比较句子相似度。如果不行,可以退而求其次采用类Lesk的余弦方法,先将句子向量化,然后计算两个向量之间的余弦值。 - alvas
如果您想将某些内容作为截止点进行加权或者迫切需要得分,请考虑使用NLTK的wup相似度。您需要使用类似CLIPS模式的东西来获取类型(动词、名词、形容词等)。您可以使用这个来找到LSA/LDA的完美分类数量,就像在gensim中找到的那样,或者使用Kmeans的模糊/余弦实现。 - Andrew Scott Evans
3个回答

52
我见过的最好的这个领域的软件包是Gensim,可以在Gensim主页找到。我已经多次使用,并对其易用性感到非常满意;它是用Python编写的,并且有一个易于跟随的教程来帮助您入门,其中比较了9个字符串。它可以通过pip安装,因此您不必花费很多精力来安装。
您使用哪种评分算法取决于问题的上下文,但如果您想要基本功能,我建议从LSI(潜在语义索引)功能开始。(教程会指导你完成这个步骤。)
如果您按照gensim的教程进行操作,它将通过使用Similarities函数来指导您比较两个字符串。这将允许您根据它们所包含的文本内容,看到您的字符串相互比较或与其他字符串相比较的情况。
如果您对其工作原理感兴趣,请查看这篇论文。

这看起来非常有前途。感谢您指出这一点,Justin。 - user8472

5

很遗憾,我无法帮助您处理PY相关的问题。但您可以参考我的旧项目,在其中使用字典完成句子语义比较(之后可以使用向量空间分析方法在PY中实现)。只需要几个小时的编码工作,就能从JAVA转换到PY。

https://sourceforge.net/projects/semantics/

-4

4
NLTK有6个用于比较一对单词概念之间语义相似性的分数,但我想比较两个字符串(由多个单词组成,可能有几百个单词)。 - user8472
1
not relevant to question - Kukesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接