posts - 241,  comments - 116,  trackbacks - 0

          經(jīng)過了幾天的折磨solr,公司又要求修改以前的一個 nutch項目,這次修改的東西比較多了,涉及到索引字段和日期索引等,這個我們下次再講,今天我們來講一下nutch的中文分詞。這時,我還是用了 IKAnalyzer,再次感謝作者的辛勞。提醒一下,這時用到的NUTCH是1.2版本。大智慧打不開

          廢話不多說,我們現(xiàn)在開始進入正題:

          1)在我們修改之前,我們先去下載一個工具,javacc,一個JAVA編譯器,可以到這里來下載,http://java.net/projects/javacc/downloads,下載完成后當(dāng)然要解壓啦(廢話,呵呵),然后設(shè)置path把解壓的路徑添加到后面,確定可以從cmd進入。

          2)我們需要添加中文分詞,首先需要找到 org.apache.nutch.analysis包內(nèi)的NutchAnalysis.jj這個文件,找到| <SIGRAM: <CJK> >,把它修改為<SIGRAM: (<CJK>)+ >。

          3)當(dāng)我們修改完成后,我們需要把它進行重新編譯,我們先把 NutchAnalysis.jj拷到另外一個文件夾,免得生成的文件跟原有文件混淆了。在cmd中進行拷貝的文件夾,例如我們拷到temp,在temp 目錄內(nèi)運行javacc NutchAnalysis.jj這個命令,它會在當(dāng)前目錄下生成好幾個文件,把這幾個文件復(fù)制到org.apache.nutch.analysis包 內(nèi)(文件列表如下),直接覆蓋即可:

          注意,生成的文件NutchAnalysis.java會有錯誤,只要拋出異常即可。

          修改完這時后,summary-basic的main函數(shù)會報錯,同樣也是異常的拋出問題,只要在這時進行捕獲就可以了。

          代碼修改如下:

          Java代碼  收藏代碼
          1.  Query query = null;  
          2. try {  
          3.     query = Query.parse(queryBuf.toString(), conf);  
          4. catch (ParseException e) {  
          5.     // TODO Auto-generated catch block  
          6.     e.printStackTrace();  
          7. }  

          4)當(dāng)我們修改完成后,剩下來的一個就是修改NutchDocumentAnalyzer.java中的tokenStream()方法,修改如下:

          Java代碼  收藏代碼
          1. public TokenStream tokenStream(String fieldName, Reader reader) {  
          2.     Analyzer analyzer;  
          3.     /*if ("anchor".equals(fieldName)) 
          4.       analyzer = ANCHOR_ANALYZER; 
          5.     else 
          6.       analyzer = CONTENT_ANALYZER;*/  
          7.     analyzer = new IKAnalyzer();  
          8.     TokenStream tokenStream = analyzer.tokenStream(fieldName,reader);  
          9.     tokenStream.addAttribute(TypeAttribute.class);  
          10.     tokenStream.addAttribute(FlagsAttribute.class);  
          11.     tokenStream.addAttribute(PayloadAttribute.class);  
          12.     tokenStream.addAttribute(PositionIncrementAttribute.class);  
          13.   
          14.     return tokenStream;  
          15.   }  

          這時是添加IKAnalyzer作為分詞器,當(dāng)然需要先把這個添加到lib目錄下。

          5)完成完上面的步驟,也許有些人就以為搞定了,但事情并沒這么簡單,也許當(dāng)我們搜索的時候會突然報出一個什么沒有該Field的錯誤,有點抱歉,這個錯誤不能重現(xiàn)了。

          如果查詢時報什么錯誤,我們可以試著在summary-basic插件的源碼中修改如下:

          添加修改getSummary方法:

          Java代碼  收藏代碼
          1. if (highlight.contains(t.term())) {  
          2.             excerpt.addToken(t.term());  
          3.             if(offset < t.startOffset()){  
          4.                 excerpt.add(new Fragment(text.substring(offset, t.startOffset())));  
          5.                 excerpt.add(new Highlight(text.substring(t.startOffset(),t.endOffset())));  
          6.             }else{  
          7.                 excerpt.add(new Highlight(text.substring(offset,t.endOffset())));  
          8.             }  
          9.             offset = t.endOffset();  
          10.             endToken = Math.min(j + sumContext, tokens.length);  
          11.           }  

            添加的為這段代碼

          Java代碼  收藏代碼
          1. if(offset < t.startOffset()){  
          2.             excerpt.add(new Fragment(text.substring(offset, t.startOffset())));  
          3.             excerpt.add(new Highlight(text.substring(t.startOffset(),t.endOffset())));  
          4.            }else{  
          5.             excerpt.add(new Highlight(text.substring(offset,t.endOffset())));  
          6.            }  

            這是修改getSummary時會出現(xiàn)數(shù)組溢出的錯誤。

          當(dāng)完成這一系列操作之后,我們就可以在nutch目錄中用ant命令進行編譯。編譯會重新生成所有jar包和job包。可以在build目錄下找到。

          我們需要把最主要的nutch-X.jar和nutch-X.job拷貝到需要進行爬取和nutch目錄下進行覆蓋。(其中的X為nutch的版本)

          接下來,我們就可以重新運行nutch crawl urls -dir crawl -depth 4 -threads 10 -topN 50 >&crawl.log,這樣生成的索引就已經(jīng)是經(jīng)過中文分詞的。

          posted on 2011-05-17 11:56 墻頭草 閱讀(1041) 評論(1)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          人人游戲網(wǎng) 軟件開發(fā)網(wǎng) 貨運專家
          主站蜘蛛池模板: 嵊州市| 合山市| 曲麻莱县| 昌图县| 乌兰察布市| 长宁区| 尖扎县| 黄浦区| 长葛市| 吴川市| 西林县| 巴中市| 通渭县| 大同县| 陈巴尔虎旗| 哈尔滨市| 温州市| 汉川市| 扬中市| 长子县| 白银市| 马关县| 凤台县| 永宁县| 通许县| 太谷县| 东兰县| 桦甸市| 香格里拉县| 南召县| 景宁| 上高县| 尼木县| 双江| 克山县| 遂平县| 丰都县| 博罗县| 阿合奇县| 鹿泉市| 肥乡县|