登山之道
C++博客
::
首页
::
新随笔
:: :: ::
管理
Lucene入门级笔记五 -- 分词器,使用中文分词器,扩展词库,停用词
Posted on 2011-04-17 19:25
Kevin_Zhang
阅读(3464)
评论(1)
编辑
收藏
引用
所属分类:
搜索引擎
1
. 常见的中文分词器有:极易分词的(MMAnalyzer) 、
"
庖丁分词
"
分词器(PaodingAnalzyer)、IKAnalyzer 等等。其中 MMAnalyzer 和 PaodingAnalzyer 不支持 lucene3.0及以后版本。
使用方式都类似,在构建分词器时
Analyzer analyzer
=
new
[My]Analyzer();
2
. 这里只示例 IKAnalyzer,目前只有它支持Lucene3.
0
以后的版本。
首先需要导入 IKAnalyzer3.
2
.0Stable.jar 包
3
. 示例代码
view plaincopy to clipboardprint
?
public
class
AnalyzerTest
{
@Test
public
void
test()
throws
Exception
{
String text
=
"
An IndexWriter creates and maintains an index.
"
;
/**/
/*
标准分词器:单子分词
*/
Analyzer analyzer
=
new
StandardAnalyzer(Version.LUCENE_30);
testAnalyzer(analyzer, text);
String text2
=
"
测试中文环境下的信息检索
"
;
testAnalyzer(
new
IKAnalyzer(), text2);
//
使用IKAnalyzer,词库分词
}
/** */
/**
* 使用指定的分词器对指定的文本进行分词,并打印结果
*
*
@param
analyzer
*
@param
text
*
@throws
Exception
*/
private
void
testAnalyzer(Analyzer analyzer, String text)
throws
Exception
{
System.out.println(
"
当前使用的分词器:
"
+
analyzer.getClass());
TokenStream tokenStream
=
analyzer.tokenStream(
"
content
"
,
new
StringReader(text));
tokenStream.addAttribute(TermAttribute.
class
);
while
(tokenStream.incrementToken())
{
TermAttribute termAttribute
=
tokenStream.getAttribute(TermAttribute.
class
);
System.out.println(termAttribute.term());
}
}
}
public
class
AnalyzerTest
{
@Test
public
void
test()
throws
Exception
{
String text
=
"
An IndexWriter creates and maintains an index.
"
;
/**/
/*
标准分词器:单子分词
*/
Analyzer analyzer
=
new
StandardAnalyzer(Version.LUCENE_30);
testAnalyzer(analyzer, text);
String text2
=
"
测试中文环境下的信息检索
"
;
testAnalyzer(
new
IKAnalyzer(), text2);
//
使用IKAnalyzer,词库分词
}
/** */
/**
* 使用指定的分词器对指定的文本进行分词,并打印结果
*
*
@param
analyzer
*
@param
text
*
@throws
Exception
*/
private
void
testAnalyzer(Analyzer analyzer, String text)
throws
Exception
{
System.out.println(
"
当前使用的分词器:
"
+
analyzer.getClass());
TokenStream tokenStream
=
analyzer.tokenStream(
"
content
"
,
new
StringReader(text));
tokenStream.addAttribute(TermAttribute.
class
);
while
(tokenStream.incrementToken())
{
TermAttribute termAttribute
=
tokenStream.getAttribute(TermAttribute.
class
);
System.out.println(termAttribute.term());
}
}
}
3
. 如何扩展词库:很多情况下,我们可能需要定制自己的词库,例如 XXX 公司,我们希望这能被分词器识别,并拆分成一个词。
IKAnalyzer 可以很方便的实现我们的这种需求。
新建 IKAnalyzer.cfg.xml
view plaincopy to clipboardprint
?
<?
xml version
=
"
1.0
"
encoding
=
"
UTF-8
"
?>
<!
DOCTYPE properties SYSTEM
"
http://java.sun.com/dtd/properties.dtd
"
>
<
properties
>
<!--
1
,文件要是 UTF
-
8
编码。
2
,一行写一个词
-->
<!--
用户可以在这里配置自己的扩展字典
-->
<
entry key
=
"
ext_dict
"
>/
mydict.dic
</
entry
>
</
properties
>
<?
xml version
=
"
1.0
"
encoding
=
"
UTF-8
"
?>
<!
DOCTYPE properties SYSTEM
"
http://java.sun.com/dtd/properties.dtd
"
>
<
properties
>
<!--
1
,文件要是 UTF
-
8
编码。
2
,一行写一个词
-->
<!--
用户可以在这里配置自己的扩展字典
-->
<
entry key
=
"
ext_dict
"
>/
mydict.dic
</
entry
>
</
properties
>
解析:
<
entry key
=
"
ext_dict
"
>/
mydict.dic
</
entry
>
扩展了一个自己的词典,名字叫 mydict.dic
因此我们要建一个文本文件,名为:mydict.dic (此处使用的 .dic 并非必须)
在这个文本文件里写入:
北京XXXX科技有限公司
这样就添加了一个词汇。
如果要添加多个,则新起一行:
词汇一
词汇二
词汇三
需要注意的是,这个文件一定要使用 UTF
-
8编码
4
. 停用词:
有些词在文本中出现的频率非常高,但是对文本所携带的信息基本不产生影响,例如英文的
"
a、an、the、of
"
,或中文的
"
的、了、着
"
,以及各种标点符号等,这样的词称为停用词(stop word)。
文本经过分词之后,停用词通常被过滤掉,不会被进行索引。在检索的时候,用户的查询中如果含有停用词,检索系统也会将其过滤掉(因为用户输入的查询字符串也要进行分词处理)。
排除停用词可以加快建立索引的速度,减小索引库文件的大小。
IKAnalyzer 中自定义停用词也非常方便,和配置
"
扩展词库
"
操作类型,只需要在 IKAnalyzer.cfg.xml 加入如下配置:
<
entry key
=
"
ext_stopwords
"
>/
ext_stopword.dic
</
entry
>
同样这个配置也指向了一个文本文件
/
ext_stopword.dic (后缀名任意),格式如下:
也
了
仍
从
本文来自CSDN博客,转载请标明出处:http:
//
blog.csdn.net/wenlin56/archive/2010/12/13/6074124.aspx
Feedback
#
re: Lucene入门级笔记五 -- 分词器,使用中文分词器,扩展词库,停用词
回复
更多评论
2016-07-05 20:08 by
回家看回家看
54544554
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
Lucene入门级笔记五 -- 分词器,使用中文分词器,扩展词库,停用词
网页解析开源项目
一个 Java 搜索引擎的实现,第 2 部分: 网页预处理
一个 Java 搜索引擎的实现,第 1 部分: 网络爬虫
java 下载网页
Apache+php+mysql在XP下搭配详解
MonoDevelop
heritrix1.14.4
tomcatPlugin下载地址
Heritrix-1.14.1怎么配置?
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © Kevin_Zhang
日历
<
2011年4月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
常用链接
我的随笔
我的评论
我参与的随笔
随笔分类
数据库(1)
ACM基础知识(9)
ARM(2)
C/C++(12)
DOS(1)
Google Map API
Heritrix(1)
IT News(22)
JAVA(3)
Jsp
Linux(9)
Lucene(1)
PHP(6)
Python
Tree
Trie树(1)
博弈
动态规划(1)
回溯
汇编
计算几何(1)
模拟(4)
排序(2)
嵌入式
数据结构(2)
数论(2)
数学(3)
搜索(2)
搜索引擎(12)
随机数
贪心(1)
图论(1)
图形学(1)
万花筒(22)
网络流
硬件(1)
随笔档案
2011年6月 (5)
2011年5月 (22)
2011年4月 (24)
2010年12月 (1)
2010年11月 (13)
2010年10月 (7)
2010年9月 (14)
2010年8月 (52)
2010年7月 (9)
文章分类
ACM题目分类(13)
C
C#
C++
DP动态规划
JAVA
LUNIX
Python
博弈
计算几何
模拟
数论(1)
搜索(1)
贪心
图论
文章档案
2010年8月 (4)
2010年7月 (22)
程序的灵魂--算法
沙场秋点兵,壮士凯歌还
北大POJ
他山之石,可以攻玉
围观强人
搜索
最新评论
1. re: Lucene入门级笔记五 -- 分词器,使用中文分词器,扩展词库,停用词
54544554
--回家看回家看
2. re: 水
评论内容较长,点击标题查看
--Jason Huang
3. re: 10项技能让前端开发者价值百万!
评论内容较长,点击标题查看
--BURKERosie25
4. re: (转载)ACM经历总结[未登录]
谢谢
--xingyezhi
5. re: 世界头号营销大师们的营销素质
大道至简,殊途同归,值得借鉴。
--Kevin_Zhang
阅读排行榜
1. Java动态数组的用法详解(12179)
2. Lucene入门级笔记五 -- 分词器,使用中文分词器,扩展词库,停用词(3464)
3. 用scanf输入字符串空格不识别??(2051)
4. php java交互 php/java bridge (1918)
5. Java split分割字符串的用法详解(1777)