Как создать инвертированный индекс, когда я уже токенизировал свой файл?
Я пытаюсь создать инвертированный индекс. Я читаю строки текстового файла, текстовый файл имеет в первой позиции каждой строки идентификатор документа 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";