0

逆索引を作成しようとしています。テキスト ファイルの行を読んでいます。テキスト ファイルには、各行の最初の位置にドキュメントの ID がdocIdあり、残りの行にはこのドキュメントに関するキーワードがあります。転置インデックスを作成するには、まずこのテキスト ファイルをトークン化する必要があります。私が書いた関数でそれを行い、すべての単語をベクトルに保存しました。私の唯一の不満はdocId、ベクトルに文字列としても保存することです。必要に応じて、トークン化関数のヘッダーを次に示します。

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

ファイルをトークン化した後、すべての単語をマップに配置する関数を作成する必要があります。順序付けられていないマップを使用することを考えています。マップでは、すべての単語が 1 回表示されます。また、単語の頻度をどこかに保存する必要もあります。をマップのキーとして使用するのは良い考えだと思いましたが、テキスト ファイルには複数の単語が含まれているのに、単語を表示docIdできるのは 1 つしかないことに気付きました。docIddocId

では、どうすればこの問題を解決できるでしょうか。どこから始めればよいですか?

4

1 に答える 1

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";
于 2015-02-19T16:57:50.117 に答える