当我已经将我的文件标记化时,如何创建倒排索引?

时间:2015-02-11 13:33:45

标签: c++ vector unordered-map inverted-index

我正在尝试创建倒排索引。我正在读取文本文件的行,文本文件在每行的第一个位置具有文档docId的ID,而该行的其余部分具有关于此文档的关键字。  为了创建倒排索引,我首先必须对此文本文件进行标记。我用我编写的函数完成了它,并将每个单词存储在向量中。我唯一的抱怨是我还将docId作为字符串存储在向量中。如果需要,这是tokenize函数的标题:

void tokenize(string& s, char c, vector<string>& v)

现在,在对文件进行标记后,我必须创建一个将每个单词放在地图中的函数,我正在考虑使用无序地图,在地图中每个单词都会出现一次。我还必须以某种方式存储单词的频率。我认为使用docId作为地图中的关键点是一个好主意,但后来我意识到我只能有一个docId会向我显示这个词,而在我的文本文件中有一个{ {1}}有多个单词。

那么,我怎么解决这个问题呢?我应该从哪里开始?

1 个答案:

答案 0 :(得分:1)

一个混乱的问题。打破它,如果我理解你有:

doc1 word1a word1b word1c word1d
doc2 word2a word2b word2c
...

您希望从单词到文档的映射,反之亦然。很难从你的问题中判断出你是否在谈论词语&#34;频率&#34;反映同一个单词是多个文档的关键字,或者您对文件格式的描述是否未能在每个文件中包含重复所需的计数。假设前者:

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";