【发布时间】:2012-12-05 03:36:48
【问题描述】:
我想计算文档中特定短语的出现次数。例如“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;
}
}
}
【问题讨论】:
-
也许将您当前的实现发布在代码中仅供参考。
-
@MelNicholson ...但想知道是否有算法上更好的方法来做到这一点。
-
您需要预先存储所有这些吗?或者您可以实时填充结构(例如,当人们搜索时)?
-
@sdasdadas 我不确定“商店”是什么意思。数组不是存储的,而是从索引中获取的,而且速度很快,没有问题。计数是。
-
听起来像是 Suffix Arrays 解决的问题。 en.wikipedia.org/wiki/Suffix_array 这个回答我对一个稍微不同的问题给出了一个简单的后缀数组实现:stackoverflow.com/questions/10606728/… 在 SO 和网络上有相当多的实现。
标签: java algorithm search string-matching