Как создать инвертированный индекс, когда я уже токенизировал свой файл?

Я пытаюсь создать инвертированный индекс. Я читаю строки текстового файла, текстовый файл имеет в первой позиции каждой строки идентификатор документа docId и остальная часть строки имеет ключевые слова об этом документе. Для того, чтобы создать инвертированный индекс, я сначала должен токенизировать этот текстовый файл. Я сделал это с помощью функции, которую я написал, и я храню каждое слово в векторе. Моя единственная неприятность в том, что я также храню docId в виде строки в векторе. Вот заголовок функции токенизации, если вам это нужно:

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

Теперь после токенизации файла мне нужно создать функцию, которая помещает каждое слово в карту, я думаю об использовании неупорядоченной карты, в карте каждое слово появляется один раз. Я также должен как-то хранить частоту слова где-то. Я думал, что с помощью docId в качестве ключа на карте было бы хорошей идеей, но потом я понял, что у меня может быть только один docId который покажет мне слово, а в моем текстовом файле docId имеет более одного слова.

Итак, как я собираюсь решить эту проблему? С чего мне начать?

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";
Другие вопросы по тегам