我收集了大约1500个文档。我解析了每个文档并提取了令牌。这些令牌存储在哈希图中(作为键),它们在集合中出现的总次数(即频率)存储为值。

我必须扩展它以建立反向索引。也就是说,术语(键)|它出现的文档数量->该文档中的DocNo | Frequency。例如,

    Term       DocFreq    DocNum      TermFreq
  data           3           1            12
                            23            31
                            100           17
  customer       2          22            43
                            19            2


目前,我有以下Java语言,

hashmap<string,integer>
for(each document)
{
    extract line
    for(each line)
    {
        extract word
        for(each word)
        {
            perform some operations
            get value for word from hashmap and increment by one
        }
    }
}


我必须基于此代码。我真的没有想到实现倒排索引的好方法。
到目前为止,我想到了使2D数组价值化。因此,术语将是键,值(即2D数组)将存储docId和termFreq。

请让我知道我的逻辑是否正确。

最佳答案

我可以通过使用Map<String, TermFrequencies>来做到这一点。该映射将为找到的每个术语维护一个TermFrequencies对象。 TermFrequencies对象将具有以下方法:

void addOccurrence(String documentId);
int getTotalNumberOfOccurrences();
Set<String> getDocumentIds();
int getNumberOfOccurrencesInDocument(String documentId);


它将在内部使用Map<String, Integer>将术语出现的每个文档与该术语在文档中出现的次数相关联。

该算法将非常简单:

for(each document) {
    extract line
    for(each line) {
        extract word
        for(each word) {
            TermFrequencies termFrequencies = map.get(word);
            if (termFrequencies == null) {
                termFrequencies = new TermFrequencies(word);
            }
            termFrequencies.addOccurrence(document);
        }
    }
}


addOccurrence()方法将简单地为总出现次数增加一个计数器,并将在国际地图中插入或更新出现次数。

10-08 13:14