breve introdução
algoritmo simhash é um algoritmo de hash parcialmente sensível, pode atingir um peso semelhante ao conteúdo do texto.
A diferença entre a mensagem de digerir algoritmo
algoritmo Message Digest: se tanto o conteúdo original é apenas uma diferença de uma assinatura byte gerado também é susceptível de variar consideravelmente.
algoritmo simhash: se o original é apenas uma diferença de um byte, a diferença de assinatura é muito pequena.
valor simhash comparativa: diferença do texto original representada pela diferença de valores de bit simhash ambos. O número de diferenças também é conhecido como a distância de Hamming.
Nota:
simhash para 500 palavras por muito tempo texto + mais aplicável, texto curto pode ser relativamente grandes desvios.
dados do Google dadas papel, o valor simhash de 64 bits, no caso em que a distância Hamming é 3, dois documentos são considerados similares ou repetitivo. Naturalmente, este valor é apenas um valor de referência para a sua aplicação pode ter valores de teste diferentes.
módulo Simhash em Python
Simhash algoritmo implementado no pitão, o comprimento do valor de módulo simhash obtido é de 64 bits.
github Endereço: https://github.com/leonsim/simhash
Então, olhamos para um exemplo simples:
# 测试 simhash 库的简单使用
# pip install simhash
import re
from simhash import Simhash
def get_features(s):
"""
对文本全部转小写 去掉空白字符以及标点符号
:param s:
:return:
"""
width = 3
s = s.lower()
s = re.sub(r'[^\w]+', '', s)
return [s[i:i + width] for i in range(max(len(s) - width + 1, 1))]
# 计算出这几个文本的 simhash 值
print('%x' % Simhash(get_features('How are you? I am fine. Thanks.')).value)
print('%x' % Simhash(get_features('How are u? I am fine. Thanks.')).value)
print('%x' % Simhash(get_features('How r you?I am fine. Thanks.')).value)
Na verdade, isso podemos saber, antes de simhash, um certo grau de pré-tratamento é muito importante.
A obtenção da distância entre dois valores simhash:
print(Simhash('furuiyang').distance(Simhash('yaokailun')))
print(Simhash('furuiyang').distance(Simhash('ruanyifeng')))
print(Simhash('ruiyang').distance(Simhash('ruiyang')))
Geralmente, usamos padrões simhash em projeto répteis:
"""以一种更加通用的模式去运用海明距离"""
import re
from simhash import Simhash, SimhashIndex
def get_features(s):
"""
对文本进行预处理
转小写;去除空白字符以及标点符号
:param s:
:return:
"""
width = 3
s = s.lower()
s = re.sub(r'[^\w]+', '', s)
return [s[i:i + width] for i in range(max(len(s) - width + 1, 1))]
# 我们已经存在的数据
data = {
1: u'How are you? I Am fine. blar blar blar blar blar Thanks.',
2: u'How are you i am fine. blar blar blar blar blar than',
3: u'This is simhash test.',
}
# 由初始数据建立的 key 以及 simhash 值的对象集
objs = [(str(k), Simhash(get_features(v))) for k, v in data.items()]
# 建立索引 可索引到的相似度海明距离是 3
index = SimhashIndex(objs, k=3)
print(index.bucket_size()) # 11
# 计算一个新来数据的 simhash 值
s1 = Simhash(get_features(u'How are you i am fine. blar blar blar blar blar thank'))
# 找到数据库中与此最接近的一个 simhash 值的索引
print(index.get_near_dups(s1))
# 将新数据添加到原有的索引中
index.add('4', s1)
print(index.get_near_dups(s1))
Se quisermos calcular o simhash uso real no projeto, é claro que a necessidade de preservar o objeto do índice.
Portanto, podemos considerar o uso de ferramenta de serialização.
ferramenta sequência: converter um objeto em um conjunto de dados binário.
ferramenta de-serialização: reverter para um objeto binário.
pós-escrito
Tia-a-dia, é um pouco dolorido. Mas depois de um primeiro dia difícil, e, novamente, você pode saltar para cima. A vida é assim seja, após os momentos mais difíceis, de fato, ainda haverá passagem do tempo.
Mas, em suma, eu não quero dizer coisas negativas mesmo só.
Atualizado: 2020/02/04