输入:短语1,短语2
输出:语义相似度值(介于0和1之间),或这两个短语谈论同一事物的概率
您可以查看本文:
基于语义网和语料库统计的句子相似度(PDF)
我已经实现了所描述的算法.我们的背景非常笼统(实际上是任何两个英语句子),我们发现所采用的方法太慢而且结果虽然很有希望,但还不够好(或者可能没有相当大的额外努力).
你没有给出很多背景信息,所以我不一定会推荐这个,但阅读本文对你理解如何解决这个问题很有帮助.
问候,
马特.
对此有一个简短的答案.
简短的回答:
使用WordNet :: Similarity Perl包.如果Perl不是您选择的语言,请查看普林斯顿的WordNet项目页面,或谷歌搜索包装库.
答案很长:
确定单词相似性是一个复杂的问题,在这方面的研究仍然很热.要计算相似性,您需要适当地表达单词的含义.但是,例如"椅子"的含义是什么呢?其实,什么是 "椅子"的确切含义是什么?如果你认真思考这个问题,它会扭曲你的思想,你会有点疯狂,最后在哲学或计算语言学研究生涯中寻找真理.哲学家和语言学家都试图在数千年的时间里找到答案,并且看不到尽头.
因此,如果您有兴趣更深入地探讨这个问题,我强烈建议您阅读Jurafsky和Martin的语音和语言处理中的第20.7章,其中一些可以通过Google Books获得.它非常好地概述了分布式方法的最新技术,它使用单词共现统计来定义单词相似性的度量.但是,您不太可能找到实现这些的库.
您可能想要查看普林斯顿大学的WordNet项目.一种可能的方法是首先通过一个停用词列表运行每个短语(删除"常用"词,如"a","to","the"等)然后对于每个剩余的词.每个短语,您可以使用基于WordNet的距离度量来计算另一个短语中每个单词之间的语义"相似度".距离度量可能类似于:您必须在WordNet中通过以从word1到word2的弧数.
对不起,这是相当高级别的.我显然从未尝试过这个.只是一个快速的想法.
我会研究潜在的语义索引.我相信你可以创建类似于向量空间搜索索引的东西,但语义相关的术语更接近,即它们之间的角度更小.如果我了解更多,我会在这里发布.
对于刚来这里的人,我建议看看SEMILAR - http://www.semanticsimilarity.org/.他们实施了许多用于计算单词和句子相似度的现代研究方法.它是用Java编写的.
SEMILAR API提供了基于Wordnet,潜在语义分析(LSA),潜在Dirichlet分配(LDA),BLEU,流星,逐点互信息(PMI),基于依赖性的方法,基于二次分配的优化方法等的各种相似性方法.相似性方法以不同的粒度工作 - 单词,单词,句子或更大的文本.