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

Posted

技术标签:

【中文标题】Python:字符串的语义相似度得分【英文标题】:Python: Semantic similarity score for Strings [duplicate] 【发布时间】:2013-06-06 00:55:32 【问题描述】:

是否有任何库可以计算一对句子的语义相似度分数?

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

我发现work 正在进行中,它是使用 .NET 框架编写的,该框架使用一系列预处理步骤计算分数。 有没有在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 的余弦,首先对一个句子进行矢量化,然后计算两个向量之间的余弦 如果您希望将某项加权作为临界值或迫切需要分数,请考虑 NLTK 的 wup 相似性。您需要使用 CLIPS 模式之类的东西来获取类型(动词、名词、adj 等)。您可以使用它来实际找到在 gensim 或 Kmeans 的模糊/余弦实现中找到的 LSA/LDA 类别的完美数量。 【参考方案1】:

我见过的最好的包是 Gensim,可以在 Gensim Homepage 找到。我已经用过很多次了,总体上对它的易用性非常满意;它是用 Python 编写的,并且有一个易于遵循的 tutorial 来帮助您入门,它比较 9 个字符串。它可以通过 pip 安装,所以我希望安装它不会有太多麻烦。

您使用哪种评分算法在很大程度上取决于您的问题的上下文,但如果您想要一些基本的东西,我建议您从 LSI 功能开始。 (这就是本教程将引导您完成的内容。)

如果您阅读 gensim 教程,它将引导您使用相似度函数比较两个字符串。这将允许您根据它们所包含的文本来查看您的 sting 彼此之间或与其他一些 sting 之间的比较情况。

如果您对其工作原理背后的科学感兴趣,请查看this paper.

【讨论】:

这看起来很有希望。感谢您指出贾斯汀。【参考方案2】:

不幸的是,我无法在 PY 方面为您提供帮助,但您可以查看我的旧项目,该项目使用字典来完成句子之间的语义比较(稍后可以在 PY 中进行编码以实现向量空间分析)。从 JAVA 翻译成 PY 应该只需要几个小时的编码。 https://sourceforge.net/projects/semantics/

【讨论】:

【参考方案3】:

AFAIK 最强大的 Python NLP-Lib 是 http://nltk.org/

【讨论】:

NLTK 在一对单词概念之间的语义相似性方面有大约 6 分,但我希望比较两个字符串(几个,可能是数百个单词) 与问题无关

以上是关于Python:字符串的语义相似度得分的主要内容,如果未能解决你的问题,请参考以下文章

BM25算法语义相似度计算

如何抓取语义相似的句子

在python中计算单词相似度得分

自然语言处理(NLP)基于PaddleNLP的短文本相似度计算

Java之词义相似度计算(语义识别词语情感趋势词林相似度拼音相似度概念相似度字面相似度)

Java之词义相似度计算(语义识别词语情感趋势词林相似度拼音相似度概念相似度字面相似度)