1

私は統計的手段を必要とする問題に取り組んでいるコンピューター科学者ですが (統計に精通していないため)、どの統計を使用すればよいかよくわかりません。

概要:

私は (もちろん StackExchange サイトからの) 一連の質問を持っており、このデータを使用して、私が提供したものと同様の質問を見つけるアルゴリズムを調査しています。はい、他の多くの Q&A サイトと同様に、StackExchange サイトは既にこの機能を実行しています。私がやろうとしているのは、このタスクを達成するために人々が採用する方法とアルゴリズムを分析して、どの方法が最も効果的かを調べることです. 私の問題は、「どの方法が最も効果的か」を定量的に判断するための適切な統計的尺度を見つけることです。

データ:

StackExchange の一連の質問があり、それぞれが次のように保存されています{'questionID':"...", 'questionText':"..."}。質問ごとに、それにリンクされた、またはそこからの一連の他の質問があります。StackExchange サイトの質問回答者が回答に他の同様の投稿へのリンクを追加するのはよくあることです。問題...」これらのリンクされた質問は互いに「類似」していると考えています。

より具体的には、質問があるとしましょうA。質問Aには、リンクされた質問のコレクションがあります{B, C, D}。だから  A_linked = {B, C, D}。私の直観は、ここでは推移的な性質が適用されないことを教えてくれます。つまり、が にA似てBおり、にA似ているからといって、 が に似ているとはC確認できません。(または、できますか?)しかし、 が に似ている場合、はに似ていると自信を持って言えます。BCABBA

したがって、これらの関係を単純化するために、一連の類似したペアを作成します。{A, B}, {A, C}, {A, D} これらのペアは、ある種のグラウンド トゥルースとして機能します。これらは互いに類似していることがわかっている質問であるため、それらの類似度の信頼値は 1 に等しくなります。similarityConfidence({A,B}) = 1

この設定について注意すべきことは、データセット内の各質問について、類似した質問がいくつかしかわかっていないことです。E私たちが知らないのは、他の質問も に似ているかどうかAです。似ているかもしれませんし、似ていないかもしれませんが、わかりません。したがって、私たちの「グラウンド トゥルース」は実際には真実の一部にすぎません。

アルゴリズム:

アルゴリズムの簡略化された疑似コード バージョンは次のとおりです。

for q in questions: #remember q = {'questionID':"...", 'questionText':"..."}
    similarities = {} # will hold a mapping from questionID to similarity to q
    q_Vector = vectorize(q) # create a vector from question text (each word is a dimension, value is unimportant)
    for o in questions: #such that q!=o
        o_Vector = vectorize(o)
        similarities[o['questionID']] = cosineSimilarity(q_Vector,o_Vector) # values will be in the range of 1.0=identical to 0.0=not similar at all
    #now what???

これで、q とデータセット内の他のすべての質問との間のコサイン類似度スコアの完全なマッピングができました。私の最終的な目標は、vectorize()関数の多くのバリエーション (それぞれがわずかに異なるベクトルを返す) に対してこのコードを実行し、コサイン スコアに関してどのバリエーションが最も優れているかを判断することです。

問題:

ここに私の質問があります。それで?これらの余弦スコアがどの程度優れているかを定量的に測定するにはどうすればよいですか?

これらは、私がブレインストーミングした測定値のいくつかのアイデアです (ただし、それらは洗練されておらず、不完全なように感じます)。

  • 二乗平均平方根誤差 (RMSE) に似たある種の誤差関数。したがって、グラウンド トゥルースの類似性リスト内の各ドキュメントについて、二乗誤差を累積します (誤差はおおまかに として定義されます1-similarities[questionID])。次に、その累積を類似のペアの総数で割ります( と同様*2に考慮するため)。最後に、この誤差の平方根をとります。a->bb->a

    • これらの値は正規化する必要がある場合があるため、これにはある程度の考慮が必要です。のすべてのバリエーションはvectorize()0 から 1 の範囲のコサイン スコアを生成しますが、2 つのvectorize()関数のコサイン スコアは互いに比較できない場合があります。vectorize_1()は、一般的に各質問のコサイン スコアが高い可能性があるため、スコア .5 は非常に低いスコアである可能性があります。または、vectorize_2()一般的に各質問の余弦スコアが低い可能性があるため、.5 は非常に高いスコアである可能性があります。この変動をどうにかして説明する必要があります。
    • また、 の誤差関数を提案しました 1-similarities[questionID]。2 つの質問が類似していることがわかっているため、1 を選択しました。したがって、類似度の信頼度は 1 です。ただし、1 のコサイン類似度スコアは、2 つの質問が同一であることを意味します。「リンクされた」質問が同一であると主張しているのではなく、単に類似していると主張しているだけです。これは問題ですか?  
  • 「類似」として返す質問とそうでない質問のしきい値を設定する限り、リコール (返された類似ドキュメントの数/類似ドキュメントの数) を見つけることができます。

    • ただし、上記の理由により、similarity[documentID]>7 各vectorize()関数が異なる値を返す可能性があるため、これは事前定義されたしきい値であってはなりません。  
  • 上位 k 件の投稿のみを分析すると、recall @ k を見つけることができます。

    • ただし、完全なグラウンド トゥルースがないため、これは問題になる可能性があります。を設定し、関連性があるとわかっている 3 つのk=5ドキュメント ( ) のうち 1 つのドキュメント ( ) だけが上位 5 位に入っている場合、他の上位 4 つのドキュメントが実際に、既知の 3つのドキュメントと同等または類似しているかどうかはわかりません。、しかし誰もそれらをリンクしませんでした。B{B,C,D}A

他にアイデアはありますか?どのvectorize()機能が最もよく機能するかを定量的に測定するにはどうすればよいですか?

4

1 に答える 1

1

最初に、この質問は、類似性と重複検出に近い情報検索の問題に非常に関連していることに注意してください。

私が見る限り、あなたの問題は2つの問題に分けることができます:

  1. グラウンド トゥルースの決定:グラウンド トゥルースが不明確な多くの「コンペティション」では、どれが関連するドキュメントであるかを決定する方法は、候補者の X% から返されたドキュメントを取得することです。
  2. 最適な候補の選択: 通常、2 つの異なるアルゴリズムのスコアを比較することは無関係であることに注意してください。スケールは完全に異なる可能性があり、通常は無意味です。2 つのアルゴリズムを比較するには、各アルゴリズムのランキングを使用する必要があります。つまり、各アルゴリズムがドキュメントをランク付けする方法と、グラウンド トゥルースからの距離です。
    これを行う単純な方法は、単純に精度と再現率を使用することです。これらをf-measureと比較できます。問題は、10 位にランク付けされたドキュメントが 1 位にランク付けされたドキュメントと同じくらい重要であるということです。
    それを行うためのより良い方法はNDCGです。これは、私が遭遇したほとんどの記事でアルゴリズムを比較する最も一般的な方法であり、主要な IR カンファレンスで広く使用されています。WWWsigIR。NDCG はランキングにスコアを付け、「より良い」とランク付けされたドキュメントに高い重要性を与え、「より悪い」とランク付けされたドキュメントには重要度を下げます。もう 1 つの一般的なバリエーションは NDCG@k です。NDCG は、各クエリの k 番目のドキュメントまでのみ使用されます。

この背景とアドバイスが役立つことを願っています。

于 2014-04-02T20:49:30.013 に答える