2009-11-13 15 views
8

アップデート:私は今、PHP拡張モジュールは、ネイティブPHPでファジーハッシュとハッシュの比較を容易にするためのssdeepのC APIのphp_ssdeepと呼ばれる書かれています。詳細はover at my blogです。私はこれが人々に役立つことを願っています。文書管理アプリケーションで文書の重複や類似した文書のチェック

さまざまなファイル形式(おそらく1000個のファイル)を保存するLinuxボックスにPHPでカスタムドキュメント管理アプリケーションを作成することに関与しています。テキスト文書がアップロードされていないかどうかを確認する必要がありますデータベースの複製。

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

同様の文書は、同様の内容のコンテンツとおそらく動的に生成されたキーワードのリストを調べることによって決定されます。次に、ユーザーに重複を見つけるのに役立つパーセンテージの一致を表示することができます。

このプロセスにはどのパッケージを使用することもできますし、過去にこれを行ったことがありますか?

私が思うに、直接の重複は、フォームのすべてのテキストの内容を取得し、

  • は句読点
  • 下げるに変換または大文字

を削除

  • 空白をストリッピングすることにより行うことができます新しいドキュメントと比較するMD5ハッシュこれらのアイテムを削除すると、ユーザーが余分な段落区切りを追加するためにドキュメントを編集した場合に、見つからないことを防ぐことができます。何かご意見は?

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

  • +0

    MD5ハッシュを使用すると、まったく同じ2つのドキュメントのみが役に立ちます。 1つの文字が異なる場合、結果のMD5ハッシュは類似していません(ハッシュのポイントの1つです)。したがって、これは類似したファイルを見つけるためにはうまくいかないでしょう... – Franz

    +0

    私はそれを実現します。それで、私は、似たようなファイルではなく正確なマッチを見つける技術を述べました。 – Treffynnon

    答えて

    5

    アップデート:私は今、ネイティブPHPでファジーハッシュとハッシュの比較を容易にするために、ssdeepのC APIのphp_ssdeepと呼ばれるPHP拡張モジュールを書かれている。詳細はover at my blogです。私はこれが人々に役立つことを願っています。

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

    その背後にある理論は、ここに文書化されている:Identifying almost identical files using context triggered piecewise hashing

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

    1

    私はweb2projectで同様の問題に取り組んでおり、尋ねて掘り下げた後、「ユーザーは気にしない」という結論に達しました。 が重複している場合は、は、自分の名前で自分の文書を見つけることができる限り、ユーザーにとって重要です。

    言われて、ここで私が取っているアプローチだこと:

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

    この全体を通じて、私たちはユーザーに重複しているとは言わない...彼らは気にしない。私たち(開発者、DB管理者など)が気になるのです。

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

  • +0

    興味深いアイデア。ただし、ドキュメントは重複してはいけませんが、ドキュメントは1つの中央ロケーションから複数の異なるサイトにまたがって使用されるため、すべてのサイトを同時に更新する必要があります。 私はドキュメント自体の変更を提案していませんでした。ちょうどハッシュ一致が可能な限り類似の文書と一致する可能性があります。一致するものがあれば、現在利用可能なファイルを受け入れるか、アップロードしている新しいファイルで更新するか、単に絶対に必要な別のファイルとして追加するかをユーザーに尋ねます。 古いファイルをユーザーに透過的でないものとして削除することはできません。 – Treffynnon

    +0

    申し訳ありませんが、私は少し私の応答を誤解しました。 文書を比較する前にそれを変更すると、実際に文書を比較していないことを意味します。変更した文書を比較しています。たとえば、「こんにちは、私の名前はキースです」という文と同じ文です。「こんにちは、私の名前はキースです」。概念的には同じですが、最初のもので私の名前を大文字にしないのはおそらくタイプミスです。提案されたアイデアは、これらの文書を同じものとして扱い、重複しているものとしてフラグを立てます。 – CaseySoftware

    +0

    まさに私が望んでいたことです。 :)彼らは本質的に同じ文章です。 1つはちょうどそれにタイプミスがあります。したがって、新しい文書をアップロードするのではなく、既存の文書を更新するようにします。 – Treffynnon

    関連する問題