成人免费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技術棧公眾號

主站蜘蛛池模板: 久久欧美精品 | 亚洲高清一区二区三区 | 老司机狠狠爱 | 国产亚洲欧美在线 | 黄色一级免费 | 久久精品国产亚洲 | 玖玖国产| 亚洲一区视频 | 国产色在线| 亚洲精品成人 | 在线观看中文字幕 | 玖玖爱365| 国产精品久久久久久久久污网站 | 一级一级毛片免费看 | 国产99免费视频 | 免费在线观看一区二区三区 | 免费一区二区三区在线视频 | 国产精品18hdxxxⅹ在线 | 久久精品男人的天堂 | 日韩免费一区 | 午夜影院在线播放 | 亚洲欧美日韩精品久久亚洲区 | 亚洲欧洲一区二区 | 久久久涩 | 日韩av免费在线观看 | 亚洲视频在线免费 | 在线免费观看黄a | 99reav| 毛片视频观看 | 久草视频观看 | 亚洲成人动漫在线观看 | 日本欧美在线视频 | 精品欧美激情在线观看 | 国产精品区一区二区三 | 一级片av| 成人精品视频免费 | 亚洲精品av在线 | 伦理二区| 色综合天天天天做夜夜夜夜做 | 午夜丁香视频在线观看 | 在线观看视频91 |