好贷网好贷款

利用Nutch和IKanalyzer构造中文分…

发布时间:2016-12-3 12:42:07 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"利用Nutch和IKanalyzer构造中文分…",主要涉及到利用Nutch和IKanalyzer构造中文分…方面的内容,对于利用Nutch和IKanalyzer构造中文分…感兴趣的同学可以参考一下。

详见http://wenku.baidu.com/room?fr=view  1. 配置运行环境: 由于本实验采用的工具大多运行在Linux下,选择使用Ubuntu11.10作为本次实验的运行环境。 具体运行环境为:Windowns7(32位) Oracle VM VirtualBox 4.1.10 Ubuntu 11.10(32位)  JDK 1.7.0_03     2. 利用网页爬虫工具(Nutch)采集的行业相关网页: n        安装Nutch0.9.tar.jz n        在urls文件中配置抓取起始网站为www.aqsiq.gov.cn n        配置crawl-urlfilter.txt,过滤器设置为: n        +^http://([a-z0-9]*\.)*aqsiq.gov.cn/ n        在nutch-0.9目录下执行bin/nutch crawl urls -dir crawl -depth 3 -topN 200开始抓取网页 n        抓取完成   nutch-0.9目录下出现了存放抓取结果的crawl文件夹   3. 测试Nutch自带的搜索引擎。 n        配置nutch的搜索页面,将nutch0.9-war拷贝至tomcat/webapps中,配置nutch-site.xml,启动tomcat服务,尝试链接搜索页面http://localhost:8080/nutch-0.9/ 页面报错 n        经检查,多个jsp文件中存在缺少转义字符导致网页报错,修改如下: 将search.jsp中151行: "/> 改为: "/> 同样的,将cached.jsp中第78行改为: "/>     经过上述更改搜索页和网页快照可正常使用。 在explain.jsp和anchors.jsp中做相应更改可消除网页报错,但实测这两个页面只能显示空白页,原因未知。   n        修改tomcat\conf下的server.xml解决中文搜索乱码问题,同样的,对于网页快照乱码问题,将cached.jsp第63行改为: content = new String(bean.getContent(details),"GBK");     即可正确显示中文,但如抓取的网页为其他编码,应将“GBK”修改为相应编码,此问题是由于第52行 String encoding = (String) metaData.get("CharEncodingForConversion"); 无法正确获得网页编码造成。   n        从上面的搜索结果中可以看到,Nutch的默认分词器是基于单字的,且对停用词如“的”字未进行处理。使用Luke查看索引文件也证实了这种情况。                       4. 在Nutch自带的搜索引擎基础上进行修改,实现分词功能. (尝试使用Nutch0.9配合IKAnalyzer 3.1.6GA,编译成功但运行报错,无法生成index,推测原因为Nutch版本过旧,不支持某些方法。故更换程序版本,使用Nutch1.2配合IKAnalyzer3.2.8,同时Tomcat换用6.0.35版本,以下为更改版本后的实验过程。) n         本次试验选择IKAnalyzer作为中文分词器,并将其整合到Nutch1.2中,实现中文分词搜索。使用IKAnalyzer3.2.8版本。 n        修改Nutch1.2\src\java\org\apache\nutch\analysis\NutchAnalysis.jj 将第130行| >修改为| )+ > 并在其后面加上 { if (stream == null) { stream  = new IKTokenizer(new StringReader (image.toString()),true);  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) {     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;             } } 在 PARSER_BEGIN(NutchAnalysis)部分的导入声明中增加: import org.wltea.analyzer.lucene.IKTokenizer; 在 TOKEN_MGR_DECLS : {下面增加: IKTokenizer Analyzer; TermAttribute termAtt = null;//代表用空格分割器分出的一个中文词 OffsetAttribute offAtt = null;//中文词开始结束标记 TokenStream stream = null; private int cjkStartOffset = 0;//中文片段的起始位置定义 运行javacc NutchAnalysis.jj将得到的7个新文件替换analysis目录下原有文件 n        将IKAnalyzer3.2.8.jar复制到Nutch\lib中。 n        修改src\java\org\apache\nutch\analysis目录下 NutchDocumentAnalyzer.java文件 添加:import org.wltea.analyzer.lucene.IKAnalyzer; 将 Import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute; 改为import org.apache.lucene.analysis.tokenattributes.*;(如果不改编译时会报错“找不到符号”,原因是新定义的几种Attribute未添加引用,此处将所有Attribute引用即可解决问题。在 NutchDocumentTokenizer.java中需要进行同样的操作。) 在private static Analyzer ANCHOR_ANALYZER;后面加上 private static Analyzer MY_ANALYZER; 在ANCHOR_ANALYZER = new AnchorAnalyzer();后面加上 MY_ANALYZER = new IKAnalyzer(); 重写TokenStream 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; } n         修改Nutch目录下build.xml文件,在196行加入如下代码:   修改为   n         在Nutch目录下执行ant命令重新编译Nutch n         编译出现错误 NutchAnalysis.java:59: 错误: 未报告的异常错误ParseException; 必须对其进行捕获或声明以便抛出。 将NutchAnalysis.java第48行和第54行 throws IOException改为: throws IOException,ParseException n         重新在Nutch目录下执行ant命令重新编译Nutch,编译通过。在build目录下得到nutch-1.2.job, nutch-1.2.jar 和nutch-1.2.war。 n         将上述三个文件替换Nutch-1.2文件夹以及 Tomcat7\webapps\Nutch-1.2\WEB-INF\lib中的对应文件。 n         将老师提供的dic.txt转为utf-8编码的无BOM文件,并重命名为mydict.dic,使用IKAnalyzer自带的ext_stopword.dic作为停用词词典。在IKAnalyzer.cfg.xml中添加相应的字典文件路径。将上述三个文件放入Nutch的根目录下。 n         重新执行实验第2步,抓取网页并生成索引。 n         使用Luke查看索引文件 n         从上面的结果中可以看到,目前索引已经采用了分词的形式,而且经搜索“的”在索引中不存在。可见利用IKAnalyze附带的去除停用词功能完成了停用词去除工作。达到了实验要求。另:在编译NutchAnalysis.jj文件时发现其中有: private static final String[] STOP_WORDS = {     "a", "and", "are", "as", "at", "be", "but", "by", …  }; 推测在其中也可以加入停用词,但未测试与中文的兼容性。 5. 测试lucene的布尔检索功能 n         在检索页面搜索“禽类”共有3个结果,其中仅第一个结果中有“澳大利亚”。   n         在检索页面搜索“禽类 +澳大利亚”   只有第一个结果命中,验证了AND运算。 n         在检索页面搜索“禽类 -澳大利亚”   后两个结果命中,验证了NOT运算。 n         在检索页面搜索“禽类  澳大利亚“   只有第一个结果命中。原本认为Lucene以空格作为OR运算,但实际情况空格相当于AND运算。 n         在检索中发现,查询某些词会导致结果页空白,经分析和查询资料,确定了问题所在。例如查询“特种设备”词项会出现上述问题,是因为“特种设备”、“特种”和“设备”三个词项均在索引中存在,查询时会导致String index out of range错误。解决方法是在WEB-INF\classes\nutch-site.xml中加入如下代码:     plugin.includes protocol-http|urlfilter-regex|parse-(text|html|js)|analysis-(zh)|index-basic|query-(basic|site|url)|summary-lucene|scoring-opic|urlnormalizer-(pass|regex|basic)   。

上一篇:读<Android大话设计模式>
下一篇:[Java]读取文件方法大全

相关文章

相关评论