我收集了大约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()
方法将简单地为总出现次数增加一个计数器,并将在国际地图中插入或更新出现次数。