simhash導入とアプリケーションのシナリオ

簡単な紹介

simhashアルゴリズムは、部分的に敏感なハッシュアルゴリズムで、テキストコンテンツと同様の量を達成することができます。

メッセージダイジェストアルゴリズムとの間の差

メッセージダイジェストアルゴリズム:オリジナルコンテンツの両方が生成さ1人のバイトの署名の唯一の違いがある場合もある可能性がかなり変化します。

simhashアルゴリズム:原稿が1バイトの唯一の違いがある場合、署名の差は非常に小さいです。

比較simhash値:ビット値の差で表される元のテキストの違いは、両方をsimhash。差異の数も、ハミング距離として知られています。

注:
500語へsimhash長いテキスト+より適用、短いテキストは、比較的大きな偏差かもしれません。

紙、64ビット値simhashを与え、Googleのデータは、ハミング距離が3である場合では、2つの文書が類似または反復的であると考えられます。もちろん、この値は、アプリケーションのための唯一の基準値は異なるテスト値を有することがあります。

PythonでSimhashモジュール

Pythonで実装Simhashアルゴリズムは、取得したモジュールsimhash値の長さが64ビットです。

githubの住所:https://github.com/leonsim/simhash

その後、我々は簡単な例を見て:

# 测试 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)

実際には、これは我々が知ることができ、前simhashに、前処理のある程度は非常に重要です。

二つの値simhash間の距離を求めます。

print(Simhash('furuiyang').distance(Simhash('yaokailun')))
print(Simhash('furuiyang').distance(Simhash('ruanyifeng')))
print(Simhash('ruiyang').distance(Simhash('ruiyang')))

一般的に、我々は、爬虫類のプロジェクトでsimhashパターンを使用します。

"""以一种更加通用的模式去运用海明距离"""

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))

我々はプロジェクトの実際の使用simhashを計算したい場合は、必要性がインデックスオブジェクトを保存することは明らかです。
したがって、我々は、直列化ツールの使用を検討することができます。

シーケンスツール:バイナリデータにオブジェクトを変換します。
デシリアライズツール:バイナリオブジェクトに戻します。

追伸

一日のおばさん、それは少しの痛みです。しかし、難しい初日の後、そして再び、あなたはジャンプアップすることができます。人生はそれが最も困難な時期の後、実際には、まだ時間の大通りがあるだろう、ことです。

しかし、短期では、私が唯一のマイナス、物事を自分自身を言いたくはありません。

更新:2020年2月4日

公開された291元の記事 ウォンの賞賛104 ビュー410 000 +

おすすめ

転載: blog.csdn.net/Enjolras_fuu/article/details/104167456