ドキュメント内の特定のフレーズの出現回数をカウントしたいと考えています。たとえば、「stackoverflow フォーラム」。Dが、両方の用語を含むドキュメントを含むドキュメント セットを表しているとします。
ここで、次のデータ構造があるとします。
A[numTerms][numMatchedDocuments][numOccurInADocument]
ここで、numMatchedDocuments は D のサイズであり、numOccurInADocument は特定のドキュメントで特定の用語が出現する回数です。次に例を示します。
A[stackoverflow][document1][occurance1]=3;
つまり、「stackoverflow」という用語がドキュメント「document1」に出現し、その最初の出現が位置「3」にあることを意味します。
次に、出現頻度が最も低い用語を選択し、そのすべての位置をループして、現在の用語「stackoverflow」の位置 + 1 で「フォーラム」が出現するかどうかを調べます。つまり、4 番目の位置に「フォーラム」が見つかった場合、それはフレーズであり、一致するものを見つけたことになります。
マッチングはドキュメントごとに簡単で、かなり高速に実行されますが、ドキュメントの数が 2,000,000 を超えると非常に遅くなります。私はそれをコアに分散しましたが、もちろん高速になりますが、アルゴリズム的にこれを行うより良い方法があるかどうか疑問に思います。
ありがとう、
疑似コード:
boolean docPhrase=true;
int numOfTerms=2;
// 0 for "stackoverflow" and 1 for "forums"
for (int d=0;d<D.size();d++){
//D is a set containing the matched documents
int minId=getTheLeastOccuringTerm();
for (int i=0; i<A[minId][d].length;i++){ // For every position for LeastOccuringTerm
for( int t=0;t<numOfTerms;t++){ // For every terms
int id=BinarySearch(A[t][d], A[minId][d][i] - minId + t);
if (id<0) docPhrase=false;
}
}
}