2015-02-11 52 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"; 
相關問題