要对文档进行聚类(文本),您需要一种度量文档对之间相似度的方法。
两种选择是:
使用余弦相似度 -和TF / IDF作为术语权重,将文档作为术语向量进行比较。
使用f散度比较每个文档的概率分布,例如Kullback-Leibler散度
是否有任何直观原因会偏爱一种方法(假设平均文档大小为100个字)?
要对文档进行聚类(文本),您需要一种度量文档对之间相似度的方法。
两种选择是:
使用余弦相似度 -和TF / IDF作为术语权重,将文档作为术语向量进行比较。
使用f散度比较每个文档的概率分布,例如Kullback-Leibler散度
是否有任何直观原因会偏爱一种方法(假设平均文档大小为100个字)?
Answers:
对于文本文档,特征向量在任何标准表示(单词袋或TF-IDF等)下都可以具有很高的维数和稀疏性。直接在这种表示下测量距离可能不可靠,因为众所周知的事实是,在非常高的尺寸中,任何两个点之间的距离开始看起来都相同。解决此问题的一种方法是通过使用PCA或LSA(潜在语义分析;也称为潜在语义索引)来减少数据维数,然后测量新空间中的距离。在PCA上使用类似LSA的方法是有优势的,因为它可以在“语义概念”方面给出有意义的表示,除了在低维空间中测量距离。
基于概率分布的文档比较通常是通过首先计算每个文档的主题分布(使用Latent Dirichlet Allocation之类的方法),然后计算文档对的主题分布之间的某种差异(例如KL差异)来完成的。在某种程度上,它实际上类似于先进行LSA,然后使用向量之间的KL散度(而不是余弦相似度)来测量LSA空间中的距离。
KL散度是用于比较分布的距离度量,因此,如果文档表示形式是某种分布形式(通常是这种情况,例如,表示为按主题分布的文档,如LDA中那样),则可能更可取。还要注意,在这种表示形式下,特征向量中的条目总和为1(因为您基本上将文档视为主题或语义概念的分布)。
您可能要尝试此在线服务以获取余弦文档相似性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