2012-03-05 16 views
3

に、私は重複検出器を構築しています、と私は重複していると相関しなければならないいくつかの要因を特定していることを確認するため、独立したスコアを組み合わせる:文書の集計スコアが重複検出アルゴリズム

を使用して文書の引用の文書のタイトルの
  • 比較
  • 比較文書のテキストの
  • 比較0

    私はこれらの要因のどれもが0-1の値を簡単に得ることができますが、ここではこれらの要因を集計に結合する方法があります。

    たとえば、長さがスポットであり、タイトルが非常に似ている場合、このコーパスで引用が乱雑であるため、引用がかなり異なっていても、それは重複していると見なすことができます。あるいは、あなたは同じような種類のものを想像することができます(長さはオフですが、他の要素はオンになっています;すべての要素は良いものの良いものではありませんなど)。

    最終的には、重複している可能性のある文書(この部分は簡単です)をシステムに認識させてから、私はyayまたはnayと言います。これらの重複に投票すると、有効な重複でどのようなスコアが予想されるべきかを判断し、私の前や晩を経ずに進める方法を学びます。

  • +0

    申し訳ありませんが、私はあなたの_question_が何であるか把握していません。 – nodakai

    +0

    ファジー比較が必要です。ファジー比較は、ドメインのヒューリスティックに依存します。あなたのドメインについて多く知っていなければ、それは非常に難しいでしょう9)ここで何か便利なことを言うには – inspectorG4dget

    +0

    私が間違っていない限り、ゲシュタルトパターンのマッチングは、ファジーマッチングの一種です。私が望むのは、それをドキュメントの長さのような他の要素と組み合わせることです。 – mlissner

    答えて

    1

    あなたの入力をフィーチャーとして使用するclassification algorithmを学習する何らかの機械を使用することができます。

    つまり、これらの要因ごとに0-1点を取るブラックボックス機能があり、文書のペアを重複と見なすべきかどうかの全体的なスコアが得られます。 (入力、出力)のペアのリストに基づいてそのような関数を選択する必要があります。ここで、入力は上の4つのフィーチャ(または意味を成すと思われるもの)です。出力は0(重複しない)または1(重複)。

    これはまさに分類の標準設定です。これを達成するためのオプションには、logistic regression,decision trees,neural networks,support vector machinesなどがあります。

    ロジスティック回帰が良い選択かもしれません。実装はかなり簡単で簡単ですが、非常に強力です。基本的には、訓練データに基づいて各次元に割り当てる重みを選択し、加重された特徴を合計し、その合計をロジスティック関数1/(1+exp(sum))に渡して複製する確率を予測します。これは、あなたのフィーチャで選択された4次元空間で分離超平面を選択することになります.4次元入力ポイントが片側にある場合は正で、反対側である場合は負です。

    単純なnumpyの実装で参照用に見たい場合は、クラス割り当てのために書いたhere's oneです。


    このアプローチは唯一のペアごとの比較のために何をすべきかを説明しますことに注意してください:文書のあなたの数が非常に小さい場合を除き、あなたはおそらく、文書のすべてのペアのためにこれを行うにはしたくないでしょう(ファジーコンテンツので、少なくともロジスティック回帰では実際の予測はかなり簡単ですが、少なくともマッチングはかなり高価です)。おそらく、どの文書を重複としてみなすか(例えば、最寄りのタイトル検索や引用一致やTF-IDFのスコアなどに基づいて)を決めるためのヒューリスティックが必要です。

    +0

    驚くべき答え - それは吸収するのに時間がかかります。あなたの履歴書を見て、私はあなたがこのような質問を待っているので、あなたが座っていると確信しています。私は本当にTF-IDFを使用して、私の最初のステップ(Solrを使って)の可能性のある重複を見つけています。 – mlissner

    +0

    OK、2つの質問:1)[this one](https://nltk.googlecode.com/svn/trunk/doc/book/ch06.html)のようなベイズ分類器を使用しないでください。 2)線形回帰法のために文書化されたライブラリを知っていますか? – mlissner

    +0

    NaïveBayesは、すべての機能が独立していると仮定しているため、問題には悪いです。たとえば、類似したタイトルを持つ2つのドキュメントは、類似したテキストを持つ可能性は低くなります。これは明らかにあなたの問題では間違いです。さて、あなたは完全なベイズ分類器(あなたの特徴が互いに独立しているという仮定を捨てる)を行うことができます。モデルをフィットさせるにはより多くのデータが必要です。実際には、2^4 = 16の入力クラスの組み合わせごとにモデルを適合させる必要があります。おそらく4つのフィーチャで大丈夫ですが、それ以上のものはありません。 – Dougal

    1

    あなたが求めているのはデータモデル --i.e。で、MLアルゴリズムへの入力用にデータを設定する方法です。

    ここでそれを行うための一つの方法だ - それを行うにはおそらく他の方法があるが、しかし、私は、これは動作します知っている:

    ステップ1(Eを設定し、データの各列をマッピング..g、document length)を連続変数の値または離散変数の 'factor'に置き換えます。例えば、「文書の長さ」は「総単語」として表すことができます。 OPで言及された他のものはそれほど単純ではないが、それでも困難ではない。例えば、「引用」はビット配列で表すことができる。これは、ML前処理でこのタイプのデータを処理するための一般的なパターンです。特に、配列内のすべての文書からすべての引用を集め、すべての記事のすべての引用を表すその配列から一意の値を取得します。その一意の値のセットの長さは、ビット配列の長さです。最初の文書で引用#1が存在する場合、インデックス0(ビット配列の最初の項目)のオフセットは "1"に設定されます(インデックス0のビット配列で "setbit"と呼びます)。

    ステップ2:他columnns由来するデータからなる列を削除することを検討。非直交フィーチャはおそらくあなたのクラシファイアを混乱させます。核心:例えば、

    ステップ3「マッチングゲシュタルトパターン」を取り除くを持つ各文書のデータベクトルのペアワイズ、エンド・ツー・エンドの連結によって設定された変換されたデータを作成します他のすべてのドキュメントのベクトルと一緒に。

    >>> d1 = [0, 1, 0, 1, 1]  
    >>> d2 = [0, 0, 0, 1, 0] 
    
    >>> d12 = d1 + d2 
    

    ステップ4:クラスラベルを追加するには、100件の文書を持っている場合、あなたはあなたの変換されたデータセットで100^2のベクトル(実際には分類器に供給されたデータを)持っています(tarnsformedデータ内の連結ベクトルペアのそれぞれの末尾)。言い換えれば、2つの文書が一致している場合は、ベクトルの最後に「1」を付加します。一致しない場合は、 "0"を付加します。したがって、変換されたデータは、n 2個のデータベクトル(nは元のデータセットのサイズ)で構成され、各ベクトルは元のセットとクラスラベルの2つのデータベクトルのエンドツーエンド連結です。

    >>> d12 = [0, 1, 0, 1, 1, 0, 0, 0, 1, 0]  
    

    ので、その後、D12に代表される文書ペアが一致とみなされているとします

    >>> class_label_d12 = [1] 
    
    >>> d12 += class_label_d12 
    
    >>> d12 
        [0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1] 
    

    ステップ5:今、あなたのデータは、教師付き分類器への入力のための通常の形態であり、 。教師付き分類器(MLP、デシジョンツリーなど)を選択し、トレーニングデータを渡します。

    +0

    私はあなたに両方の答えが本当に役立つので、答えるためのポイントを与えることができることを望む。 @ Dougalの答えは、どの分類子を使うのかを理解するのに必要なので、使いました。しかし、ありがとう。これも役に立つと分かっています。 – mlissner

    関連する問題