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

源代码:

#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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值