日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Erlang實(shí)戰(zhàn)建立文本索引

為文本建立索引是文本信息處理的一個(gè)重要的任務(wù),給定一個(gè)由英文單詞構(gòu)成的文件,為文件中所有單詞建立索引,記錄每個(gè)單詞出現(xiàn)的行號(hào)和每行出現(xiàn)的次數(shù),并將索引存入一個(gè)文件。在Erlang實(shí)戰(zhàn)練習(xí)(六)中我強(qiáng)調(diào)了當(dāng)時(shí)建立文本索引的時(shí)候太粗糙,一是使用了盡量規(guī)避的進(jìn)程字典的方式;二是分詞使用的是正則表達(dá)式,不夠靈活。本文將改進(jìn)我以前建立文本索引的方式,使用ETS來(lái)存儲(chǔ)單詞及其索引列表,同時(shí)拆分詞使用Erlang提供的string:token模塊,更加靈活和可移植性。

word_index.erl文件的總體結(jié)構(gòu)如下:

 
 
 
  1. -module(word_index).  
  2. -export([start/2]).  
  3. -import(re, [run/2,replace/4]).  
  4. -import(string,[substr/3]). 
  5. %% start兩個(gè)參數(shù):FileIn表示要建立索引的文本文件,F(xiàn)ileOut表示索引保存的目標(biāo)文件start(FileIn,FileOut) ->
  6.     {_First,Second} = file:open(FileIn,read),%% 只讀打開(kāi)FileIn文件   
  7. if
  8.         _First =:= ok ->
  9.             LineList = readFile(Second,0),%% 函數(shù)readFile/2的功能是將文本以行為單位,存入列表                
  10. %io:format("~nfile contents:~p~n",[LineList]),
  11.             TableID = ets:new(index,[ordered_set]),%% ets:new創(chuàng)建一個(gè)“鍵值”搜索表,
  12. 存儲(chǔ)鍵值映射元祖,設(shè)置表名為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函數(shù)代碼如下:

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

index/3函數(shù)代碼如下:

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

至此,我已經(jīng)將使用ets存儲(chǔ)鍵值大型表來(lái)存儲(chǔ)單詞索引列表的程序講完了,大家自己回去動(dòng)手試驗(yàn)吧。本文是繼續(xù)上文的一個(gè)續(xù)篇,是一種改進(jìn)的建立文本索引方式。以后我還好繼續(xù)通過(guò)實(shí)戰(zhàn)練習(xí)來(lái)探討Erlang的學(xué)習(xí)與總結(jié)思考,謝謝大家的關(guān)注。

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


文章題目:Erlang實(shí)戰(zhàn)建立文本索引
分享路徑:http://www.5511xx.com/article/cceoihj.html