我有一个单词列表,按文档语料库的升序频率(df)排序。
从每个文档中,我想从排名列表中仅提取前k个单词(即,我希望基于所有计数的文档中最常见的k个单词)。
实现此目标的最有效方法是什么(最好是在java中)?
一个天真的实现是:
public List<String> getTopK(List<String> wordCounts, Set<String> document, int k) {//wordcounts are in ascending order
List<String> topK = new ArrayList<>(); //the list to be returned
for (String topWord : wordCounts) { //given in ascending order of frequency
if (document.contains(topWord)) { //assume HashSet --> O(1) for contains
topK.add(topWord); //again O(1) for add
k--;
}
if (k == 0) {
break;
}
}
return topK;
}
我必须为D文档中的每个文档和W字的每个单词(在最坏的情况下)执行此操作,因此,总O(D * W)复杂度太高(D和W都是大约数百万)。
答案 0 :(得分:2)
不是将单词的df存储在排序列表中,而是使用地图word -> df
,然后对每个文档遍历所有单词并取上面的k。使用此方法,复杂度为O(D*w)
,w
一个文档中的单词数量远远小于W
所有文档中单词的数量。
由于O(D*w)
是语料库的大小(以单词表示),因此您无法做得更好。