文本相似度计算功能当前平台支持MinHashLSH方法,在预设条件下(包括:筛选数据、挑选相似度计算方法、相似阈值等)对文本内容做聚合建模,其聚合结果有助于发现相似文本,方便批量编码操作,为后续深入的研究分析提供数据预处理基础。
一、MinHashLSH模型介绍
- 1. Jaccard相似度
给定集合A、B,Jaccard系数定义为A和B交集元素个数与A和B并集的元素个数的比值,即:J(A, B) = |A∩B| / |A∪B| = |A∩B| / (|A| + |B| – |A∩B|) ,用于比较有限样本集之间的相似性和差异性,系数值越大相似度越高。比如A = {a,b,c,d},B = {c,d,e,f},那么Jaccard相似性系数为2/6=0.33。
- 2. MinHash
MinHash有别于传统的hash算法,不再是将文本内容随机映射为签名值,而是能够满足相似文本的签名也相近。其基本原理是A∪B的随机域里,选中的元素落在A∩B这个区域的概率等于Jaccard相似度,可以用于大规模聚类问题。具体操作是先对A、B的n个维度做随机排列(即索引随机打乱),分别取向量A、B的第一个非0索引值即为MinHash值,那么概率P(minHash(A) = minHash(B)) = Jaccard(A,B)。
- 3. LSH(Locality Sensitive Hashing,局部敏感哈希)
Minhash解决了高维稀疏向量的运算,但是对集合两两比较的时间复杂度依然是O(n2),假如集合数量极其庞大,我们希望仅仅比较那些相似度可能很高的集合,而直接忽略掉相似度很低的集合,LSH就是解决这个问题。其基本思想是原空间相近(相似)的点,经过LSH哈希函数映射后,很大概率哈希值相同;而距离远(不相似)的两个点,映射后哈希值相等的概率很小。
二、算法说明
文本相似度计算时候,首先得到document-term矩阵,比如:
S1 | S2 | S3 | |
0 | 1 | 0 | 0 |
1 | 0 | 0 | 1 |
2 | 0 | 1 | 0 |
3 | 1 | 0 | 1 |
4 | 0 | 0 | 1 |
其中,S1、S2、S3表示文档,第一列序号0-5表示行序号,也即单词,其他部分中1表示文档S有这个单词,0表示文档S没有这个单词。接下来,使用hash函数产生行号顺序,比如(x+1)mod5,(3x+1)mod5,则两个hash函数产生行号顺序为:
Hash1 | Hash2 | |
0 | 1 | 1 |
1 | 2 | 4 |
2 | 3 | 2 |
3 | 4 | 0 |
4 | 0 | 3 |
通过遍历矩阵中的值,对于0跳过,对于1,看hash函数产生的行号,找到行号最小的值作为hash输出的值,最后得到如下矩阵:
S1 | S2 | S3 | |
Hash1 | 1 | 3 | 0 |
Hash2 | 1 | 2 | 0 |
此时S1、S2的相似度,J(S1,S2)=0/3=0。Minhash计算的合理性在于两个集合的随机行排列的minhash值相等的概率等于两个集合的Jaccard相似度。对于两个集合A、B,每一行的状态有三种:(1)A、B集合都有这个单词;(2)A、B集合都没有这个单词;(3)A、B集合中仅有一个集合有这个单词。若分别属于(1)、(2)、(3)状态的行数依次有n1、n2、n3行,则Jaccard(A,B)=n1/(n1+n3);由于排列是随机的,再遇到(3)之前遇到(1)的概率是n1/(n1+n3),恰好等于Jaccard系数值。