Lucene 分词解读(一)

Lucene中的中文分词

Lucene中处理中文的常用方法有三种。以"咬死猎人的狗"这句话的输出结果为例:

单字方式:[咬] [死] [猎] [人] [的] [狗];
二元覆盖的方式:[咬死] [死猎] [猎人] [人的] [的狗];
分词的方式:[咬] [死] [猎人] [的] [狗]。

Lucene中负责语言处理的部分在org.apache.lucene.analysis包。其中TokenStream类用来进行基本的分词工作,Analyzer类是TokenStream的外围包装类,负责整个解析工作。有人把文本解析比喻成人体的消化过程,输入食物,分解出有用的氨基酸和葡萄糖等。Analyzer类接收的是整段文本,解析出有意义的词语。

通常不需要直接调用分词的处理类analysis,而是由Lucene内部来调用,其中:

在做索引阶段,调用addDocument(doc)时,Lucene内部使用Analyzer来处理每个需要索引的列,如图4-1所示。
[quote] IndexWriter index = new IndexWriter(indexDirectory,
new CnAnalyzer(),
//用支持分词的分析器
!incremental,
IndexWriter.
MaxFieldLength.UNLIMITED); [/quote]

在搜索阶段,调用QueryParser.parse(queryText)来解析查询串时,QueryParser会调用Analyzer来拆分查询字符串,但是对于通配符等查询不会调用Analyzer。
[quote]Analyzer analyzer = new CnAnalyzer(); //支持中文的分词
QueryParser parser = new QueryParser
(Version.LUCENE_CURRENT,"title",
analyzer); [/quote]

因为在索引和搜索阶段都调用了分词过程,索引和搜索的切分处理要尽量一致,所以分词效果改变后需要重建索引。另外,可以用个速度快的版本,用来在搜索阶段切分用户的查询词,另外用一个准确切分的慢速版本用在索引阶段的分词。

为了测试Lucene的切分效果,下面是直接调用Analysis的例子:
[quote] Analyzer analyzer = new CnAnalyzer(); //创建一个中文分析器
//取得Token流
TokenStream ts = analyzer.tokenStream("myfield",new StringReader
("待切分文本"));
while (ts.incrementToken()) {//取得下一个词
System.out.println("token: "+ts));
} [/quote]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值