测量文档相似度

机器算法验证 信息检索
2022-02-15 20:19:18

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

两种选择是:

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

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

是否有任何直观的理由比另一种方法更喜欢一种方法(假设平均文档大小为 100 个术语)?

2个回答

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

基于概率分布比较文档通常是通过首先计算每个文档的主题分布(使用类似潜在狄利克雷分配的方法),然后计算一对文档的主题分布之间的某种散度(例如,KL 散度)。在某种程度上,它实际上有点类似于先进行 LSA,然后使用向量之间的 KL 散度(而不是余弦相似度)测量 LSA 空间中的距离。

KL-divergence 是一种用于比较分布的距离度量,因此如果文档表示是根据某种分布(实际上通常是这种情况——例如,文档表示为主题上的分布,如在 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