2015-02-11 50 views
0

我正试图创建一个倒排索引。我正在阅读文本文件的行,文本文件在每行的第一位置有一个文档的编号docId,该行的其余部分包含关于此文档的关键字。 为了创建一个倒排索引,我首先必须标记这个文本文件。我用我写的函数做了它,并且我将每个单词存储在一个向量中。我唯一的抱怨就是我还将docId作为字符串存储在向量中。这里是记号化功能的标题,如果你需要它:如何创建倒排索引时,我已经标记了我的文件?

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

现在令牌化的文件后,我必须创建使每一个字在一个地图,我想用一个无序地图的功能,每个单词的地图都会出现一次。我也必须以某种方式在某处存储单词的频率。我认为使用docId作为地图中的关键字是一个好主意,但后来我意识到我只能有一个docId这会向我显示该单词,而在我的文本文件中docId有多个单词。

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

+0

开始写一些代码后,你可以得到你所面临的问题的帮助。也许你还应该提供tokenize()的代码。顺便说一句:必须有一些关于地图的更多信息!可以肯定的是,听起来好像这些词是关键词,但它应该保留哪些价值?也许这可能是特定单词被找到的次数的计数,例如, 'map ' – 4386427 2015-02-11 13:55:10

回答

1

这是一个多么混乱的问题。打破它,如果我理解正确,你有:

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

你想要从单词到文档的映射,反之亦然。从您的问题中很难判断,您对单词“频率”的讨论是否反映了同一个单词是多个文档的关键字,或者您对文件格式的描述是否未包含每个文件中重复所需的计数。假设前者:

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"; 
相关问题