我希望能够统计文档中特定短语的出现次数。例如 "stackoverflow 论坛"。假设 D 表示包含这两个词的文档集。
现在,假设我有以下数据结构:
A[numTerms][numMatchedDocuments][numOccurInADocument]
其中numMatchedDocuments是D的大小,numOccurInADocument是特定术语在特定文档中出现的次数,例如:
A[stackoverflow][document1][occurance1]=3;
意思是,术语“stackoverflow”出现在文档“document1”中,第一次出现的位置为“3”。
然后我选择出现最少的术语,并循环遍历其所有位置,以查找“forum”是否出现在当前术语“stackoverflow”位置的位置+1。换句话说,如果我在位置4找到“forum”,那就是一个短语,我已经找到了匹配项。
每个文档的匹配都很简单并且运行速度合理,但是当文档数量超过200万时,速度变得非常慢。我已将其分布在核心上,并且当然会更快,但想知道是否有更好的算法方法来完成此操作。
谢谢,
伪代码:
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;
}
}
}