posts - 241,  comments - 116,  trackbacks - 0

经过了几天的折磨solr,公司又要求修改以前的一个 nutch项目,这次修改的东西比较多了,涉及到索引字段和日期索引等,这个我们下次再讲,今天我们来讲一下nutch的中文分词。这时,我还是用了 IKAnalyzer,再次感谢作者的辛劳。提醒一下,这时用到的NUTCH是1.2版本。大智慧打不开

废话不多说,我们现在开始进入正题:

1)在我们修改之前,我们先去下载一个工具,javacc,一个JAVA编译器,可以到这里来下载,http://java.net/projects/javacc/downloads,下载完成后当然要解压啦(废话,呵呵),然后设置path把解压的路径添加到后面,确定可以从cmd进入。

2)我们需要添加中文分词,首先需要找到 org.apache.nutch.analysis包内的NutchAnalysis.jj这个文件,找到| <SIGRAM: <CJK> >,把它修改为<SIGRAM: (<CJK>)+ >。

3)当我们修改完成后,我们需要把它进行重新编译,我们先把 NutchAnalysis.jj拷到另外一个文件夹,免得生成的文件跟原有文件混淆了。在cmd中进行拷贝的文件夹,例如我们拷到temp,在temp 目录内运行javacc NutchAnalysis.jj这个命令,它会在当前目录下生成好几个文件,把这几个文件复制到org.apache.nutch.analysis包 内(文件列表如下),直接覆盖即可:

注意,生成的文件NutchAnalysis.java会有错误,只要抛出异常即可。

修改完这时后,summary-basic的main函数会报错,同样也是异常的抛出问题,只要在这时进行捕获就可以了。

代码修改如下:

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)当我们修改完成后,剩下来的一个就是修改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作为分词器,当然需要先把这个添加到lib目录下。

5)完成完上面的步骤,也许有些人就以为搞定了,但事情并没这么简单,也许当我们搜索的时候会突然报出一个什么没有该Field的错误,有点抱歉,这个错误不能重现了。

如果查询时报什么错误,我们可以试着在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时会出现数组溢出的错误。

当完成这一系列操作之后,我们就可以在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,这样生成的索引就已经是经过中文分词的。

posted on 2011-05-17 11:56 墙头草 阅读(1031) 评论(1)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 
人人游戏网 软件开发网 货运专家