当我已经标记了我的文件时,如何创建倒排索引?
How to create an inverted index when I've already tokenized my file?
我正在尝试创建一个反向索引。我正在读取一个文本文件的行,该文本文件在每行的第一个位置都有文档docId
的id,而该行的其余部分则有关于该文档的关键字。为了创建一个反向索引,我首先必须标记这个文本文件。我用我写的一个函数来实现它,我把每个单词都存储在一个向量中。我唯一的抱怨是,我还将docId
作为字符串存储在向量中。如果你需要的话,这里是标记化函数的标题:
void tokenize(string& s, char c, vector<string>& v)
现在,在标记文件后,我必须创建一个函数,将每个单词都放在映射中,我想使用一个无序的映射,在映射中每个单词都出现一次。我还必须以某种方式将单词的频率存储在某个地方。我原以为在地图中使用docId
作为关键字是个好主意,但后来我意识到我只能有一个docId
来显示单词,而在我的文本文件中,docId
有多个单词。
那么,我该如何解决这个问题呢?我应该从哪里开始?
真是一个一团糟的问题。分解一下,如果我理解正确的话,你有:
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 filen";
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- 创建动态数组后,"i"变量不知从何而来
- 将 QFile::copy 创建创建文件的副本或将内容从一个文件移动到另一个文件