zoukankan      html  css  js  c++  java
  • Nutch1.2二次开发(关于中文分词)

    http://www.cnblogs.com/streamhope/archive/2011/07/28/2119345.html

    前言:作者(守望者MS)在实际搭建并开发Nutch的过程中参阅很多中文资料,但内容并不详尽且有错误,于是在此记录个人实战过程,纠正一些文章错误,以详细的过程展现一次简单的二次开发流程,为初学者降低门槛。但不能保证完全没有错误,如有发现希望大家指正。

    一、开发环境介绍(以我个人为例):

    个人开发端:windows Server 2003 + Cygwin + Eclipse3.2

    二、准备工作:

    <1>.将Nutch导入eclipse,导入过程详情请点击查看文章

    <2>.下载IKAnalyzer(http://code.google.com/p/ik-analyzer/downloads/list),本文采用的IKAnalyzer版本是3.2.8

    <3>.下载Ant(http://ant.apache.org/bindownload.cgi)

    <4>.下载Javacc(http://javacc.java.net/)

    三、具体步骤:

    注:在进行这些操作的之前请先将IKAnalyzer复制到nutch\lib文件夹下

    并在eclipse的Nutch项目中添加这个jar包。

    过程如下:

    (1).先把工程刷新一下。

    image

    (2).右键工程名->build path –> configure build path

    image

    (3).在Libraries选项卡中点击add Jars,然后在你的工程的目录下lib文件中选择刚刚添加的IKAnalyzer3.2.8.jar。

    image

    <1>.在src/java/org/apache/nutch/analysis包下找到NutchAnalysis.jj

    image

    (1).在 PARSER_BEGIN(NutchAnalysis)部分的导入声明中增加如下段

    import org.wltea.analyzer.lucene.IKTokenizer;

    (2).在 TOKEN_MGR_DECLS : {    下面增加如下段

    IKTokenizer Analyzer;

    TermAttribute termAtt = null;//代表用空格分割器分出来的一个中文词

    OffsetAttribute offAtt = null;//中文词开始结束标记

    TokenStream stream = null;

    private int cjkStartOffset = 0;//中文片段的起始位置定义

    (3). 到 TOKEN : { 部分,找到| <SIGRAM: <CJK> >,这代表按字划分,修改为| <SIGRAM: (<CJK>)+ >

    并在其后面加上


        if (stream == null) { 
                    stream  = new IKTokenizer(new StringReader(image.toString()),true); 
                    //stream = Analyzer.tokenStream("",new StringReader(image.toString())); 
                    cjkStartOffset = matchedToken.beginColumn; 
                    try { 
                        stream.reset(); 
                    } catch (IOException e) { 
                        e.printStackTrace(); 
                    } 
                    termAtt = (TermAttribute) stream.addAttribute(TermAttribute.class); 
                    offAtt = (OffsetAttribute) stream.addAttribute(OffsetAttribute.class); 
                    try { 
                        if (stream.incrementToken() == false) 
                            termAtt = null; 
                    } catch (IOException e) { 
                        // TODO Auto-generated catch block 
                        e.printStackTrace(); 
                    } 
                } 
                if (termAtt != null && !termAtt.term().equals("")) { 
                    matchedToken.image = termAtt.term(); 
                    matchedToken.beginColumn = cjkStartOffset + offAtt.startOffset(); 
                    matchedToken.endColumn = cjkStartOffset + offAtt.endOffset(); 
                    try { 
                        if (stream.incrementToken() != false) 
                            input_stream.backup(1); 
                        else 
                            termAtt = null; 
                    } catch (IOException e) { 
                        e.printStackTrace(); 
                    } 
                } 
                if (termAtt == null || termAtt.term().equals("")) { 
                    stream = null; 
                    cjkStartOffset = 0; 
                } 
    }

    (4).将NutchAnalysis.jj复制到其他目录下,进行Javacc编译.

    用javacc工具生成NutchAnalysis.jj的源代码,将生成的所有java源代码(7个文件)全部覆盖到 src/java/org/apache/nutch/analysis包下.

    javacc的使用方法:cmd进入命令行,切换到NutchAnalysis.jj所在目录(最后把它拷贝到其它目录进行编译,如D盘),D:输入命令

    javacc NutchAnalysis.jj

    就会生成7个文件了。

    (5).此时NutchAnalysis.java会报错

    在两个位置加入ParseException异常捕捉命令(详情见图)

    image

    image

    (6).修改完上面的你会发现org.apache.nutch.searcher包中的Query.java报错。

    解决方法是找到报错的地方用try{}catch(){}语句抓住异常,不要抛出,否则接下来还要改很多文件。

    <2>.修改src/java/org/apache/nutch/analysis包下的NutchDocumentAnalyzer

    在private static Analyzer ANCHOR_ANALYZER;后面加上

    private static Analyzer MY_ANALYZER;

    在ANCHOR_ANALYZER = new AnchorAnalyzer();后面加上

    MY_ANALYZER = new IKAnalyzer();

    把 tokenStream修改为:

    public TokenStream tokenStream(String fieldName, Reader reader) {

      Analyzer analyzer; 
            analyzer = MY_ANALYZER; 
            TokenStream tokenStream = analyzer.tokenStream(fieldName, reader);
            tokenStream.addAttribute(TypeAttribute.class);
            tokenStream.addAttribute(FlagsAttribute.class);
            tokenStream.addAttribute(PayloadAttribute.class);
            tokenStream.addAttribute(PositionIncrementAttribute.class);
            return tokenStream;

    }

    <3>.修改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)

    <4>.Ant

    cmd进入命令行,切换到nutch所在目录,执行ant命令,就会开始ant工作。完成后会在nutch目录下生成build目录。

    在build文件夹中会生成三个文件,nutch-1.2.job、nutch-1.2.jar、nutch-1.2.war。

    这三个文件用来替换你正式线上的Nutch目录下的文件。如果你只在本机做测试,那就用这三个文件代替根目录下的原来的三个同名文件即可。之后将nutch-1.2.war重新部署。测试成功。

    <5>.分词后出现的问题

    在重新部署后,你在搜索时会发现有时会出先空白页,有的句子、词输入进去无法查询。

    针对与这个情况,查看tomcat log发现如下提示:

    org.apache.catalina.core.StandardWrapperValve invoke
    严重: Servlet.service() for servlet jsp threw exception
    java.lang.StringIndexOutOfBoundsException: String index out of range: -3

    解决方法:

    在tomcat中部署的nutch目录下进入WEB-INF\classes

    找到nutch-site.xml  在这里添加如下代码即可。

    <property>
      <name>plugin.includes</name>
      <value>protocol-http|urlfilter-regex|parse-(text|html|js)|analysis-(zh)|index-basic|query-(basic|site|url)|summary-lucene|scoring-opic|urlnormalizer-(pass|regex|basic)</value>
    </property>

  • 相关阅读:
    公司 make makefile 工具
    单元测试
    光速是宇宙中最大的速度
    数据库与数据仓库
    看完了黑客帝国
    ArcGIS Server(详细介绍)转
    js判断文件大小
    项目经理人必须要遵循的14个成功原则(转)
    文件夹选择对话框 JS实现(转)
    导出excel乱码问题(小技巧)
  • 原文地址:https://www.cnblogs.com/cy163/p/2916419.html
Copyright © 2011-2022 走看看