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时会提示。下面的代码已经添加
view plain
  1. public static Query parseQuery(String queryString, Configuration conf) throws IOException,ParseException {  
  2.     return parseQuery(queryString, null, conf);  
  3.   }  
  view plain
  1. public static Query parseQuery(String queryString, Analyzer analyzer, Configuration conf)  
  2.     throws IOException,ParseException {  
  3.     NutchAnalysis parser = new NutchAnalysis(  
  4.           queryString, (analyzer != null) ? analyzer : new NutchDocumentAnalyzer(conf));  
  5.     parser.queryString = queryString;  
  6.     parser.queryFilters = new QueryFilters(conf);  
  7.     return parser.parse(conf);  
  8.   }  
   
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)  {函数为:
view plain
  1. public TokenStream tokenStream(String fieldName, Reader reader) {  
  2.      
  3.     Analyzer analyzer = new org.wltea.analyzer.lucene.IKAnalyzer();  
  4.     return analyzer.tokenStream(fieldName, reader);  
  5.   }  
   
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下面
(3) http://localhost:8080/nutch   搜索测试
注意:Tomcat/webapps/nutch/WEB-INF/classes/nutch-site.xml  配置
 
其它说明:
(1)关于NutchDocumentAnalyzer的修改,网上有分成多步骤的,一开始我也没搞清楚哪个对,仔细看了下,发现是一样的,只是把变量定义等单独成一行命令而已。 http://blog.csdn.net/laigood12345/archive/2010/12/12/6071046.aspx
  (2)上面的步骤是直接修改源码方式的,其它的还有插件方式的,如例子 http://blog.csdn.net/oprah_7/archive/2011/03/09/6234296.aspx
 
以下参考自:       
讓  Nutch  支援中文分詞  方法教學  Nutch  1.0  +  IK-Analyzer  3.1.6  中文分詞庫 http://trac.nchc.org.tw/cloud/wiki/waue/2010/0715
已不能访问,可以到我的百度文库查看
 
選項:加入字典檔
        將  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  中文分詞庫
http://trac.nchc.org.tw/cloud/wiki/waue/2010/0715
 
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/115232239200910198383717 9/
 
Nutch中文分词IK-Analyzer搜索修改问题在创建index  索引的时候已经把  分词加进去了
Java  code         IndexWriter indexWrite  =   new  IndexWriter(indexDir,                 new  StandardAnalyzer(),  true );


而在搜索时,在创建  query  时也要把这个分词加进去,而且这个分词必须要和你创建索引时用的一样才可以
Java  code    String[] fields  =  {  " title " " body "  };                 BooleanClause.Occur[] clauses  =  { BooleanClause.Occur.SHOULD,                BooleanClause.Occur.SHOULD };                 Query query  =  MultiFieldQueryParser.parse(searchString, fields,                clauses,  new  StandardAnalyzer());

你可能感兴趣的:(Nutch1.2 添加IKAnalyzer中文分词)