成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Erlang實戰建立文本索引

開發 開發工具
我們今天將改進作者以前建立文本索引的方式,使用ETS來存儲單詞及其索引列表,同時拆分詞使用Erlang提供的string:token模塊,更加靈活和可移植性。

為文本建立索引是文本信息處理的一個重要的任務,給定一個由英文單詞構成的文件,為文件中所有單詞建立索引,記錄每個單詞出現的行號和每行出現的次數,并將索引存入一個文件。在Erlang實戰練習(六)中我強調了當時建立文本索引的時候太粗糙,一是使用了盡量規避的進程字典的方式;二是分詞使用的是正則表達式,不夠靈活。本文將改進我以前建立文本索引的方式,使用ETS來存儲單詞及其索引列表,同時拆分詞使用Erlang提供的string:token模塊,更加靈活和可移植性。

word_index.erl文件的總體結構如下:

  1. -module(word_index).    
  2. -export([start/2]).    
  3. -import(re, [run/2,replace/4]).    
  4. -import(string,[substr/3]).   
  5. %% start兩個參數:FileIn表示要建立索引的文本文件,FileOut表示索引保存的目標文件start(FileIn,FileOut) ->  
  6.     {_First,Second} = file:open(FileIn,read),%% 只讀打開FileIn文件   
  7. if 
  8.         _First =:= ok ->  
  9.             LineList = readFile(Second,0),%% 函數readFile/2的功能是將文本以行為單位,存入列表                
  10. %io:format("~nfile contents:~p~n",[LineList]),  
  11.             TableID = ets:new(index,[ordered_set]),%% ets:new創建一個“鍵值”搜索表,
  12. 存儲鍵值映射元祖,設置表名為index,表的類型為ordered_set                
  13. index(FileOut,LineList,TableID);%% 為文本中的每一行建立單詞索引              
  14. _First =/= ok ->  
  15.             io:format("Open file error: file doesn't exist!")  
  16.     end.  

readFile/2函數代碼如下:

  1. %% 讀取文本每一行,以{Line,LineNo}為元組存入列表中readFile(S, LineNo) -> readFile(S,LineNo,[]).  
  2.  
  3. readFile(S, LineNo, Ret) ->  
  4.     UpdateLineNo = LineNo +1,  
  5.     OneLine = io:get_line(S,''),%% 讀取文件中的一行內容      if 
  6.         OneLine =:= eof ->  
  7.              io:format("Read file EOF!"),  
  8.              file:close(S),  
  9.              lists:reverse(Ret);  
  10.         OneLine =/= eof ->  
  11.             readFile(S,UpdateLineNo, [{OneLine,UpdateLineNo} | Ret])  
  12.     end. 

index/3函數代碼如下:

  1. index(File,LineList,TableID) ->  
  2.     if 
  3.         length(LineList) =:= 0 ->  
  4.             ToList = ets:tab2list(TableID),  
  5.             io:format("index is:~n~p~n",[ToList]),  
  6.             writeToFile(File,ToList),  
  7.             io:format("create index success! ");  
  8.         length(LineList) =/= 0 ->  
  9.             First = lists:nth(1,LineList),  
  10.             processOneLine(First,TableID),  
  11.             index(File,lists:delete(First, LineList), TableID)              
  12.     end.  
  13.  
  14. %% 處理一行文本processOneLine(OneLine, TableID) ->  
  15.     {Element, LineNo } = OneLine,  
  16.     %io:format("Line no:~p~n",[LineNo]),  
  17.     Words = string:tokens(Element,"\n\t "),  
  18.     matchWords(Words,LineNo,TableID).  
  19.  
  20. matchWords([], LineNo, TableID) ->   
  21.     io:format("process line(~p) success!~n",[LineNo]);  
  22.       
  23. matchWords(Words, LineNo, TableID) ->  
  24.     %io:format("Words:~p~n",[Words]),  
  25.     Word = lists:nth(1,Words),  
  26.     _Value = ets:lookup(TableID,Word),%%返回值為匹配Word的元組列表       if 
  27.         length(_Value) =:= 0 -> %% Word還未被索引,直接插入此Word索引                ets:insert(TableID,{Word,[{LineNo,1}]} );  
  28.         length(_Value) =/= 0 -> %% Word已被索引,更新Word索引列表                 KVs = lists:nth(1,_Value),  
  29.             Value = element(2,KVs),  
  30.             ets:insert(TableID,{Word, insertRec(Value,LineNo) } )  
  31.     end,  
  32.     matchWords(lists:delete(Word, Words), LineNo, TableID).  
  33.  
  34. %% 處理行號與出現次數元組列表insertRec(List,LineNo) -> insertRec(List,LineNo,length(List)).  
  35.  
  36. insertRec(List, LineNo, 0) ->   
  37.     [{LineNo, 1} |List];  
  38. insertRec(List, LineNo, Ret) ->  
  39.     First = lists:nth(Ret,List),  
  40.     {LN, Num} = First,  
  41.     if 
  42.         LN =:= LineNo ->  
  43.             Temp = lists:delete(First, List),  
  44.             [{LineNo, Num+1} | Temp];  
  45.         LN =/= LineNo ->  
  46.             insertRec(List, LineNo, Ret-1)  
  47.     end.  
  48.              
  49.  
  50. %% 將索引寫入文件writeToFile(File,ToList) ->  
  51.     {ok,S} = file:open(File,write),  
  52.     lists:foreach(fun(X) -> io:format(S,"~p.~n",[X]) end, ToList),  
  53.     file:close(S). 

至此,我已經將使用ets存儲鍵值大型表來存儲單詞索引列表的程序講完了,大家自己回去動手試驗吧。本文是繼續上文的一個續篇,是一種改進的建立文本索引方式。以后我還好繼續通過實戰練習來探討Erlang的學習與總結思考,謝謝大家的關注。

原文:http://www.cnblogs.com/itfreer/archive/2012/05/07/Erlang_in_practise_index.html

【編輯推薦】

  1. Erlang之父Joe Armstrong訪談:程序調試與啤酒
  2. Scala和Erlang,以及多核主導的未來
  3. Erlang面向分布與并發的編程語言
  4. 看Erlang中Actor模型的執行方式和優劣
  5. Erlang視點:并行計算和云計算
責任編輯:彭凡 來源: 博客園
相關推薦

2012-05-08 13:42:24

Erlang

2012-05-14 13:58:19

Erlang

2010-11-29 10:22:46

Sybase建立索引

2024-03-01 09:57:19

數據庫檢索項目

2011-08-16 13:27:34

索引

2010-05-31 12:31:42

MySQL建立索引

2011-08-15 18:20:05

建立索引SQL Sever數據

2010-09-06 17:08:23

2013-11-25 15:12:26

iOS開發

2010-09-17 14:13:20

SIP業務Erlang

2012-12-04 10:29:47

PostgreSQL索引

2011-04-01 15:36:24

索引SQL Server

2010-10-26 16:54:16

oracle全文索引

2010-08-06 13:26:29

DB2建立databa

2018-05-08 18:26:49

數據庫MySQL性能

2022-02-11 12:55:00

前綴索引索引值

2011-08-17 20:48:25

索引建立語句非聚集索引唯一索引

2012-12-24 13:54:13

WebjQuery前端

2012-05-07 08:47:25

Erlang

2009-04-28 19:42:44

Linux系統FTP搜索
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄色网毛片 | 五月激情婷婷在线 | 色视频在线免费观看 | 综合一区二区三区 | 国产精品久久久久久久久久 | 91免费福利在线 | 国产成人精品一区二区三区网站观看 | 丝袜美腿一区二区三区 | 日本精品裸体写真集在线观看 | 黄色免费网址大全 | 影音先锋成人资源 | 国产精品久久久久久久久免费软件 | 成人动漫一区二区 | 最新国产精品 | 久久精品一区 | 91丨国产 | 久久久久国产精品午夜一区 | 久久久高清 | 日韩在线播放视频 | aa级毛片毛片免费观看久 | 欧美激情久久久久久 | 欧美一级大片免费看 | 亚洲国产精品精华素 | 黄色在线免费观看 | 国产日韩欧美在线 | 欧美日韩中文字幕在线 | 国产成人精品一区二区三区在线 | 中文字幕国产 | 午夜寂寞网站 | 国产视频h | 国产精品jizz在线观看老狼 | 国产在线观看一区二区三区 | 日日艹夜夜艹 | 日韩免费 | 午夜大片| 日韩午夜在线观看 | www成人免费视频 | 精品久久久一区 | 夜色www国产精品资源站 | 午夜电影合集 | 99re6热在线精品视频播放 |