文書内の特定のフレーズの出現回数を数えたいと思います。たとえば、 "stackoverflow forums"などです。 Dは、両方の用語を含む文書で設定された文書を表しているとします。今配列の高速かつ効率的な計算
、私は次のようなデータ構造を有していると仮定:
numMatchedDocumentsはDの大きさであり、numOccurInADocumentは、特定の用語は、例えば、特定のドキュメントで発生する発生回数であるA[numTerms][numMatchedDocuments][numOccurInADocument]
:
A[stackoverflow][document1][occurance1]=3;
という用語は、文書「document1」に「stackoverflow」という用語があり、最初の出現が位置「3」にあることを意味します。
次に、 "forum"が現在の用語 "stackoverflow"の位置+ 1にあるかどうかを調べるために、すべての位置でループしているループを探します。言い換えれば、私がポジション4で「フォーラム」を見つけたら、それはフレーズであり、私はそれに合ったものを見つけました。
マッチングはドキュメントごとに簡単で、かなり速く実行されますが、ドキュメントの数が2,000,000を超えると非常に遅くなります。私はコアを介してそれを配布したが、それはより速くなるが、これを行うアルゴリズム的に良い方法があるのだろうかと思う。
おかげで、
Psudo-コード:
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;
}
}
}
参考のためにコードに現在の実装を掲載することがあります。 – OmniOwl
あなたの質問は何ですか? –
@MelNicholson ...しかし、これを行うアルゴリズム的に良い方法があるのだろうかと思います。 – DotNet