10

同様のドキュメントを検出するためのモジュールを作成する必要があります。文書技術などの指紋の論文をたくさん読んだことがありますが、コードの書き方やそのような解決策の実装方法がわかりません。アルゴリズムは、中国語、日本語、英語、ドイツ語で機能するか、言語に依存しない必要があります。どうすればこれを達成できますか?

4

10 に答える 10

20

ベイジアンフィルターにはまさにこの目的があります。これは、スパムを識別するほとんどのツールに見られるテクノです。

例、言語を検出するには(http://sebsauvage.net/python/snyppets/#bayesianから):

from reverend.thomas import Bayes
guesser = Bayes()
guesser.train('french','La souris est rentrée dans son trou.')
guesser.train('english','my tailor is rich.')
guesser.train('french','Je ne sais pas si je viendrai demain.')
guesser.train('english','I do not plan to update my website soon.')

>>> print guesser.guess('Jumping out of cliffs it not a good idea.')
[('english', 0.99990000000000001), ('french', 9.9999999999988987e-005)]

>>> print guesser.guess('Demain il fera très probablement chaud.')
[('french', 0.99990000000000001), ('english', 9.9999999999988987e-005)]

ただし、技術的なテキスト、歌、ジョークなど、トレーニングするすべてのタイプを検出するために機能します。ツールにドキュメントがどのように見えるかを学習させるのに十分な資料を提供できる限り。

于 2008-09-20T18:46:25.027 に答える
10

これらが純粋なテキスト ドキュメントである場合、またはドキュメントからテキストを抽出する方法がある場合は、シングリングと呼ばれる手法を使用できます。

最初に、各ドキュメントの一意のハッシュを計算します。これらが同じであれば、完了です。

そうでない場合は、各ドキュメントを小さなチャンクに分割します。これらはあなたの帯状疱疹です。

シングルを取得したら、各シングルの ID ハッシュを計算し、シングルのハッシュを比較して、ドキュメントが実際に同じかどうかを判断できます。

使用できるもう 1 つの手法は、ドキュメント全体の n-gram を生成し、各ドキュメント内の類似した n-gram の数を計算し、各ドキュメントの加重スコアを生成することです。基本的に、n-gram は単語を小さなチャンクに分割します。「apple」は、「a」、「ap」、「app」、「ppl」、「ple」、「le」になります。(これは技術的には 3 グラムです) このアプローチは、多数のドキュメントまたは 2 つの非常に大きなドキュメントを処理する場合、計算コストが非常に高くなる可能性があります。もちろん、一般的な n グラム「the」、「th」、「th」などは、スコアを下げるために重み付けする必要があります。

私はこれについてブログに投稿しました。投稿には、Shingling に関する他のいくつかの記事へのリンクがいくつかあります。これは屋根職人だけのものではありません

頑張ってください!

于 2008-09-19T13:01:56.970 に答える
8

類似性は、分類しなくても簡単に見つけることができます。この O(n2) を試してみてください。

def jaccard_similarity(doc1, doc2):
    a = sets(doc1.split())
    b = sets(doc2.split())
    similarity = float(len(a.intersection(b))*1.0/len(a.union(b))) #similarity belongs to [0,1] 1 means its exact replica.
    return similarity
于 2009-01-15T21:37:08.843 に答える
7

Python の stdlib からdifflibを使用するか、最後に学習してコードを記述できます。

これは非常に柔軟で、文字列のリスト間の違いを見つけて、これらの違いを指摘するアルゴリズムを備えています。次に、 を使用しget_close_matches()て類似の単語を検索できます。

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']

それは解決策ではありませんが、おそらくそれが始まりです。

于 2008-09-19T12:53:05.637 に答える
3

質問をより具体的にする必要があります。すでにフィンガープリンティングの論文を読んだことがある場合は、動作中の原則をすでに知っているため、ここで一般的なアプローチを説明しても意味がありません。まだお持ちでない場合は、「重複検出」に関する論文や、近年スタンフォード、Google、Yahoo、および MS から発表されたさまざまな Web スパム検出関連の論文もチェックしてください。

説明されているアルゴリズムのコーディングに特定の問題がありますか?

始めるのに問題がありますか?

私がおそらく最初に行うことは、トークン化 (「単語」またはその他の適切なシーケンスを抽出するプロセス) を重複検出ロジックから分離することです。これにより、異なる言語の異なるパーサーを簡単にプラグインし、重複検出部分を維持できます。同じ。

于 2008-09-19T12:56:56.670 に答える
2

Google Techtalksのニューラル ネットワークについてはかなり良い話があり、階層化されたボルツマン マシンを使用してドキュメントの特徴ベクトルを生成し、それを使用してドキュメントの距離を測定することについて話しています。主な問題は、ネットワークをトレーニングして関連する機能を発見するために、大規模なサンプル ドキュメント セットを用意する必要があることです。

于 2008-09-19T15:24:41.450 に答える
1

検索したいファイルにインデックスを付ける準備ができている場合、Xapian は優れたエンジンであり、Python バインディングを提供します。

http://xapian.org/

http://xapian.org/docs/bindings/python/

于 2008-09-19T12:57:05.750 に答える
0

Jeremy は的を射ていると思います。ファイルが異なるかどうかを検出したいだけなら、MD5 や SHA1 などのハッシュ アルゴリズムが適しています。

Linus Torvalds の Git ソース管理ソフトウェアは、まさにこの方法で SHA1 ハッシュを使用して、ファイルがいつ変更されたかをチェックします。

于 2008-09-20T16:32:32.120 に答える
0

同じトピックについて話しているドキュメントを検出しようとしている場合は、最も頻繁に使用される単語を収集して、ストップ ワードを破棄してみてください。最も頻繁に使用される単語の分布が似ているドキュメントは、おそらく似たようなことを話しているでしょう。より高い精度が必要な場合は、ステミングを行い、概念をn グラムに拡張する必要がある場合があります。より高度な手法については、機械学習を調べてください。

于 2008-09-19T14:23:56.103 に答える
0

このペーパーで概説されているように、DustBuster アルゴリズムを調べることをお勧めします。

紙から、ページの内容を調べなくても重複ページを検出できます。もちろん、コンテンツを調べることで有効性が高まりますが、重複ページを検出する方法としては生のサーバー ログを使用するだけで十分です。

MD5 または SHA1 ハッシュを使用するという推奨事項と同様に、DustBuster の方法は主なシグナルとしてファイル サイズを比較することに大きく依存しています。シンプルに聞こえるかもしれませんが、最初の最初のパスにはかなり効果的です。

于 2010-02-03T06:01:58.947 に答える