测量文档相似度


21

要对文档进行聚类(文本),您需要一种度量文档对之间相似度的方法。

两种选择是:

  1. 使用余弦相似度 -和TF / IDF作为术语权重,将文档作为术语向量进行比较。

  2. 使用f散度比较每个文档的概率分布,例如Kullback-Leibler散度

是否有任何直观原因会偏爱一种方法(假设平均文档大小为100个字)?

Answers:


23

对于文本文档,特征向量在任何标准表示(单词袋或TF-IDF等)下都可以具有很高的维数和稀疏性。直接在这种表示下测量距离可能不可靠,因为众所周知的事实是,在非常高的尺寸中,任何两个点之间的距离开始看起来都相同。解决此问题的一种方法是通过使用PCA或LSA(潜在语义分析;也称为潜在语义索引)来减少数据维数,然后测量新空间中的距离。在PCA上使用类似LSA的方法是有优势的,因为它可以在“语义概念”方面给出有意义的表示,除了在低维空间中测量距离。

基于概率分布的文档比较通常是通过首先计算每个文档的主题分布(使用Latent Dirichlet Allocation之类的方法),然后计算文档对的主题分布之间的某种差异(例如KL差异)来完成的。在某种程度上,它实际上类似于先进行LSA,然后使用向量之间的KL散度(而不是余弦相似度)来测量LSA空间中的距离。

KL散度是用于比较分布的距离度量,因此,如果文档表示形式是某种分布形式(通常是这种情况,例如,表示为按主题分布的文档,如LDA中那样),则可能更可取。还要注意,在这种表示形式下,特征向量中的条目总和为1(因为您基本上将文档视为主题或语义概念的分布)。

另请参阅此处相关主题


谢谢。LDA是否要求您事先了解主题?在我们的案例中,我们不知道每个文档都属于哪个主题,我们将使用相似性度量进行聚类(EM-G-Means或GAAC)
Joel 2010年

@ ebony1很好地引用了LSA,我前一段时间在stats.stackexchange.com/questions/369/…上也
chl

1
@Joel:不,LDA不假定您事先知道每个文档的主题。顺便说一句,顺便说一句,LDA将每个文档表示为主题的混合,而不仅仅是单个主题。因此,每个主题将对文档中的某个部分有所贡献(各个部分的总和为1)。基本上,LDA假定文档中的每个单词都是由某个主题生成的。
ebony1 2010年

@乌木-谢谢!冒重述问题和重复自己的危险,LDA是否要求您知道谨慎主题的数量?
乔尔2010年

是。但是,LDA(HDP-LDA)的某些变体不需要指定主题数。参见本文:cse.buffalo.edu/faculty/mbeal/papers/hdp.pdf
ebony1 2010年

0

您可能要尝试此在线服务以获取余弦文档相似性http://www.scurtu.it/documentSimilarity.html

import urllib,urllib2
import json
API_URL="http://www.scurtu.it/apis/documentSimilarity"
inputDict={}
inputDict['doc1']='Document with some text'
inputDict['doc2']='Other document with some text'
params = urllib.urlencode(inputDict)    
f = urllib2.urlopen(API_URL, params)
response= f.read()
responseObject=json.loads(response)  
print responseObject

2
请提供更多详细信息。
西安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.