cenários de introdução e aplicação simhash

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

Publicado 291 artigos originais · Louvor obteve 104 · vista 410 000 +

Acho que você gosta

Origin blog.csdn.net/Enjolras_fuu/article/details/104167456
Recomendado
Clasificación