C++ 倒排索引的实现

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中,移植运行时需改变路径


源代码:

[cpp]  view plain copy
  1. /* 
  2.   Author: lentty 
  3.   created:2013-03-15 21:36 
  4.   language:C++ 
  5. */  
  6. #include<iostream>  
  7. #include<fstream>  
  8. #include<stdio.h>  
  9. #include<string.h>  
  10. #include<map>  
  11. #include<vector>  
  12. #include<string>  
  13. #include<algorithm>  
  14. using namespace std;  
  15. map<string,vector<int> > indextable;//倒排索引表  
  16. void init() //初始化表  
  17. {  
  18.     indextable.clear();  
  19. }  
  20.   
  21. int main()  
  22. {  
  23.     //重定向从index.txt中读入,输出到result.txt,index.txt,result.txt都是在当前目录下  
  24.     freopen("index.txt","r",stdin);  
  25.     freopen("result.txt","w",stdout);  
  26.     init();  
  27.     int id;    //文件名  
  28.     string filepath; //文件路径名  
  29.     while(cin>>id>>filepath)//从index中读入文件名和文件路径名  
  30.     {  
  31.         ifstream fin(filepath.c_str());//打开文件路径下的文件,参数应是c风格的字符串  
  32.         string s;  
  33.         while(fin>>s)//一个单词一个单词地读入  
  34.         {  
  35.             indextable[s].push_back(id);//把当前单词对应的文件名加入到单词对应的ID数组中  
  36.         }  
  37.     }  
  38.     map<string,vector<int> >::iterator map_it;//索引表迭代器  
  39.     map_it=indextable.begin();  
  40.     while(map_it!=indextable.end())//遍历整个索引表输出,因为MAP的键值是严格弱排序,因此输出是字典序  
  41.     {  
  42.         string tmp=map_it->first;  
  43.         cout<<tmp<<" ";  
  44.         for(int i=0;i!=indextable[tmp].size();i++)  
  45.         cout<<indextable[tmp][i]<<" ";  
  46.         cout<<endl;  
  47.         map_it++;  
  48.     }  
  49.     return 0;  
  50. }  

运行结果:

Ability 4 
Algorithmic 3 
AnalysisPrinciple 3 
Benjamin 2 
Data 3 
Database 3 
Discrete 3 
English 4 
I 3 3 4 
Initiative, 4 
Mathematics 0 3 
Operating 3 
Peirce 2 
Practical 1 
Structure 3 
System 3 3 
The 2 
There 2 
Through 1 
Willing 4 
a 1 
ability. 4 
abstraction 1 
activity 1 
and 0 1 1 1 2 4 4 4 4 
are 2 
as 2 
basic 4 
been 1 
calculation, 1 
called 2 
change. 0 
chengdu 3 
communication 4 
cooperation 4 
counting, 1 
creations. 2 
debate 2 
development. 4 
enthusiasm 4 
etc. 3 
evolved 1 
exist 2 
filesdocuments. 4 
for 1 4 
from 1 
good 4 4 
habits, 4 
has 1 
have 3 4 
human 1 2 
independent 4 
is 0 2 
knowledge, 4 
learn 4 
learned 3 
logical 1 
love 3 
mathematical 2 
mathematician 2 
mathematics 1 1 
measurement, 1 
motions 1 
naturally 2 
numbers 2 
objects 2 
objects. 1 
of 0 1 1 1 3 
or 2 
over 2 
physical 1 
points 2 
professional 4 
programming 4 
progress. 4 
quantity, 0 
read 4 
reasoning, 1 
shapes 1 
skill, 4 
software 4 
space, 0 
structure, 0 
study 0 1 
style 4 
such 2 
systematic 1 
the 0 1 1 1 
to 4 4 
use 1 
well-knit 4 
whether 2 
write 4 

转自:http://blog.csdn.net/lentty1452/article/details/8679813

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
倒排索引是一种通过关键词反向索引文档的数据结构,用于实现全文检索。其主要思想是将文档中的每个关键词与其所在的文档进行关联,方便通过关键词快速定位文档。 具体实现过程如下: 1. 读取文档集合:首先,将需要进行全文检索的文档集合进行读取,将每个文档进行切词,得到文档的关键词列表。 2. 构建倒排索引:遍历每个文档,对于文档中的每个关键词,将其与文档进行关联。具体实现可以使用哈希表,关键词作为键,文档列表作为值。若某个关键词已经存在于哈希表中,则将当前文档添加到对应的文档列表中;否则,新建一个文档列表并将其与关键词关联起来。 3. 查询操作:当进行查询时,将查询关键词与倒排索引进行匹配。如果关键词在倒排索引中存在,就可以得到与之相关的文档列表,从而实现全文检索。同时,可以根据文档列表的长度进行排序,提高搜索结果的准确性和效率。 倒排索引实现全文检索的优点在于能够快速地定位到包含关键词的文档,并且可以通过对文档列表的操作进一步优化搜索结果。同时,倒排索引也可以支持通配符、布尔查询等高级查询操作,提供更灵活的全文检索功能。 总之,倒排索引是一种高效实现全文检索的数据结构,通过关键词的反向索引实现文档的快速定位。在搜索引擎、文档管理系统等领域广泛应用,提供了精确、快速的检索功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值