1. 程式人生 > >C++ 倒排索引的實現

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中,移植執行時需改變路徑

原始碼:

  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. usingnamespace std;  
  15. map<string,vector<int> > indextable;//倒排索引表
  16. void init() //初始化表
  17. {  
  18.     indextable.clear();  
  19. }  
  20. int main()  
  21. {  
  22.     //重定向從index.txt中讀入,輸出到result.txt,index.txt,result.txt都是在當前目錄下
  23.     freopen("index.txt","r",stdin);  
  24.     freopen("result.txt","w",stdout);  
  25.     init();  
  26.     int id;    //檔名
  27.     string filepath; //檔案路徑名
  28.     while(cin>>id>>filepath)//從index中讀入檔名和檔案路徑名
  29.     {  
  30.         ifstream fin(filepath.c_str());//開啟檔案路徑下的檔案,引數應是c風格的字串
  31.         string s;  
  32.         while(fin>>s)//一個單詞一個單詞地讀入
  33.         {  
  34.             indextable[s].push_back(id);//把當前單詞對應的檔名加入到單詞對應的ID陣列中
  35.         }  
  36.     }  
  37.     map<string,vector<int> >::iterator map_it;//索引表迭代器
  38.     map_it=indextable.begin();  
  39.     while(map_it!=indextable.end())//遍歷整個索引表輸出,因為MAP的鍵值是嚴格弱排序,因此輸出是字典序
  40.     {  
  41.         string tmp=map_it->first;  
  42.         cout<<tmp<<" ";  
  43.         for(int i=0;i!=indextable[tmp].size();i++)  
  44.         cout<<indextable[tmp][i]<<" ";  
  45.         cout<<endl;  
  46.         map_it++;  
  47.     }  
  48.     return 0;  
  49. }  

執行結果:

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