Nutch1.2增加IKAnalyzer中文分词

本文介绍如何在Nutch中加入中文分词功能,通过使用IKAnalyzer改进前后台爬虫的文本处理能力,使Nutch能更准确地处理中文内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原版nutch中对中文的处理是按字划分,而不是按词划分。为适应我们的使用习惯必须加上中文分词,我加的是 IKAnalyzer。下面是我的方法,我把前台和后台爬虫用两种方法实现中文分词,后台直接替换nutch的analyzer,前台则修改NutchAnalysis.jj(注:我的前台和后台是两个项目)。

前台修改:

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

(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)用javacc工具生成NutchAnalysis.jj的源代码,将生成的所有java源代码全部覆盖到 src/java/org/apache/nutch/analysis包下.
有异常的话抛出就行.

后台爬虫修改:

修改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; //注释nutch原本分词器 //if ("anchor".equals(fieldName)) //analyzer = ANCHOR_ANALYZER; // else //analyzer = CONTENT_ANALYZER; analyzer = MY_ANALYZER; return analyzer.tokenStream(fieldName, reader); }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值