从排序的单词列表中有效地获取文档的前k个单词

时间:2014-07-07 12:20:15

标签: java algorithm sorting

我有一个单词列表,按文档语料库的升序频率(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都是大约数百万)。

1 个答案:

答案 0 :(得分:2)

不是将单词的df存储在排序列表中,而是使用地图word -> df,然后对每个文档遍历所有单词并取上面的k。使用此方法,复杂度为O(D*w)w一个文档中的单词数量远远小于W所有文档中单词的数量。

由于O(D*w)是语料库的大小(以单词表示),因此您无法做得更好。