我正在尝试创建倒排索引。我正在读取一个文本文件的行,该文本文件在每一行的第一个位置都有一个文档 docId
的 id,该行的其余部分有关于该文档的关键字。
为了创建倒排索引,我首先必须标记这个文本文件。我用我写的一个函数做到了,我把每个词都存储在一个 vector 中。我唯一的提示是我还将 docId
作为字符串存储在 vector 中。如果需要,这里是 tokenize 函数的 header :
void tokenize(string& s, char c, vector<string>& v)
现在,在对文件进行标记后,我必须创建一个将每个单词放入 map 中的函数,我正在考虑使用无序 map ,在 map 中每个单词出现一次。我还必须以某种方式将单词的频率存储在某处。我认为使用 docId
作为 map 中的键是个好主意,但后来我意识到我只能有一个 docId
来显示单词,而在我的文本文件中,docId
有多个单词。
那么,我该如何解决这个问题呢?我应该从哪里开始?
最佳答案
多么乱七八糟的问题。分解一下,如果我理解正确的话,你有:
doc1 word1a word1b word1c word1d
doc2 word2a word2b word2c
...
您需要从单词到文档的映射,反之亦然。从您的问题中很难判断您所说的“频率”一词是否反射(reflect)了同一个词是多个文档的关键字,或者您对文件格式的描述是否未能在每个文件中包含所需的重复次数。假设前者:
if (std::ifstream f(filename))
{
std::map<std::string, std::vector<string>> words_in_doc;
std::map<std::string, std::vector<string>> docs_containing_word;
std::string line;
while (getline(f, line))
{
std::istringstream iss(line);
std::string docid, word;
if (line >> docid)
while (line >> word)
{
words_in_doc[docid].push_back(word);
docs_containing_word[word].push_back(docid);
}
}
// do whatever with your data/indices...
}
else
std::cerr << "unable to open input file\n";
关于c++ - 当我已经对我的文件进行标记后,如何创建倒排索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28455715/