C++ 倒排索引的实现

来源:互联网 发布:淘宝小二商家客服电话 编辑:程序博客网 时间:2024/06/10 11:57

1.1基本介绍

 倒排索引的概念很简单:就是将文件中的单词作为关键字,然后建立单词与文件的映射关系。当然,你还可以添加文件中单词出现的频数等信息。倒排索引是搜索引擎中一个很基本的概念,几乎所有的搜索引擎都会使用到倒排索引。

1.2 准备工作

²  5个源文件

Test0.txt, Test1.txt,Test2.txt, Test3.txt, Test4.txt

里面包含了一些英文句子,由单词组成,空格分开

²  Index.txt

由文件ID和文件的绝对路径构成,一个文件占一行

²  Result.txt

显示结果的文件,倒排索引表将在里面显示出来,单词后面跟的文件ID

 

1.3算法描述

²  使用C++的STL中的MAP存储索引表,string 存储单词,vector存储文件ID,循环读入文件,将文件中的单词一个一个读入进来,再添加上文件ID,直到所有的文件都被处理完。遍历索引表MAP,输出结果。

²  字典树建立,例程将26个字母映射成0~25的数字,每读入一个的单词插入单词的同时建立起字典树,每个字母有26个后继,用malloc动态分配空间,

该程序将求出输入以某个字符串为前缀的单词数量。

 

1.4算法说明

²  只能分割英文单词,建立索引表,中文词组无法分割出来

²  没有添加对符号的处理,符号只能随其紧挨的单词一起出现

²  没有统计单词频率信息

²  没有将单词统一处理成为它们的原型,增加了索引表的长度

²  因为map默认按键值弱排序,因此输出的结果是按单词的字典序输出

²  index.txt,result.txt是用freopen重定向打开的,这2个文件必须在源代码的同一目录下才能运行成功。

源输入文件是以绝对路径保存在index.txt中,移植运行时需改变路径

源代码:

#include <iostream>#include <fstream>#include <stdio.h>#include <string.h>#include <map>#include <vector>#include <string>#include <algorithm>using namespace std;map<string,vector<int>> indextable;   // 倒排索引表void init()                           // 初始化表{indextable.clear();}int main(){//重定向到index.txt读入,输出到result.txt. index.txt,result.txt都在当前目录下freopen("index.txt","r",stdin);freopen("result.txt","w",stdout);init();int id;string filepath;         // 文件路径名while(cin>>id>>filepath){ifstream fin(filepath.c_str());    // 打开文件路径下的文件string s;while(fin>>s)                      // 一个单词一个单词的读入{indextable[s].push_back(id);   // 把当前单词对应的的文件名加入到单词对应的ID数组中}}map<string,vector<int>>::iterator map_it;    // 索引迭代器map_it = indextable.begin();while(map_it != indextable.end())            // 遍历整个索引表输出,因为MAP的键值是严格弱排序,因此输出是字典序{string tmp = map_it->first;cout << tmp << "  ";for(int i = 0;i != indextable[tmp].size();i++)    cout << indextable[tmp][i] << "  ";cout << endl;map_it++;}cin.get();cin.get();return 0;}

来自于:http://m.blog.csdn.net/blog/lentty1452/8679813


原创粉丝点击