估计句子间“近似”语义相似性的有效方法有哪些?

18 投票
2 回答
2400 浏览
提问于 2025-04-16 20:55

我在Stack Overflow上看了几个小时的nlp标签,觉得自己没有遗漏什么,但如果有的话,请告诉我。

不过,在此期间,我想描述一下我想做的事情。我注意到很多帖子提到语义相似性是个难题。例如,在这篇帖子中,接受的解决方案建议了以下内容:

First of all, neither from the perspective of computational 
linguistics nor of theoretical linguistics is it clear what 
the term 'semantic similarity' means exactly. .... 
Consider these examples:

Pete and Rob have found a dog near the station.
Pete and Rob have never found a dog near the station.
Pete and Rob both like programming a lot.
Patricia found a dog near the station.
It was a dog who found Pete and Rob under the snow.

Which of the sentences 2-4 are similar to 1? 2 is the exact 
opposite of 1, still it is about Pete and Rob (not) finding a 
dog.

我的高层次需求是利用k-means聚类,根据语义相似性对文本进行分类,所以我只需要知道它们是否大致匹配。例如,在上面的例子中,我可以把1、2、4、5归为一类,把3归为另一类(当然,3会有一些更相似的句子作为支持)。这就像是寻找相关的文章,但它们不需要100%相关。

我在想,我最终需要构建每个句子的向量表示,类似于它的指纹,但这个向量具体应该包含什么对我来说还是个未解之谜。是n-grams,还是来自wordnet的东西,或者只是单个的词根,还是其他什么呢?

这个讨论很好地列出了所有相关的技术,但不幸的是,在帖子到达我想要的内容时就停止了。有没有关于这个领域最新进展的建议?

2 个回答

2

我建议你试试一个叫做“主题建模”的工具,比如潜在狄利克雷分配(LDA)。这个工具的基本思想是,文档(在你的情况下是句子,这可能会有点问题)是从一组隐藏的主题中生成的;LDA可以找出这些主题,并用一些词的组合来表示它们。

在Python中,有一个免费的Gensim包里面包含了LDA的实现,你可以去试试。你可以把它应用到你的句子上,然后对它的输出结果运行一下k均值算法。

5

潜在语义建模(Latent Semantic Modeling)可能会很有用。简单来说,这就是另一种使用奇异值分解(Singular Value Decomposition)的方法。SVDLIBC是一个不错的C语言实现,虽然这个方法已经有些年头了,但依然很好用。而且,还有一个叫做sparsesvd的Python库,可以让你在Python中使用这个方法。

撰写回答