Shingle和Simhash算法是用于计算文本相似度的两种常用算法,下面对它们的原理和实现进行介绍。

一、Shingle算法

Shingle算法是一种基于词组的相似度计算算法。它将文本分成若干个词组(n-gram),也就是将文本转成连续的词组序列。这些词组通常是由相邻的单词组成,其中n代表词组的长度。例如,当n为3时,文本“Hello World”将被转换成三个词组:“Hel”,“ell”,“llo”词语相似度计算方法,“lo ”,”o W”,“ Wo”,“Wor”,“orl”,“rld”。

接下来,将每个词组用哈希函数进行映射,得到一个唯一的标识符,然后将这些标识符组成一个向量。通过计算两个向量的余弦相似度,即可得到文本的相似度。

二、Simhash算法

Simhash算法是一种基于哈希函数的相似度计算算法。它将文本转成一个固定长度的二进制码,可以是32位或64位。相似的文本将有类似的二进制表示,不相似的文本二进制码则有较大的差异。

Simhash算法的实现方法如下:

1. 将文本转为特征向量:比如,将文本转为词袋模型,划分成固定大小的shingle,并用hash值来表示每个shingle。

2. 对特征向量做加权处理:对于每个特征词语相似度计算方法,统计它在整个数据集中的出现频率,并通过一定的公式进行归一化,得到权重。

3. 按照特征权重将特征向量映射到64位的签名向量:对于每个特征,按照它的权重对其hash值进行加权,然后累加起来,最后对结果做正负向判断,得到二进制码的每一位。

4. 按位统计签名向量的哈希值:统计签名向量每一位哈希值为1的个数,然后根据是否大于一半,对签名向量进行正负向判断。

5. 通过哈希函数得到最终的Simhash值:由于Simhash算法产生的二进制码可能会存在哈希冲突,为了解决这个问题,可以使用Murmurhash或MD5等哈希函数对签名向量进行二次哈希,得到最终的Simhash值。

三、实现

下面是Shingle和Simhash算法的Python实现:

Shingle算法实现:

```

import hashlib

def shingle(text, n=3):

shingles = []

words = text.split()

for i in range(len(words) - n + 1):

shingle = ' '.join(words[i:i+n])

shingles.append(hashlib.sha256(shingle.encode('utf-8')).hexdigest())

return shingles

def similarity(a, b):

a = set(a)

b = set(b)

return len(a & b) / len(a | b)

```

Simhash算法实现:

```

import hashlib

def simhash(text, n=3):

shingles = []

for i in range(len(text) - n + 1):

shingle = text[i:i+n]

shingles.append(hash(shingle))

vector = [0] * 64

for s in shingles:

for i in range(64):

mask = 1 = 0:

simhash |= 1