私は統計的手段を必要とする問題に取り組んでいるコンピューター科学者ですが (統計に精通していないため)、どの統計を使用すればよいかよくわかりません。
概要:
私は (もちろん StackExchange サイトからの) 一連の質問を持っており、このデータを使用して、私が提供したものと同様の質問を見つけるアルゴリズムを調査しています。はい、他の多くの Q&A サイトと同様に、StackExchange サイトは既にこの機能を実行しています。私がやろうとしているのは、このタスクを達成するために人々が採用する方法とアルゴリズムを分析して、どの方法が最も効果的かを調べることです. 私の問題は、「どの方法が最も効果的か」を定量的に判断するための適切な統計的尺度を見つけることです。
データ:
StackExchange の一連の質問があり、それぞれが次のように保存されています{'questionID':"...", 'questionText':"..."}
。質問ごとに、それにリンクされた、またはそこからの一連の他の質問があります。StackExchange サイトの質問回答者が回答に他の同様の投稿へのリンクを追加するのはよくあることです。問題...」これらのリンクされた質問は互いに「類似」していると考えています。
より具体的には、質問があるとしましょうA
。質問A
には、リンクされた質問のコレクションがあります{B, C, D}
。だから A_linked = {B, C, D}
。私の直観は、ここでは推移的な性質が適用されないことを教えてくれます。つまり、が にA
似てB
おり、にA
似ているからといって、 が に似ているとはC
確認できません。(または、できますか?)しかし、 が に似ている場合、はに似ていると自信を持って言えます。B
C
A
B
B
A
したがって、これらの関係を単純化するために、一連の類似したペアを作成します。{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->b
b->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
- ただし、完全なグラウンド トゥルースがないため、これは問題になる可能性があります。を設定し、関連性があるとわかっている 3 つの
他にアイデアはありますか?どのvectorize()
機能が最もよく機能するかを定量的に測定するにはどうすればよいですか?