1. 程式人生 > >Nutch1.2 新增IKAnalyzer中文分詞

Nutch1.2 新增IKAnalyzer中文分詞

原版nutch中對中文的處理是按字劃分,而不是按詞劃分,我們可以為其新增一些中文分詞外掛,例如IKAnalyzer。參看了網上很多教程,最後也沒能成功,最後綜合了幾個教程的內容,最終成功。

首先作以下幾點說明,以方便理解:

(1)目前,Nutch中文分詞方式大致有兩種方式:
一是修改原始碼。這種方式是直接對Nutch分詞處理類進行修改,呼叫已寫好的一些分片語件進行分詞。
二是編寫分詞外掛。這種方式是按照Nutch定義的外掛編寫規則重新編寫或者新增中文分詞外掛。
以上兩種方式都是可取的。目前,由於開源社群的活躍,已經有很多種分片語件的出現,無論是修改原始碼的方式還是編寫分詞外掛的方式,都是依賴於這些分片語件的。如IK、JE、庖丁等。

(2)NutchAnalysis.jj檔案用於搜尋時;NutchDocumentAnalyzer.java 用於索引時。

(3)用到了javacc、ant兩種工具。javacc用於編譯NutchAnalysis.jj檔案,該檔案最好拷貝到其它目錄編譯,編譯後再把生成的7個檔案拷貝回原目錄,如果在原目錄下編譯的話只會生成4個檔案。

(4)build.xml檔案是ant的配置檔案

(5)ant、javacc工具的使用方法類似,解壓後把bin目錄的路徑加到系統目錄(path)中,重啟計算機即可。詳看:Ant、Javacc 等安裝與使用

好了,下面是具體過程:

一、準備工作:

把IKAnalyzer3.2.8.jar檔案拷入nutch/lib目錄下

二、程式碼修改:

1. NutchAnalysis.jj

在nutch/src/java/org/apache/nutch/analysis目錄

在該檔案裡找到 | <SIGRAM: <CJK> >,這代表按字劃分,修改為 | <SIGRAM: (<CJK>)+ >

用javacc工具生成NutchAnalysis.jj的原始碼,將生成的所有java原始碼(7個檔案)全部覆蓋到 src/java/org/apache/nutch/analysis包下.

javacc的使用方法:cmd進入命令列,切換到NutchAnalysis.jj所在目錄(最後把它拷貝到其它目錄進行編譯,如D盤),D:,輸入命令

javacc NutchAnalysis.jj

就會生成7個檔案了。

2. NutchAnalysis.java

在nutch/src/java/org/apache/nutch/analysis目錄

(1)在import區域加入下面的程式碼(不確定需不需要這步)

import org.wltea.analyzer.lucene.IKTokenizer;
(2)在兩個位置加入ParseException異常捕捉命令,否則ant時會提示。下面的程式碼已經新增

3. NutchDocumentAnalyzer.java

(1)引入IK包

import org.wltea.analyzer.lucene.IKAnalyzer; //tjt update
import org.apache.lucene.analysis.tokenattributes.*;

(2)修改public TokenStream tokenStream(String fieldName, Reader reader) {函式為:

4. nutch/build.xml

(1)在 <target name="war" depends="jar,compile,generate-docs"></target>的<lib></lib>之間<include name="log4j-*.jar"/> 下(約200行),加入下面的命令使的編譯war檔案的時候加入je-analysis的jar檔案,注意IKAnalyzer3.2.8.jar的版本號

<include name="IKAnalyzer3.2.8.jar"/>

(2)修改<targe tname="job" depends="compile">,改為<target name="job" depends="compile,war">這樣編譯後能自動在bulid資料夾下生成nutch-1.2.job,nutch-1.2.war,nutch-1.2.jar檔案了。(注:不這樣也可以,最後直接ant war, ant jar 就能生成nutch-1.2.war,nutch-1.2.jar)

5. ant

cmd進入命令列,切換到nutch所在目錄,執行ant命令,就會開始ant工作。完成後會在nutch目錄下生成build目錄

6.檔案替換

(1)將build/nutch-1.2.job替換nutch目錄下檔案

(2)將build/nutch-1.2.jar替換nutch目錄下檔案

(3)將build/nutch-1.2.war替換nutch目錄下檔案,這步不需要的

注:如果ant後沒有在build目錄下生成nutch-1.2.jar和nutch-1.2.war檔案,則命令列執行命令 ant jar 和 ant war生成這兩個檔案

7. 重新爬行與建立索引

注意需要配置好環境(conf/nutch-site.xml,crawl-urlfilter.txt,urls目錄等,詳看環境配置

bin/nutch crawl urls -dir csdn -threads 4 -depth 2 -topN 30  爬行
bin/nutch org.apache.nutch.searcher.NutchBean csdn   檢索

8.檢視結果

用Luke檢視索引,如果已變成片語,則索引成功;也可以直接用Nutch自帶的NutchBean命令檢索網頁中含有的片語,如果有結果說明成功,如

bin/nutch org.apache.nutch.searcher.NutchBean '引擎' 

注:需要在conf/nutch-site.xml檔案中如下配置,E:/nutch/csdn為搜尋結果目錄

<property>
<name>searcher.dir</name>
<value>E:/nutch/csdn</value>
<description></description>
</property>

9.Tomcat搜尋

(1)將新生成的nutch-1.2.war拷貝到Tomcat 7.0/webapps目錄,啟動Tomcat服務後,會自動在該目錄下生成一個nutch資料夾。

(2)將新生成的nutch-1.2.jar檔案和分詞包(IKAnalyzer3.2.8.jar)拷貝到tomcat中WEB-INF/lib下面

注意:Tomcat/webapps/nutch/WEB-INF/classes/nutch-site.xml 配置

其它說明:

以下參考自:   

已不能訪問,可以到我的百度文庫檢視

選項:加入字典檔

    將 nutch-*.job 的檔案,用zip 工具解開,並將以下兩個檔案放入nutch-*.job 中即可

    IKAnalyzer.cfg.xml

    <properties> 
      <comment>IK Analyzer</comment>
      <entry key="ext_dict">/mydic.dic</entry>
    </properties>

    mydic.doc

    國家高速
    國家高速網路
    國家高速網路與計算中心

網上略顯麻煩的或錯誤的資訊:

(1)將build/classes打包成nutch-1.2.jar

cd $nutch-1.0/build/classes
jar cvf nutch-1.0-ika.jar .

或者(jar cvf e:/nutch/build/classes)

麻煩,可以直接用ant jar命令,或者按第4步第(2)小步的操作進行

(2)即使用原始的nutch所crawl下來的資料,將 重編後的nutch-1.0.jar nutch-1.0.job IKAnalyzer3.1.6 正確放到你原本的nutch搜尋網頁中,重新啟動tomcat後,也可直接享用有分詞的結果 (不正確)

(3)將 IKAnalyzer3.1.6GA.jar 的 /org/wltea/analyzer/dic/ 資料夾內 ,放入你要得字典檔,可以參考同資料夾內的 main.dic (不正確,沒用)

參考資料:

1. 讓 Nutch 支援中文分詞 方法教學 Nutch 1.0 + IK-Analyzer 3.1.6 中文分詞庫

2.Nutch1.2增加IKAnalyzer中文分詞

http://blog.csdn.net/laigood12345/archive/2010/12/12/6071046.aspx

3. Nutch中文分詞 (外掛方式JE分詞)

http://blog.csdn.net/oprah_7/archive/2011/03/09/6234296.aspx

4. Nutch 分詞 中文分詞 paoding 皰丁 (外掛方式)

http://blog.csdn.net/mutou12456/archive/2010/04/01/5439935.aspx

5. 為Nutch 1.0新增JE中文分詞 (修改原始碼)

http://yjiezhao.blog.163.com/blog/static/1152322392009101983837179/

Nutch中文分詞IK-Analyzer搜尋修改問題

在建立index 索引的時候已經把 分詞加進去了

Java code
/** * 往建立的初始化索引中新增內容,StandarAnalyzer表明用lunece自帶的標準分詞機制。 * false標示不覆蓋原來該目錄的索引 */ IndexWriter indexWrite = new IndexWriter(indexDir, new StandardAnalyzer(), true );



而在搜尋時,在建立 query 時也要把這個分詞加進去,而且這個分詞必須要和你建立索引時用的一樣才可以

Java code
String[] fields = { " title " , " body " }; /* 下面這個表示要同時搜尋這兩個域,而且只要一個域裡面有滿足我們搜尋的內容就行 */ BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD }; /** * MultiFieldQueryParser表示多個域解析 */ Query query = MultiFieldQueryParser.parse(searchString, fields, clauses, new StandardAnalyzer());