输入:词组 1,词组 2
输出:语义相似度值(介于 0 和 1 之间),或者这两个短语谈论同一事物的概率
你可能想看看这篇论文:
我已经实现了描述的算法。我们的上下文非常笼统(实际上是任何两个英语句子),我们发现所采用的方法太慢了,结果虽然很有希望,但还不够好(或者在没有大量额外努力的情况下可能会如此)。
您没有提供很多背景信息,因此我不一定会推荐这一点,但阅读本文可能有助于您了解如何解决问题。
问候,
马特。
对此有一个简短的答案。
简短的回答:
使用WordNet::Similarity Perl 包。如果 Perl 不是您选择的语言,请查看普林斯顿的WordNet 项目页面,或在 google 上查找包装库。
长答案:
确定单词相似度是一个复杂的问题,该领域的研究仍然非常热门。要计算相似度,您需要适当地表示单词的含义。但是,“椅子”的含义是什么?事实上,“椅子”的确切含义是什么?如果您对此深思熟虑,它会扭曲您的思想,您会有点发疯,最终从事哲学或计算语言学的研究工作以找到真相™。几千年来,哲学家和语言学家都试图找到答案,而且看不到尽头。
因此,如果您有兴趣更深入地探索这个问题,我强烈建议您阅读 Jurafsky 和 Martin 在语音和语言处理中的第 20.7 章,其中一些可以通过Google 图书获得。它很好地概述了分布方法的最新技术,这些方法使用单词共现统计来定义单词相似度的度量。但是,您不太可能找到实现这些的库。
您可能想查看普林斯顿大学的WordNet项目。一种可能的方法是首先通过停用词列表运行每个短语(删除“常见”词,例如“a”、“to”、“the”等)每个短语,您可以使用基于 WordNet 的距离度量来计算另一个短语中每个单词之间的语义“相似性”。距离度量可能类似于:在 WordNet 中从 word1 到 word2 必须经过的弧数。
对不起,这是相当高级的。我显然从未尝试过这个。只是一个快速的想法。
对于刚来这里的人,我建议看看 SEMILAR - http://www.semanticsimilarity.org/。他们实施了许多现代研究方法来计算单词和句子的相似度。它是用 Java 编写的。
SEMILAR API 带有基于 Wordnet、潜在语义分析 (LSA)、潜在狄利克雷分配 (LDA)、BLEU、Meteor、逐点互信息 (PMI)、基于依赖的方法、基于二次分配的优化方法等的各种相似性方法。相似性方法适用于不同的粒度——单词到单词、句子到句子或更大的文本。
我会为此研究潜在语义索引。我相信您可以创建类似于向量空间搜索索引的东西,但语义相关的术语更接近,即它们之间的角度更小。如果我了解更多,我会在这里发帖。
很抱歉挖掘了一个 6 年前的问题,但是当我今天刚刚看到这篇文章时,我会给出一个答案,以防其他人正在寻找类似的东西。
cortical.io 开发了一个计算两个表达式语义相似度的过程,他们在他们的网站上有一个演示。他们提供了一个免费的 API 来提供对功能的访问,因此您可以在自己的应用程序中使用它,而无需自己实现算法。
一种简单的解决方案是使用字符 n-gram 向量的点积。这对排序更改(许多编辑距离度量不是)是稳健的,并且捕获了围绕词干提取的许多问题。它还可以防止完全语义理解的 AI 完全问题。
要计算 n-gram 向量,只需选择一个 n 值(例如 3),然后将短语中的每个 3 词序列散列到一个向量中。将向量归一化为单位长度,然后取不同向量的点积来检测相似度。
我会看看统计技术,考虑到每个单词出现在句子中的概率。这将使您对流行词(例如“and”、“or”、“the”)给予较低的重要性,而对出现较少的单词给予更多的重视,因此这是一个更好的区分因素。例如,如果您有两个句子:
1) smith-waterman 算法为您提供了两个字符串之间的相似性度量。2)我们已经审查了 smith-waterman 算法,我们发现它对于我们的项目来说已经足够好了。
这两个句子共享单词“smith-waterman”和单词“algorithms”(不像“and”、“or”等常见)这一事实将使您可以说这两个句子确实可能正在谈论同一个话题。
总而言之,我建议您看一下:1)字符串相似性度量;2)统计方法;
希望这可以帮助。
试试SimService,它提供计算前 n 个相似词和短语相似度的服务。
这要求您的算法实际上知道您在说什么。它可以通过比较单词和寻找同义词等以某种基本形式完成,但任何类型的准确结果都需要某种形式的智能。
看看http://mkusner.github.io/publications/WMD.pdf这篇论文描述了一种名为 Word Mover distance 的算法,它试图揭示语义相似性。它依赖于 word2vec 规定的相似度分数。将此与 GoogleNews-vectors-negative300 集成会产生理想的结果。