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中,移植執行時需改變路徑
原始碼:
- /*
- Author: lentty
- created:2013-03-15 21:36
- language:C++
- */
- #include<iostream>
- #include<fstream>
- #include<stdio.h>
-
#include<string.h>
- #include<map>
- #include<vector>
- #include<string>
- #include<algorithm>
- usingnamespace 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)//從index中讀入檔名和檔案路徑名
- {
- ifstream fin(filepath.c_str());//開啟檔案路徑下的檔案,引數應是c風格的字串
- 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++;
- }
- return 0;
- }
執行結果:
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