中文分词软件包的使用
中文分词 (Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比之英文要复杂的多、困难的多。下面简单介绍几个中文分词工具。中文版本主要介绍ICTCLAS系列,英文版的包括LingPipe,StarnfordWord Segmenter,以及OpenNlp软件包。
1. ICTCLAS
1.1. ICTCLAS 介绍
- ICTCLAS (Institute of Computing Technology, Chinese Lexical Analysis System)分词系统是由中科院计算所的张华平、刘群所等开发的一套获得广泛好评的分词系统,主要功能包括中文分词;词性标注;命名实体识别;新词识别;同时支持用户词典。
- ICTCLAS全部采用C/C++编写,支持Linux、FreeBSD及Windows系列操作系统,支持C/C++/C#/Delphi/Java等主流的开发语言。
- ICTCLAS采用了层叠隐马尔可夫模型(Hierarchical Hidden Markov Model),将汉语词法分析的所有环节都统一到了一个完整的理论框架中,获得最好的总体效果,相关理论研究发表在顶级国际会议和杂志上,从理论上和实践上都证实了该模型的先进性。
1.2. ICTCLAC分词原理简介
- 该系统基于隐马尔科夫模型提出了层叠隐马尔科夫模型(CHMM),CHMM实际上是若干个层次的简单HMM组合,各层隐马尔科夫模型之间以以下几种方式相互关联:各层HMM之间共享一个切分词图作为公共数据结构(如图1),每一层隐马尔科夫模型都采用N-Best策略,将产生的最好的若干个结果送到此图中供更高层次的模型使用。
- 该CHMM由低到高依次为:原子切分,简单未登录词识别,嵌套未登录词识别,这几层中共享二元切分词图,并在每层对该数据结构进行修改,使得传递给基于类地隐马分词的参数越来越准确,最后一层为隐马词性标注。
1.3. ICTCLAC实现版本
1.3.1 原始版本
- ICTCLAS Free版本于 2002 年 8 月 16 日发布于中文自然语言处理开放平台(http://www.nlp.org.cn/)并于 2002 年 9 月发布相应的论文及测试报告。测试报告主要包括国家 973 英汉机器翻译第二阶段的评测报告及在 1998 年 1 月标注人民语料库上的自评结果。
1.3.2 中科天玑商业版 ICTCLAS汉语分词系统
- 应用户要求,作者在原来基础上做了改进,推出 ICTCLAS 2011。内核版本5.0,改版后分词速度更快;稳定性更高。 ICTCLAS 2011c/c++/c#版、JNI版均支持多线程调用。以往版本需要进行编码转换,统一转换成GB2312之后才能做进一步处理。系统当前版本支持GB2312、GBK、UTF-8、BIG5等编码。以上编码无需做任何转换,即可进行后续处理。用户可指定需要处理数据的具体编码(有利于提高速度)也可让系统自动识别编码。本版新增了对繁体中文即BIG5的识别处理。 本版对Windows7支持良好。支持大用户词典。
- 该版本的源码还是C++,不过有java ,C#等的接口
- 下载地址:http://www.ictclas.org/ictclas_download.aspx
测试使用
C++版本没调试通过,代码也没看懂,各种心塞,继续努力
1.3.3 ICTCLAS4J版本
ICTCLAS4J介绍
ICTCLAS4J中文分词系统是sinboy在FreeICTCLAS的基础上完成的一个java开源分词项目,简化了原分词程序的复杂度,旨在为广大的中文分词爱好者一个更好的学习机会。不同于以前的C++版提供的JNI调用,ICTCLAS4J是纯Java版本的ICTCLAS。但是也由于开源有很多的不足。
ICTCLAS4J测试使用
- 下载ICTCLAS4J: http://ictclas.org/Down_OpenSrc.asp
- 将下载下的ICTCLAS4J解压缩得到bin,data,src, segtag.bat 4个文件
- 在Eclipse上建立一个project,命名为ictclas4jTest
- 把Data文件夹整个拷贝到Eclipse项目的文件夹下,而bin目录下的org文件夹整个拷贝到Eclipse项目的bin目录下,把src目录下的org文件夹整个拷贝到Eclipse项目的src目录下
- 导入commons-lang.jar http://download.csdn.net/detail/qianwen5201314/7716237
- 现在就可以在你的项目里新建一个类来试试。这里新建了一个test类,代码如下:
- 分词结果(可以改变源码使其出现词性标注)
BUG与不足
- BUG1: 在使用分词时候,人名会出现漏字问题(如上测试) 。
PosTagger.java文件中人名识别部分personRecognize方法里面出错了,注释掉if (sn.getPos() <4 &&unknownDict.getFreq(sn.getWord(),sn.getPos()) < Utility.LITTLE_FREQUENCY),参见 http://tinypig.iteye.com/blog/250926
- BUG2: AdjustSeg.java里面的 finaAdjust()函数里要注意将while语句的判断条件while (true)改为while (true && i + 1 < optSegPath.size()) ,否则也可能发生越界错误
- BUG3: 当汉字首字节为负如“癵”*(实际上可能是乱码),转换找词表的时候会发生越界错误,这个bug在开源的ictclas里面也存在,但是c++不检查越界,因此不报错。因此在Dictionary.java中的findInOriginalTable方法中加入判断if(index < 0 || index >=Utility.CC_NUM) return -1;
- 不足:速度比较慢。
代码里面用到了很多java的String的操作,这个其实比较废时间,还有词典的组织,也是用的String的数组,再二分查找,用hash应该会快一点。
ICTCLAS因为有一个卖钱的商业版,所以这个开源的版本毛病还是比较多的。比如有一些词库中不存在的词,就会扔空指针的错误,比如“深圳”,“大阪”这样的词。 还有对一些特殊的字符串模式,比如单引号隔几个字符再加一个什么什么的,就会报错还有一些特殊的字符,也会报错。
1.3.4 imdict-Chinese-analyzer版本
imdict-chinese-analyzer简单介绍
imdict-chinese-analyzer是 imdict智能词典的智能中文分词模块,作者高小平,算法基于隐马尔科夫模型(Hidden Markov Model, HMM),是中国科学院计算技术研究所的ictclas中文分词程序的重新实现(基于Java),可以直接为lucene搜索引擎提供中文分词支持。
imdict-chinese-analyzer测试使用
- 下载链接http://ictclas.org/Down_OpenSrc.asp
- 下到的压缩包解压后就是一个java工程,eclipse直接导入即可,但由于其开发的环境是UTF8所以要将eclipse的工作空间的编码也设置为utf8,test包里面的AnalyzerTest就是其用法,看了以后就可以直接用了
imdict-chinese-analyzer优缺点
- 优点
开源,分词速度快,效率高;
- 缺点
不支持自己添加词库,不支持词性标注(开发人员自己说是为了提高速度),data文件夹仅自带了两个字典coredict核心字典、bigramdict词关系字典,这是两个最重要的词典,没有地名和人名的词典,所以要识别人名地名比较麻烦,据说要用层次hmm,先粗分在细分。
1.3.5 ANSJ 版本
ANSJ介绍
- ANSJ 是一个开源的Java 中文分词工具,基于中科院的 ICTCLAS 中文分词算法,采用隐马尔科夫模型(HiddenMarkov Model, HMM)。孙健(ICTCLAS作者张华平的学生)重写了一个Java版本,并且全部开源,使得 ANSJ可用于人名识别、地名识别、组织机构名识别、多级词性标注、关键词提取、指纹提取等领域,支持行业词典、用户自定义词典。分词效果和速度都超过开源版的ICTCLAS.
- ANSJ1.4在原来ANSJ的基础上做了进一步的改进(类似Stanford word segment)增加了google语义模型+条件随机场模型的中文分词的java实现.提供了给予CRF++ wapiti等条件随即场工具的调用接口.用户可以及自定义训练model。目前实现了中文分词,中文姓名识别 , 用户自定义词典,可以应用到自然语言处理等方面。
- 源码下载:https://github.com/ansjsun/ansj_seg/
- 文档说明:http://ansjsun.github.io/ansj_seg/
- 作者微博:http://weibo.com/ansjsun
ANSJ测试使用
按照作者的方式使用,但是没有成功,有待进一步查找原因
1.3.6 Rwordseg版本
Rwordseg简单介绍
Rwordseg 是一个R环境下的中文分词工具,使用rJava调用Java分词工具Ansj。当前版本的Rwordseg包完全引用了 Ansj 包,只是简单提供了R的接口,并根据R中处理文本的习惯进行了调整,以后可能还会纳入其他的分词工具或者自己开发一些新的功能。
Rwordseg说明
使用说明链接 http://jliblog.com/app/rwordseg
安装与使用
详细的使用可以参照 R包的中文文档 Rwordseg_Vignette_CN.pdf
#用于下载安装rJava 和 Rwordseg,如果安装了就注释掉
install.packages("rJava")
install.packages("Rwordseg", repos="http://R-Forge.R-project.org", type="source")#导入rJava 和Rwordseg
library(rJava)
library(Rwordseg)
#测试rJava 和Rwordseg是否安装好
teststring1 <- "我爱R语言,我爱文本挖掘"
segmentCN(teststring1)
#观察分词1000次花的时间
system.time(for(i in 1:1000) segmentCN(teststring1))
#segmentCN的详细解释
?segmentCN#若输入参数为字符向量,则返回列表
segmentCN("结合成分子时")
segmentCN(c("说的的确在理","一次性交多少钱"))
#默认nosymbol为TURE 不输出标点,只能有汉字,英文,和数字
segmentCN("我喜欢读《圣经》,你呢?")
segmentCN("我喜欢读《圣经》,你呢?",nosymbol=FALSE)
#nature设置 是否输出词性 不是很智能 会出现错误
segmentCN("花了一元钱买了一朵美丽的花",nature=TRUE)#参数isNameRecognition 可用来人的名字识别,
getOption("isNameRecognition") #默认是不进行人名识别,输出false
segmentCN("梅超风不是是桃花岛岛主")
segment.options(isNameRecognition = TRUE)
getOption("isNameRecognition")
segmentCN("梅超风是桃花岛岛主")#对金庸的侠客行进行分词,分词的结果会输出到“侠客行.segment.txt”下
segmentCN("E://Rcode//source//侠客行.txt")
#“侠客行.txt” 364251个字, 大约用时间10S,还是很快的
system.time(segmentCN("E://Rcode//source//侠客行.txt"))#查看词典
listDict()
segmentCN("湖北大鼓真是不错呀")
#导入~.dic词典,可以直接复制然后改名为.dic
installDict("E://Rcode//source//default.dic","default")
segmentCN("湖北大鼓真是不错呀")
#uninstallDict() 删除安装的词典
uninstallDict()
#listDict() 查看剩余的词典
listDict()##用搜狗词库的时候 一定要在官网上下载 ~.scel 文件,
#不能直接将 下载的 ~.txt改为~.scel
segmentCN("床前明月光,凝视地上霜")
installDict("E://Rcode//source//李白诗集【官方推荐】.scel","libai",dicttype = "scel")
segmentCN("床前明月光,凝视地上霜")segmentCN("天罡北斗阵和六脉神剑哪个更厉害")
listDict()
installDict("E://Rcode//source//金庸武功招式.scel","jinyong",dicttype = "scel")
segmentCN("天罡北斗阵和六脉神剑哪个更厉害")#自定义词典
#手动添加或删除词汇,仅仅只在内存中临时添加,未记录下来
segmentCN("画角声断谯门")
insertWords("谯门")
insertWords("画角")
segmentCN("画角声断谯门")
deleteWords(c("谯门","画角"))
segmentCN("画角声断谯门")
#使用save参数,把操作记录下来,下回启动能直接用
insertWords(c("谯门","画角"),save=TRUE)
segmentCN("画角声断谯门")
2. LingPipe
2.1. LingPipe简介
LingPipe是一个自然语言处理的Java开源工具包。LingPipe目前已有很丰富的功能,包括主题分类(Top Classification)、命名实体识别(Named Entity Recognition)、词性标注(Part-of Speech Tagging)、句题检测(Sentence Detection)、查询拼写检查(Query Spell Checking)、兴趣短语检测(Interseting Phrase Detection)、聚类(Clustering)、字符语言建模(CharacterLanguage Modeling)、医学文献下载/解析/索引(MEDLINEDownload, Parsing and Indexing)、数据库文本挖掘(DatabaseText Mining)、中文分词(ChineseWord Segmentation)、情感分析(SentimentAnalysis)、语言辨别(LanguageIdentification)等API。
功能非常强大,最重要的是文档超级详细,每个模型甚至连参考论文都列出来了,不仅使用方便,也非常适合模型的学习。
官方地址:http://alias-i.com/lingpipe/
下载地址:http://alias-i.com/lingpipe/web/download.html
2.2. LingPipe中文分词模块
UnlikeWestern languages, Chinese is written without spaces between words. Thus to runany word- or token-based linguistic processing on Chinese, it is firstnecessary to determine word boundaries. This tutorial shows how to segmentChinese into words based on LingPipe's spelling corrector.
http://alias-i.com/lingpipe/demos/tutorial/chineseTokens/read-me.html
2.3. Chinese Word Segmentation使用
1.下载最新版本的LingPipe,选择complete版本
下载地址:http://alias-i.com/lingpipe/web/downloadJarOrDistro.html?
2. 解压lingpipe-4.1.0.tar
3. 创建LingPipe项目
§ § § § § § |
4. 添加jar包
§ § § § § § |
添加后的eclipse截图
5.下载测试的Source code,并复制到src下
src/ChineseTokens05.java
6.设置训练参数
mZipFile = new File(args[0],"icwb2-data.zip"); mCorpusName =args[1]; mOutputFile = new File(mCorpusName + ".segments"); mKnownToksFile = new File(mCorpusName + ".knownWords"); mMaxNGram = Integer.valueOf(args[2]); mLambdaFactor = Double.valueOf(args[3]); mNumChars = Integer.valueOf(args[4]); mMaxNBest = Integer.valueOf(args[5]); |
改为
mZipFile = new File("C://Users//essex.user//Desktop//NLP//icwb2-data.zip"); mCorpusName = "cityu";//根据自己设定 mOutputFile = new File("C://Users//essex.user//Desktop//NLP//cityu.out.segments"); mKnownToksFile = new File(mCorpusName +".knownWords"); mMaxNGram = 5; mLambdaFactor = 5.0; mNumChars = 5000; mMaxNBest = 256; |
下载icwb2-data.zip ,其余参数按照chinese wordsegmentation 的tutorials设置
Data Directory=e:\data\chineseWordSegBakeoff03 Train Corpus Name=cityu Test Corpus Name=hk Output File Name=e:\data\chineseWordSegBakeoff03\cityu.out.segments Known Tokens File Name=e:\data\chineseWordSegBakeoff03\cityu.out.knownWords Char Encoding=Big5_HKSCS Max N-gram=5 Lambda factor=5.0 Num chars=5000 Max n-best=256 Continue weight=0.0 Break weight=0.0 |
3. Stanford Word Segmenter
3.1. Stanford Word Segmenter简介
Stanford Word Segmenter是斯坦福大学NLP group研发的一套基于CRF的开源中文分词系统,采用CRF(Conditional Random Fields)算法。速度比ICTCLAS4J快很多,但是不开放字典。
优点:很好处理歧义和未登录词问题,效果比基于字符串匹配效果好
缺点:需要大量的人工标注数据,较慢的分词速度(相比于传统的字典的最大正向匹配切分)
NLP地址: http://nlp.stanford.edu/
3.2. Stanford Word Segmenter软件包的使用
1,下载Stanford Word Segmenter软件包;
Download StanfordWord Segmenter version 2014-06-16
2,在eclipse上建立一个Project StanfordSegmenter。解压Stanford Word Segmenter软件包,将其中的data,arabic,test.sipe.utf8文件夹复制到项目下。
3,添加需要的jar包,seg.jar , stanford-segmenter-3.4-javadoc.jar, stanford-segmenter-3.4-sources.jar.
步骤:点击Project->Properties->JavaBulid Path->Libraries->Add External Jars
4,在项目下,建一个com.Seg包,在包下建立一个SegDemo.java,将解压出来的SegDemo的内容复制进去。
5,设置运行环境。
运行SegDemo,Run As-> Run Configurations,运行需要传入参数,test.simp.utf8.
由于Stanford-Sementer占用的内存比较大,所以需要设置VM arguments,不然就会超内存。
如果机子是64bit的可以设为,-mx2g。查看解压出来的segment.sh 文件, 可以看到JAVACMD语句的参数设置。
6,运行结果如下,可以看出分词的效果。
7,关联源码,进一步查看分词建模的细节。单步运行观察各个函数的功能。
7.1 对loadClassifierNoExceptions(也可以其他函数)点击 ctrl+右键观察源码。结果显示Source not Found.
7.2 关联源码,Attach Source->Extenal File->然后将最开始解压包中的stanford-segmenter-3.4-sources.jar包加进去。
7.3再次点击,就可以看得源码。
8,如果是中文版的eclipse需要改成英文版的。中文版的没有AttachSource提醒。改变步骤如下:
在eclipse的安装目录里找到eclipse.ini文件,编辑打开,在文件的后面加上 -Duser.language=en这句话,elipse就变成英文版的了
3. OpenNLP
3.1. OpenNLP简介
OpenNLP是Apache基金会下面的一个机器学习工具包,用于处理自然语言文本。支持大多数常用的 NLP任务,例如:分词、分句、词性标注、命名实体识别、主块分析、句法解析等。其中几个主要的网址为:
官网主页: http://opennlp.apache.org/
用户手册: http://opennlp.apache.org/documentation/1.5.3/manual/opennlp.html
模型下载: http://opennlp.sourceforge.net/models-1.5/
OpenNLP不仅提供了训练好的各种模型,最终要的是,它还允许自己训练模型.
3.2. OpenNLP使用
3.2.1 使用说明
OpenNLP的使用十分简单,归纳起来一般都遵循以下几个步骤:
1. 训练模型,当然也可以跳过该步骤,而直接使用官方提供的一些已经训练好的模型;
2. 加载模型,不同任务需要加载不同的模型,通常都是通过构造一个InputStream来加载训练好的模型;
3. 构造预测器,通过加载进来的训练好的模型构造预测器;
4. 利用预测器进行NLP相关任务.
3.2.2 测试使用
1. 下载jar包,设置环境
|
2. 使用实例
1.下载en-sent.bin ,并复制到project中
4.结果"Hi. How are you? This is Mike."被分成两句。
1.下载en-token.bin,并复制到project中 2.在test类中添加下面的代码
3.运行结果
1.下载en-ner-person.bin,并复制到project中
3.运行结果
后面几个部分全部在OpenNlpDemo中测试 code:
|
中文分词软件包的使用相关推荐
- php mmseg,中文分词软件 LibMMSeg
xapian 是不支持中文的,但是可以通过LibMMSeg来弥补改缺憾. LibMMSeg 简介 LibMMSeg 是Coreseek.com为 Sphinx 全文搜索引擎设计的中文分词软件包,其在G ...
- 【NLP】为什么中文分词比英文分词更难?有哪些常用算法?(附代码)
导读:人类文明的重要标志之一是语言文字的诞生.数千年来,几乎人类所有知识的传播都是以语言和文字作为媒介. 自然语言处理是使用计算机科学与人工智能技术分析和理解人类语言的一门学科.在人工智能的诸多范畴中 ...
- 为什么中文分词比英文分词更难?有哪些常用算法?(附代码)
导读:人类文明的重要标志之一是语言文字的诞生.数千年来,几乎人类所有知识的传播都是以语言和文字作为媒介. 自然语言处理是使用计算机科学与人工智能技术分析和理解人类语言的一门学科.在人工智能的诸多范畴中 ...
- linux xunsou_mysql中文分词全文搜索索引讯搜的安装
迅搜是开源免费.高性能.多功能简单易用的专业全文检索技术方案,帮助一般开发者针对既有的海量数据,快速而方便地建立自己的全文搜索引擎.全文检索可以帮助您降低服务器搜索负荷.极大程度的提高搜索速度和用户体 ...
- NLP考题:为什么中文分词比英文分词更难?有哪些常用算法?(附代码)
导读:人类文明的重要标志之一是语言文字的诞生.数千年来,几乎人类所有知识的传播都是以语言和文字作为媒介. 自然语言处理是使用计算机科学与人工智能技术分析和理解人类语言的一门学科.在人工智能的诸多范畴中 ...
- PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词
20210607 https://blog.csdn.net/u011828281/article/details/81171066 前言:译者实测 PyTorch 代码非常简洁易懂,只需要将中文分词 ...
- 一个隐马尔科夫模型的应用实例:中文分词
什么问题用HMM解决 现实生活中有这样一类随机现象,在已知现在情况的条件下,未来时刻的情况只与现在有关,而与遥远的过去并无直接关系. 比如天气预测,如果我们知道"晴天,多云,雨天" ...
- Python第三方库jieba(中文分词)入门与进阶(官方文档)
jieba "结巴"中文分词:做最好的 Python 中文分词组件 github:https://github.com/fxsjy/jieba 特点 支持三种分词模式: 精确模式, ...
- Lucene.net中文分词探究
一.中文分词方式: 中文分词几种常用的方式: A. 单字分词 单字分词,顾名思义,就是按照中文一个字一个字地进行分词.如:我们是中国人,效果:我/们/是/中/国/人. B. 二分法 二分法,就是按两个 ...
最新文章
- mysql主从只同步部分库或表
- python如何使用字典_python字典怎么使用zip
- redis怎么确认启动成功_不懂分Redis?现在开始动手!
- 车辆抵押贷款风险分析
- 微软公司软件开发模式简介
- Java实现Oracle数据库导入
- spring源代码分析
- win7免费升级win10官方工具
- Iocomp.Ultra Pack V5.SP3 for .Net Crack
- 【C语言01】用二维数组实现最简单的三子棋游戏
- 斐讯K1路由器刷入openwrt及通过netkeeper连接校园网
- python: 集合操作符和关系符号
- [SSL_CHX][2021-08-18]圆的面积
- php开启sockets模块,wdlinux 增加php的sockets模块
- activiti查询我的待办任务以及审批
- 【论文笔记】SIFA——基于GAN的双向跨模态无监督域适应框架
- 观察者模式(结合C#,Unity)
- 3.用js实现关闭淘宝二维码
- 【Mac新手必看】Desktop Picture壁纸文件夹找不到怎么办?苹果壁纸设置教程
- K65 Flex_CAN模块初始化