估计句子之间“近似”语义相似性的一些好方法是啥?

Posted

技术标签:

【中文标题】估计句子之间“近似”语义相似性的一些好方法是啥?【英文标题】:What are some good ways of estimating 'approximate' semantic similarity between sentences?估计句子之间“近似”语义相似性的一些好方法是什么? 【发布时间】:2011-09-29 09:34:21 【问题描述】:

在过去的几个小时里,我一直在查看 SO 上的 nlp 标签,我相信我没有错过任何东西,但如果我错过了,请务必指出问题。

不过,与此同时,我将描述我正在尝试做的事情。我在许多帖子中观察到的一个常见概念是语义相似性很困难。例如,来自this 的帖子,接受的解决方案建议如下:

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-gram,还是来自 wordnet 的东西,或者只是单个词干或其他东西?

This 线程在枚举所有相关技术方面做得非常出色,但不幸的是,当帖子达到我想要的时候就停止了。关于该领域最新的最新技术有什么建议吗?

【问题讨论】:

【参考方案1】:

Latent Semantic Modeling 可能很有用。它基本上只是Singular Value Decomposition 的另一个应用程序。 SVDLIBC 是这种方法的一个相当不错的 C 实现,它是一个老东西但很好,甚至还有sparsesvd 形式的 python 绑定。

【讨论】:

在scikit-learn 中还提供了用于稀疏矩阵的 SVD 的 Python 实现,即 scikits.learn.utils.extmath.fast_svd【参考方案2】:

我建议您尝试使用 Latent Dirichlet Allocation (LDA) 等主题建模框架。那里的想法是文档(在您的案例中,这可能被证明是一个问题)是从一组潜在的(隐藏的)主题中生成的; LDA 检索这些主题,用词簇表示它们。

implementation of LDA in Python 作为免费 Gensim 软件包的一部分提供。您可以尝试将其应用于您的句子,然后在其输出上运行 k-means。

【讨论】:

是的,我认为LDA现在风靡一时。

以上是关于估计句子之间“近似”语义相似性的一些好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何度量两个词之间的语义相似度

测量两个短语之间的语义相似性[关闭]

如何抓取语义相似的句子

自然语言处理中句子相似度计算的几种方法

2句语义相似度的度量[重复]

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