开发者学堂课程【Lucene 知识精讲与实战(上): 第三方中文分词器】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/700/detail/12343
第三方中文分词器
内容介绍:
一、第三方中文分词器
二、中文分词器 IK-analyzer
一、第三方中文分词器
1.为什么要讲解第三方分词器?
从以上 Lucene 的原生分词器来看,Lucene 原生提供的分词器都有一个特点:对英文分词效果很好但是对中文分词的效果不明显。
原因是中文的语义博大精深,同一句话,不一样的切分词、断词、断句理解出来的意思是不一样的。因此需要第三方分词器,而这些分词器绝大多数都是中国人开发。
2.第三方中文分词器简介
(1)paoding:庖丁分词器。支持中文的语义分析,是中国人团队自己研发出来的,现在这个团队已经不再提交新代码。由于 Lucene 变化很大,比如 API 等变化是很大的,版本在不断更新,现在已经更新到8.0以上的版本了,现在常用的版本是7.3.3,paoding 分词器无法和 Lucene 进行对接,也因此,paoding 分词器已经过时。
庖丁解牛最新版在 https:/code google.com/p/paoding. 中最多支持 Lucene3.0 ,且最新提交的代码在 2008-06-03,在 svn 中最新也是2010年提交,已经过时,不予考虑。
(2)mmseg4i:对中文的分词效果良好,但是相比较其他分词器,它无法扩展,有很多不足(比如公司的公司名在默认的词典中很难查到,需要手动在词典中添加)。
最新版已从 https:/code.google.com/p/mmseg4i/ 移至 https:/github.com/chenlb/mmseg4isolr ,支持 Lucene4.10 ,且在 github 中最新提交代码是2014年6月,从09年~14年一共有:18个版本,也就是一年几乎有3个大小版本,有较大的活跃度,用了 mmseg 算法。
(3)IK-analyzer:它有两个词典,一个是扩展词典,方便用户进行扩展;一个是停用词典(也可以叫做停止词典),程序员可以在这两个词典里添加词汇,比如对于扩展词典,切分词时的一些重要名词,公司名,一些股票代码都可以添加上去;对于停用词典,程序员可以把一些不重要的不想被搜索的词汇添加到停用词典中,这样在切分词时停用词典的词汇不会搜索出来。
最新版在 https:/code.google.com/p/k-analyzer . 上,支持 Lucene4.10 ,从2006年12月推出1.0版开始,IKAnalyzeri 已经推出了4个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.O版本开始,IK发展为面向ava的公用分词组件,独立于 Lucenel 项目,同时提供了对 Luc6的默认优化实现。在2012版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 从单纯的词典分词向模拟语义分词衍化。但是也就是2012年12月后没有在更新。
(4)ansj_seg:最新版本在 https:/github.com/NLPchina/ansj seg tagst 仅有1.1版本,从2012年到2014年更新了大小6次,但是作者本人在2014年10月10日说明:“可能我以后没有精力来维护 ansj_seg 了”,现在由 "nip_china” 管理。2014年11月有更新。并未说明是否支持 Lucene ,是一个由CRF(条件随机场)算法所做的分词算法。
(5)imdict-chinese-analyzer:最新版在
htps:/code,google.com/p/imdict-chinese-analyzer/ ,最新更新也在2009年5月,下载源码,不支持 Lucene4.10。是利用 HMM (隐马尔科夫链)算法。
(6)Jcseg:最新版本在 git.oschina.net/lionsoul/jcseg ,支持 Lucene4.10 ,作者有较高的活跃度。利用 mmseg 算法。
每种分词器使用的分词算法不一样,而且其中分词效果最好,扩展最容易的是 IK-analyzer 分词器,下面讲解的也是 IK 分词器。
二、中文分词器 IK-analyzer
1.使用中文分词器 IK-analyzer
下面讲解 IK-analyzer 的使用
(1)首先在项目中添加它的依赖,即把以下代码复制粘贴过去:
<dependency>
<groupId>org.wltea.ik-analyzer</groupId>
<artifactId>ik-analyzer</artifactId>
<version>8.1.0</version>
</dependency>
如图:
在这里,在创建项目 pom.xml 时已经添加。
(2)使用 IK-analyzer
IK-analyzer 有两个词典:
①扩展词典:里面放专有名词,或者自己造的词汇(认为需要强制将某一些字分成一个词)
凡是出现在扩展词典的词,就会被强制分成一个词
②停用词典:凡是出现在停用词典中的词,都会被过滤
(3)打开资料,如图:
在 Lucene 资料中的资源中有工具 jar 包。jar 包里面有中文分词,在里面有中文分词器。
如图:
在配置文件中从上到下是:扩展词典、核心配置文件、停用词典。
(4)如图:
把它们全部复制然后粘贴到项目中的 resource 里。
(5)粘贴后,IK-analyzer.cfg.xml 是它的配置文件,它引入了 ext.dic 和 stopword.dic 文件也就是扩展词典和停用词典
(6)把扩展词典和停用词典分别打开,如图:
停用词典中记录了:a、an、and 等英文词汇和人民、啊、哎等中文词汇,凡是出现在停用词典 中的词汇,在切分词时候都会被过滤,不会被记录在索引库中。需要注意的是,每一个字或者词都占一行并且前后不能包含空格。
扩展词典里面放的是一些专有名词或者认为是一个词的词汇,如图在切分词时候遇华为就会把华为分成一个词,手机也分成一个词。
比如说一个公司名是传智博客,在切分词时候就会分成:传、智、博客。但是把这个词放在扩展词典中,就是传智博客一个词。再比如说,对于黑马程序员切分词,黑马是一个词,程序员是一个词,但是放在扩展词典就是黑马程序员一个词。
这样的方式为扩展提供了极大的便利。
2.测试
请看以下代码:
/**
*使用第三方分词器(IK 分词)
*特点:支持中文语义分析,提供停用词典,提供扩展词典供程序员扩展使用
*@throws Exception
*/
@Test
public void TestwhitespaceAnalyzer throws Exception{
//1.创建分词器,分析文档,对文档进行分词
Analyzer analyzer new WhitespaceAnalyzer ();
//2.创建 Directory 对象,声明索引库的位置
Directory directory = FSDirectory.open(Paths.get("E:\\dir"));
//3、创建 IndexwriteConfig 对象,写入索引需要的配置
IndexwriterConfig config = new IndexwriterConfig(analyzer);
//4.创建 Indexwriter 写入对象
Indexwriter indexwriter = new Indexwriter(directory,config);
/5.写入到索引库,通过 Indexwriter 添加文档对象 document
Document doc = new Document
doc.add(new TextField("name","vivo X23 8GB+128GB 幻夜蓝,水滴屏全面屏,游戏手机,移动联通 电信全网通4G手机",Field.Store.YEs));
indexwriter.addDocument (doc);
//6.释放资源
indexwriter.close();
}
把以上测试代码复制粘贴到测试类中,如图:
先创建分词器,这个分词器叫做 IK-analyzer,后面指定索引库位置,创建数据流初始化对象,创建流。这里的词汇是:vivo x23 8GB+128GB 幻夜蓝等。
(2)运行
运行代码,查看效果。
如图:
运行代码,查看效果。可以看到,打印出来的信息说明扩展词典和停用词典可以加载,
(3)运行成功后,打开 look 小工具
(4)重新打开索引库,看切分词后的效果。
如图:
可以看到,分词效果良好,如图可知:通电是一个词,蓝是一个词,移动、电信等也是一个词。这里认为应该过滤的词放在了停用词典中,也可以把认为应该分成一个字一个词的词汇强制分在扩展词典中。
以上就是第三方分词器的使用。对于扩展中文词库等,可以自行了解。