Is there an algorithm that tells the semantic similarity of two phrases输入:词组1,词组2 输出:语义相似性值(0到1之间),或者这两个短语谈论同一件事的可能性 您可能想查看这篇文章: 基于语义网和语料统计的句子相似度(PDF) 我已经实现了所描述的算法。我们的上下文非常笼统(实际上是两个英文句子),并且我们发现所采用的方法太慢,结果虽然很有希望,但效果还不够好(或者如果没有大量额外的努力就可能如此)。 您没有提供太多背景信息,所以我不一定推荐这样做,但是阅读本文可能对您了解如何解决该问题很有用。 问候, 马特 这有一个简短的回答。 简短的答案: 使用WordNet :: Similarity Perl包。如果不是您选择的语言是Perl,请查看Princeton的WordNet项目页面,或在google上找到包装器库。 长答案: 确定单词的相似性是一个复杂的问题,在这个领域,研究仍然很热门。要计算相似度,您需要适当表达单词的含义。但是,"椅子"的含义将是什么呢?实际上,"椅子"的确切含义是什么?如果您对此进行漫长而艰苦的思考,将会使您产生疑惑,您会发疯,并最终从事哲学或计算语言学的研究事业以找到真相?哲学家和语言学家都试图提出一个真正的答案,这已经有数千年的历史了,而且没有尽头。 因此,如果您有兴趣更深入地研究这个问题,我强烈建议您阅读Jurafsky和Martin撰写的《语音和语言处理》第20.7章,其中一些内容可以通过Google图书获得。它很好地概述了最新的分布方法,这些方法使用词共现统计来定义词相似度的度量。但是,您不太可能找到实现这些功能的库。 您可能要检查普林斯顿大学的WordNet项目。一种可能的解决方法是首先通过停用词列表运行每个短语(以删除"常见"单词,例如" a"," to"," the"等),然后针对其中的其余每个单词每个词组,您都可以使用基于WordNet的距离度量来计算另一个词组中每个词之间的语义"相似性"。距离度量可能类似于:从Word1到word2必须在WordNet中通过的弧数。 抱歉,这是高级的。我显然从来没有尝试过。只是一个快速的想法。 对于刚接触此问题的任何人,我建议您看看SEMILAR-http://www.semanticsimilarity.org/。他们实现了许多用于计算单词和句子相似度的现代研究方法。它是用Java编写的。
我将为此研究潜在的语义索引。我相信您可以创建类似于矢量空间搜索索引的内容,但语义相关的术语会更靠近在一起,即它们之间的夹角较小。如果我了解更多信息,我会在这里发布。 抱歉,我提出了一个长达6年的问题,但是今天我刚看到这篇文章时,我会给出一个答案,以防其他人正在寻找类似的内容。 cortical.io开发了一种计算两个表达式的语义相似性的过程,他们在其网站上提供了一个演示。它们提供了免费的API,可以使用该功能,因此您可以在自己的应用程序中使用它,而无需自己实现算法。 一种简单的解决方案是使用字符n元语法向量的点积。这在排序更改(许多编辑距离度量标准未提供)方面很可靠,并且捕获了词干周围的许多问题。它还防止了完全语义理解的AI完全问题。 要计算n元语法向量,只需选取n的值(例如3),然后将短语中的每个3字序列哈希为向量即可。将向量归一化为单位长度,然后采用不同向量的点积来检测相似性。
这种方法已在 尝试SimService,它提供了用于计算前n个相似单词和短语相似度的服务。 我将看看统计技术,该技术考虑了每个单词出现在句子中的可能性。这将使您对诸如"和","或","该"之类的流行单词的重视程度降低,而对显得不太规则的单词给予更多重视,因此成为更好的区分因素。例如,如果您有两个句子:
1)Smith-waterman算法为您提供了两个字符串之间的相似性度量。 这两个句子共享单词" smith-waterman"和"算法"(不如" and"," or"等常见),这使您可以说这两个句子可能确实在谈论同一个话题。
总结一下,我建议您看一下: 希望这可以帮助。 这要求您的算法实际上知道您在说什么。可以通过比较单词和查找同义词等某种基本形式来完成,但是任何一种准确的结果都需要某种形式的智能。 看看http://mkusner.github.io/publications/WMD.pdf。本文描述了一种称为词移动距离的算法,该算法试图揭示语义相似性。它依赖于word2vec规定的相似性分数。将此与GoogleNews-vectors-negative300集成可获得理想的结果。 |