SimHashアルゴリズムに基づくテキスト類似性計算の原理の紹介

バックグラウンド

先週のある日、著者はインターネット全体を検索し、さまざまな不完全なコードスニペット、GitHub上の数十のSimHashプロジェクト、および数十の関連するWebリソース記事を統合し、最終的にかなり正確なJavaバージョンのSimHashアルゴリズムを入手しました。 。

出力は、ナレッジポイントをテストおよび習得するための単純な標準です。この記事では、SimHashアルゴリズムに基づく同様のテキスト検索の原理と実装プロセスを詳細に紹介します。

テキスト類似性の適用

最近、脆弱性データベースクローラープロジェクトに取り組んでいます。いくつかの脆弱なWebサイトの脆弱性情報を包括的に分析してマージする必要があります。異なる脆弱性のリリースは基本的に似ていますが、異なるWebサイトはわずかに異なる場合があります。異なるWebサイトを公開する方法は基本的に同じです。この種の抜け穴レコードのマージ?

これには、テキストの類似性の計算が含まれます。基本的な考え方は、Webの脆弱性を解析するときは、まず脆弱性プロファイルまたはタイトルを含むシステムの脆弱性データベースにアクセスして、同様の脆弱性があるかどうかを検索します。存在する場合は、同じ脆弱性情報として扱い、脆弱性のソースを追加するだけです。

この問題の古典的な解決策は、Googleが大量のテキスト重複排除を処理するために使用するSimHashアルゴリズムです。これは、ローカルに依存するハッシュです[フルネーム:Locality Sensitive Hashing]。フルネームと略語Simは多少異なります。理由はわかりません!

SimHashを使用してテキストの類似性を判断する基本的なプロセスは次のとおりです。

  1. 2つのテキストのSimHash値をそれぞれ計算して、2つの固定長バイナリシーケンスを取得します;
  2. 2つのバイナリ番号に対してXOR計算を実行して、2つのテキストのハミング距離を取得します。
  3. ハミング距離は3未満であり、同様と見なされます。

SimHashアルゴリズムの概要

JavaにはHashMapがあり、誰もがよく知っています。関数を使用して値を取得し、特定のデータの場所を識別します。ハッシュの競合を回避するために、選択した関数をできるだけ分散させる必要があります。

SimHashは、おなじみのハッシュとは異なり、同じまたは類似のテキストに対して同じまたは類似のハッシュ値を生成する必要があります。類似度は、入力テキストの類似性を反映できます。

その原則は次のとおりです。
ここに写真の説明を挿入

基本的なプロセスは次のとおりです。

  1. 単語のセグメンテーション:テキストをセグメント化し、N個の単語を取得しますword 1 word_1w o r d1ワード2 word_2w o r d2ワード3 word_3w o r d3…… wordnword_nw o r dn個
  2. 重み付け:テキストの単語の頻度を計算し、各単語の重みに適切な重みを設定します1 weight_1w e i g h t1ウェイト2 weight_2w e i g h t2重み3 weight_3w e i g h t3…… weightnweight_nw e i g h tn個
  3. ハッシュ:各単語セグメンテーションhash_iのハッシュ値ハッシュ値を計算しますh a s h、固定長のバイナリシーケンス(通常は64ビットまたは128ビット)を取得します。
  4. 加重加重:各wordiを変更しますword_iw o r dハシHASH_Ih a s h、1を正の重み値に変換しますweighti weight_iw e i g h t、0変成− weighti -weight_iw e i g h t、新しいシーケンスウェイトを取得しますH ashi weightHash_iw e i g h t H a s h
  5. オーバーレイウェイト:ウェイトごとにH ashi weightHash_iw e i g h t H a s h各ビットの値を累積し、最後にシーケンスを取得しますlast H ash lastHashl a s t H a s h、シーケンスの各ビットは、すべてのワードセグメントの重みの累積値です。
  6. 次元の削減:最後のハッシュlastHashl a s t H a s hは01シーケンスsimHashに変換され、方法は次のとおりです。ゼロより大きい重み値を持つ位置は1に設定され、0より小さい重み値を持つ位置は0に設定されます。これは、テキスト全体、つまり指紋の部分的なハッシュ値です。

テキストからSimHashフィンガープリントまでのプロセスの典型的な例があります。
ここに写真の説明を挿入

アルゴリズムの実装のために解決する必要がある3つの技術的ポイント:

  1. 単語のセグメンテーション、hanlp、IKAnalyzer、単語のセグメンテーションなどのツールを使用できます。
  2. 重み、各単語セグメンテーションに適切な重みを割り当てる、統計アルゴリズムをカスタマイズする、または単語頻度統計を使用することができます。
  3. ハッシュアルゴリズム、これを選択するか、Murmurハッシュ、JDKハッシュなどの既存のアルゴリズムを使用できます。

ハミング距離

Baidu百科事典からの説明を見てください:

ハミング距離は、リチャードウェズリーハミングにちなんで名付けられました。情報理論では、同じ長さの2つのストリング間のハミング距離は、2つのストリングの対応する位置にある異なる文字の数です。つまり、ある文字列を別の文字列に変換するために置き換える必要があるのは文字数です。

その定義の観点から、バイナリシーケンスを計算するときの差は1です。XORの結果の合計1は、2つのストリングのハミング距離であるため、ハミング距離の計算方法も非常に簡単です。

啓示

この記事では最初に基本的な概念を紹介し、次の記事では特定のアルゴリズムの実装を引き続き紹介します。SimHashアルゴリズムのフローの観点から、ハッシュ値の0または1を重み値に直接置き換えてから、すべての単語セグメントに重みを追加できる理由を理解するのはより困難ですか?

直接使用できるSimHashアルゴリズムのJava実装を検索しませんでしたが、さらに2つの詳細な記事を見つけました。これは、作成者がローカルセンシティブハッシュアルゴリズムを理解するのに非常に役立ちました。

参照リンク1
参照リンク2

おすすめ

転載: blog.csdn.net/wojiushiwo945you/article/details/108812835