使用multiMap建立倒排索引,= =太方便都不用写hash作单词映射。
还有一些需要修改的地方
/**
* C++实现倒排索引
* Author:Steven'
* E-mail : steven_zhaosh@163.com feel free to contract to me!
* 文档按照文件读取的方式写入,我自己暂时没办法独立写一个中文分词出来,目前只支持英文文档。
* 倒排表通过multimap建立。
**/
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <map>
#include <stdlib.h>
#include <sstream>
using namespace std;
//存储倒排列表信息包括:TF,pos
struct DocMes{
int TF=0; //词频
string pos = ""; //在文档出现的位置
};
typedef map<string,map<int,DocMes>> IndexMap; //定义multiMap类型
typedef map<int,DocMes> invertMap;//倒排列表
//把单词转为小写
//void judge(string &word)
//把int转为String
string intToString(int a){
string res;
stringstream ss;
ss<<a;
ss>>res;
return res;
}
//索引建立,在与代码同文件夹的1.txt 2.txt 3.txt读入文档,分词,记录词语与词语对应倒排列表信息
void CreateIndex(IndexMap &index){
//读本地txt文档
ifstream fileIn;
for(int i=1;i<=3;i++){
string filepath = intToString(i)+".txt";
fileIn.open(filepath.c_str());
string temp;
int posNum = 0;
while(fileIn>>temp){
posNum++;
//judge(temp); //处理temp
index[temp][i].TF ++;
index[temp][i].pos +=intToString(posNum)+" , ";
cout<<"#";
}
fileIn.close();
}
}
//查询处理
void queryProcess(IndexMap &index){
string query;
cout<<"Look up your words:"<<endl;
while(true){
cout<<">>";
cin>>query;
if(index.find(query)==index.end()){
cout<<"ERROR: Can't find "<<query<<" ! ,please check up your words"<<endl;
continue;
}
invertMap::iterator iter;
iter = index[query].begin();
while(iter!=index[query].end()){
cout<<iter->first<<".txt : Tf="<<iter->second.TF<<" ; pos = < "<<iter->second.pos<<" >"<<endl;
iter++;
}
}
}
int main(){
IndexMap invertIndex;
cout<<"Creating Indexs:";
CreateIndex(invertIndex);
cout<<endl;
queryProcess(invertIndex);
getchar();
return 0;
}