给Lucene增加中文分词2(猎兔分词,转贴)

来源:百度文库 编辑:神马文学网 时间:2024/04/29 23:46:24
给Lucene增加中文分词2(猎兔分词,转贴)
以前自己曾经写过一个关于如何向Lucene中加入性能很好的中文分词,我使用的是中科院开发的ICTCLAS接口.不过马上要转载的这篇文章,感觉使用的也是中科院的ICTCLAS接口,所不同的是,我使用的是free版。猎兔分词所使用的应该是花钱买的商用版。
原文来自如下:http://www.lietu.com/doc/LuceneSeg.htm
向Lucene增加中文分词功能
一、分词功能介绍
分词模块对于搜索的重要性不言而喻。例如,没有分词时,搜索“和服”会出现“产品和服务”,搜索“海尔”会出现“海尔德”,搜索“华为”会出现“清华为何”。所以有必要给文本增加词的边界信息以提高检索精确度。
猎兔全球首家推出支持Lucene的准确可用的中文分词模块。
二、执行方法
可以在命令行执行分词测试:
>java "-Ddic.dir=D:/lg/work/SSeg/Dic" -classpath D:\JAVA\lib\lucene-1.4.jar;D:\JAVA\lib\seg.jar test.seg.result.CnTokenizer
其中系统参数dic.dir指定数据文件路径,如:
"-Ddic.dir=D:/lg/work/SSeg/Dic"
或者编写一个用于测试的Jsp页面。
三、调用接口
seg.result.CnTokenizer,该类继承org.apache.lucene.analysis.Tokenizer。
一个简单的使用例子是:
import java.io.Reader;
import java.util.Set;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.LowerCaseFilter;
import org.apache.lucene.analysis.StopFilter;
import org.apache.lucene.analysis.TokenStream;
/**
* @author luogang
*
*/
public class CnAnalyzer extends Analyzer {
//~ Static fields/initializers ---------------------------------------------
/**
* An array containing some Chinese words that are not usually
* useful for searching.
*/
private static String[] stopWords = {
"www","的","和","与","时","在",
"是","被","所","那","这","有",
"将","会","为","对","了","过",
"去"};
//~ Instance fields --------------------------------------------------------
/** stop word list */
private Set stopSet;
//~ Constructors -----------------------------------------------------------
/**
* Builds an analyzer which removes words in STOP_WORDS.
*/
public CnAnalyzer() {
stopSet = StopFilter.makeStopSet(stopWords);
}
/**
* Builds an analyzer which removes words in the provided array.
*
* @param stopWords stop word array
*/
public CnAnalyzer(String[] stopWords) {
stopSet = StopFilter.makeStopSet(stopWords);
}
//~ Methods ----------------------------------------------------------------
/**
* get token stream from input
*
* @param fieldName lucene field name
* @param reader input reader
*
* @return TokenStream
*/
public final TokenStream tokenStream(String fieldName, Reader reader) {
//注意:这里的CnTokenizer是猎兔自己开发的,非free的
TokenStream result = new CnTokenizer(reader);
return new StopFilter(result, stopSet);
}
}
四、输出结果介绍
输出结果中的词性标注代码说明如下:
代码
名称
帮助记忆的诠释
Ag
形语素
形容词性语素。形容词代码为a,语素代码g前面置以A。
a
形容词
取英语形容词adjective的第1个字母。
ad
副形词
直接作状语的形容词。形容词代码a和副词代码d并在一起。
an
名形词
具有名词功能的形容词。形容词代码a和名词代码n并在一起。
b
区别词
取汉字“别”的声母。
c
连词
取英语连词conjunction的第1个字母。
Dg
副语素
副词性语素。副词代码为d,语素代码g前面置以D。
d
副词
取adverb的第2个字母,因其第1个字母已用于形容词。
e
叹词
取英语叹词exclamation的第1个字母。
f
方位词
取汉字“方”
g
语素
绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。
h
前接成分
取英语head的第1个字母。
i
成语
取英语成语idiom的第1个字母。
j
简称略语
取汉字“简”的声母。
k
后接成分
l
习用语
习用语尚未成为成语,有点“临时性”,取“临”的声母。
m
数词
取英语numeral的第3个字母,n,u已有他用。
Ng
名语素
名词性语素。名词代码为n,语素代码g前面置以N。
n
名词
取英语名词noun的第1个字母。
nr
人名
名词代码n和“人(ren)”的声母并在一起。
ns
地名
名词代码n和处所词代码s并在一起。
nt
机构团体
“团”的声母为t,名词代码n和t并在一起。
nz
其他专名
“专”的声母的第1个字母为z,名词代码n和z并在一起。
o
拟声词
取英语拟声词onomatopoeia的第1个字母。
p
介词
取英语介词prepositional的第1个字母。
q
量词
取英语quantity的第1个字母。
r
代词
取英语代词pronoun的第2个字母,因p已用于介词。
s
处所词
取英语space的第1个字母。
Tg
时语素
时间词性语素。时间词代码为t,在语素的代码g前面置以T。
t
时间词
取英语time的第1个字母。
u
助词
取英语助词auxiliary
Vg
动语素
动词性语素。动词代码为v。在语素的代码g前面置以V。
v
动词
取英语动词verb的第一个字母。
vd
副动词
直接作状语的动词。动词和副词的代码并在一起。
vn
名动词
指具有名词功能的动词。动词和名词的代码并在一起。
w
标点符号
x
非语素字
非语素字只是一个符号,字母x通常用于代表未知数、符号。
y
语气词
取汉字“语”的声母。
z
状态词
取汉字“状”的声母的前一个字母。
五、分词效果
搜索“美的”,我们的结果是前22条全部是与“美的”品牌相关的新闻,百度的结果是前4条是相关的,中搜的结果是前10条中有4条是相关的。
参考:
1.中国科学院计算技术研究所
2.北京大学计算语言研究所