8

更新: ssdeep C API 用のphp_ssdeepという PHP 拡張機能を記述して、PHP でネイティブにファジー ハッシュとハッシュ比較を容易にします。詳細については、私のブログを参照してください。これが人々に役立つことを願っています。

私は、さまざまなファイル形式 (場合によっては数千のファイル) を格納する Linux ボックス上の PHP でカスタム ドキュメント管理アプリケーションを作成することに関与しており、データベースでの重複を防ぐために、テキスト ドキュメントが以前にアップロードされたかどうかを確認できるようにする必要があります。 .

基本的に、ユーザーが新しいファイルをアップロードするときに、重複しているか類似のコンテンツを含むファイルのリストを提示できるようにしたいと考えています。これにより、既存のドキュメントの 1 つを選択するか、独自のドキュメントをアップロードし続けることができます。

類似の文書は、その内容を調べて類似の文と、おそらく動的に生成されたキーワードのリストを調べることによって判断されます。次に、一致率をユーザーに表示して、重複を見つけやすくします。

このプロセスに推奨するパッケージと、過去にこれをどのように行ったかについてのアイデアはありますか?

すべてのテキストコンテンツを取得することで、直接複製できると思います。

  • 空白の除去
  • 句読点の削除
  • 小文字または大文字に変換

次に、MD5 ハッシュを形成して、新しいドキュメントと比較します。これらの項目を取り除くことで、たとえばユーザーが文書を編集して余分な段落区切りを追加した場合に、重複が見つからなくなるのを防ぐことができます。何かご意見は?

このプロセスは、夜間のジョブとして実行される可能性もあり、計算要件が大きすぎてリアルタイムで実行できない場合、次回のログイン時にユーザーに重複を通知できます。ただし、リアルタイムが優先されます。

4

2 に答える 2

5

更新: ssdeep C API 用のphp_ssdeepという PHP 拡張機能を記述して、PHP でネイティブにファジー ハッシュとハッシュ比較を容易にします。詳細については、私のブログを参照してください。これが人々に役立つことを願っています。

その作成者である Jesse Kornblum が「Fuzzy Hashing」と呼んでいるものを実行するプログラムを見つけました。非常に基本的には、同様のファイルまたは同一の一致を検出するために使用できるファイルのハッシュを作成します。

その背後にある理論はここに文書化されています:コンテキストでトリガーされたピースワイズハッシュを使用してほぼ同一のファイルを識別する

ssdeepはプログラムの名前で、Windows または Linux で実行できます。フォレンジック コンピューティングで使用することを目的としていましたが、私たちの目的には十分に適しているようです。古い Pentium 4 マシンで簡単なテストを行ったところ、23MB のハッシュ ファイル (135,000 ファイル弱のハッシュ) を調べて 2 つのファイルとの一致を探すのに約 3 秒かかりました。その時間には、私が検索対象としていた 2 つのファイルのハッシュの作成も含まれています。

于 2009-11-13T16:23:28.880 に答える
1

私はweb2projectで同様の問題に取り組んでおり、周りに尋ねて掘り下げた後、「ユーザーは気にしない」という結論に達しました。ユーザーが独自の名前で独自のドキュメントを見つけることができる限り、ドキュメントが重複していても問題ありません。

そうは言っても、私が取っているアプローチは次のとおりです。

  • ユーザーが必要なプロジェクト/タスクに関連付けられたドキュメントをアップロードできるようにします。
  • ファイルの名前を変更して、誰かが http 経由でアクセスできないようにするか、Web ルートの外に保存することをお勧めします。ユーザーにはシステム内のファイル名が引き続き表示され、ダウンロードした場合は、ヘッダーに「適切な」ファイル名を設定できます。
  • 将来のある時点で、ドキュメントを処理して重複があるかどうかを確認します。ただし、この時点では、ドキュメントを変更していません。結局、空白や大文字が変更された重要な理由が存在する可能性があります。
  • 重複がある場合は、新しいファイルを削除してから、古いファイルにリンクします。
  • だまされていない場合は、何もしません。
  • 検索用語のファイルにインデックスを付けます。ファイル形式によっては、Word ドキュメントであっても、多くのオプションがあります。

このすべてを通して、ユーザーにそれが重複していることを伝えません...彼らは気にしません。気にするのは私たち(開発者、データベース管理者など)です。

はい、後でファイルの新しいバージョンをアップロードした場合でも、これは機能します。まず、ファイルへの参照を削除します。次に、ガベージ コレクションと同様に、古いファイルへの参照がない場合にのみ、古いファイルを削除します。

于 2009-11-13T13:31:55.440 に答える