估计句子之间“近似”语义相似性的一些好方法是啥?
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现在风靡一时。以上是关于估计句子之间“近似”语义相似性的一些好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章