1.概述
转载: https://blog.csdn.net/tzs_1041218129/article/details/77887767
分词器首先看文章:【Elasticsearch】Elasticsearch analyzer 分词器
2.ik-analyzer
https://github.com/wks/ik-analyzer
IKAnalyzer
是一个开源的,基于java语言开发的轻量级的中文分词工具包。
采用了特有的“正向迭代最细粒度切分算法
“,支持细粒度和最大词长两种切分模式;具有83万字/秒(1600KB/S)的高速处理能力
。
采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符
优化的词典存储,更小的内存占用
。支持用户词典扩展定义
针对Lucene全文检索优化的查询分析器IKQueryParser
(作者吐血推荐);引入简单搜索表达式,采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。
Maven用法:
<dependency>
<groupId>org.wltea.ik-analyzer</groupId>
<artifactId>ik-analyzer</artifactId>
<version>3.2.8</version>
</dependency>
在IK Analyzer加入Maven Central Repository
之前,你需要手动安装,安装到本地的repository,或者上传到自己的Maven repository服务器上。
要安装到本地Maven repository,使用如下命令,将自动编译,打包并安装:
mvn install -Dmaven.test.skip=true
2.1 Elasticsearch添加中文分词
安装IK分词插件
https://github.com/medcl/elasticsearch-analysis-ik
进入elasticsearch-analysis-ik-master
更多安装请参考博客:
2、如何在Elasticsearch中安装中文分词器(IK+pinyin)
3、Elasticsearch 中文分词器 IK 配置和使用
2、结巴中文分词
特点:
1、支持三种分词模式:
-
精确模式,试图将句子最精确地切开,适合文本分析;
-
全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
-
搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
2、支持繁体分词
3、支持自定义词典
3、THULAC
THULAC(THU Lexical Analyzer for Chinese)
由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。THULAC具有如下几个特点:
能力强。利用我们集成的目前世界上规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大
。
准确率高。该工具包在标准数据集Chinese Treebank(CTB5)上分词的F1值可达97.3%,词性标注的F1值可达到92.9%,
与该数据集上最好方法效果相当。
速度较快。同时进行分词和词性标注速度为300KB/s
,每秒可处理约15万字
。只进行分词速度可达到1.3MB/s
。
中文分词工具thulac4j发布
1、规范化分词词典
,并去掉一些无用词;
2、重写DAT(双数组Trie树)的构造算法
,生成的DAT size减少了8%左右,从而节省了内存
;
3、优化分词算法,提高了分词速率
。
<dependency>
<groupId>io.github.yizhiru</groupId>
<artifactId>thulac4j</artifactId>
<version>${thulac4j.version}</version>
</dependency>
http://www.cnblogs.com/en-heng/p/6526598.html
thulac4j支持两种分词模式:
SegOnly模式,只分词没有词性标注;
SegPos模式,分词兼有词性标注。
// SegOnly mode
String sentence = "滔滔的流水,向着波士顿湾无声逝去";
SegOnly seg = new SegOnly("models/seg_only.bin");
System.out.println(seg.segment(sentence));
// [滔滔, 的, 流水, ,, 向着, 波士顿湾, 无声, 逝去]
// SegPos mode
SegPos pos = new SegPos("models/seg_pos.bin");
System.out.println(pos.segment(sentence));
//[滔滔/a, 的/u, 流水/n, ,/w, 向着/p, 波士顿湾/ns, 无声/v, 逝去/v]
4、NLPIR
中科院计算所 NLPIR:http://ictclas.nlpir.org/nlpir/ (可直接在线分析中文)
下载地址:https://github.com/NLPIR-team/NLPIR
中科院分词系统(NLPIR)JAVA简易教程: http://www.cnblogs.com/wukongjiuwo/p/4092480.html
5、ansj分词器
https://github.com/NLPchina/ansj_seg
这是一个基于n-Gram+CRF+HMM
的中文分词的java实现.
分词速度达到每秒钟大约200万字左右(mac air下测试),准确率能达到96%以上
目前实现了.中文分词. 中文姓名识别 .
用户自定义词典,关键字提取,自动摘要,关键字标记等功能
可以应用到自然语言处理等方面,适用于对分词效果要求高的各种项目.
maven 引入:
<dependency>
<groupId>org.ansj</groupId>
<artifactId>ansj_seg</artifactId>
<version>5.1.1</version>
</dependency>
调用demo
String str = "欢迎使用ansj_seg,(ansj中文分词)在这里如果你遇到什么问题都可以联系我.我一定尽我所能.帮助大家.ansj_seg更快,更准,更自由!" ;
System.out.println(ToAnalysis.parse(str));
欢迎/v,使用/v,ansj/en,_,seg/en,,,(,ansj/en,中文/nz,分词/n,),在/p,这里/r,如果/c,你/r,遇到/v,什么/r,问题/n,都/d,可以/v,联系/v,我/r,./m,我/r,一定/d,尽我所能/l,./m,帮助/v,大家/r,./m,ansj/en,_,seg/en,更快/d,,,更/d,准/a,,,更/d,自由/a,!
6、哈工大的LTP
https://link.zhihu.com/?target=https%3A//github.com/HIT-SCIR/ltp
LTP
制定了基于XML
的语言处理结果表示,并在此基础上提供了一整套自底向上的丰富而且高效的中文语言处理模块(包括词法、句法、语义等6项中文处理核心技术),以及基于动态链接库(Dynamic Link Library, DLL
)的应用程序接口、可视化工具,并且能够以网络服务(Web Service)的形式进行使用。
关于LTP的使用,请参考: http://ltp.readthedocs.io/zh_CN/latest/
7、庖丁解牛
下载地址:http://pan.baidu.com/s/1eQ88SZS
使用分为如下几步:
1.配置dic文件:
修改paoding-analysis.jar
中的paoding-dic-home.properties
文件,将“#paoding.dic.home=dic”
的注释去掉,并配置成自己dic
文件的本地存放路径。eg:/home/hadoop/work/paoding-analysis-2.0.4-beta/dic
2.把Jar包导入到项目中:
将paoding-analysis.jar、commons-logging.jar、lucene-analyzers-2.2.0.jar和lucene-core-2.2.0.jar
四个包导入到项目中,这时就可以在代码片段中使用庖丁解牛工具提供的中文分词技术,例如:
Analyzer analyzer = new PaodingAnalyzer(); //定义一个解析器
String text = "庖丁系统是个完全基于lucene的中文分词系统,它就是重新建了一个analyzer,叫做PaodingAnalyzer,这个analyer的核心任务就是生成一个可以切词TokenStream。"; <span style="font-family: Arial, Helvetica, sans-serif;">//待分词的内容</span>
TokenStream tokenStream = analyzer.tokenStream(text, new StringReader(text)); //得到token序列的输出流
try {
Token t;
while ((t = tokenStream.next()) != null)
{
System.out.println(t); //输出每个token
}
} catch (IOException e) {
e.printStackTrace();
}
8、sogo在线分词
sogo在线分词采用了基于汉字标注
的分词方法,主要使用了线性链链CRF(Linear-chain CRF)模型
。词性标注模块主要基于结构化线性模型(Structured Linear Model)
在线使用地址为:
http://www.sogou.com/labs/webservice/
9、word分词
地址: https://github.com/ysc/word
word分词是一个Java实现的分布式的中文分词组件
,提供了多种基于词典的分词算法,并利用ngram模型
来消除歧义。能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词。能通过自定义配置文件来改变组件行为,能自定义用户词库、自动检测词库变化、支持大规模分布式环境,能灵活指定多种分词算法,能使用refine功能灵活控制分词结果,还能使用词频统计、词性标注、同义标注、反义标注、拼音标注等功能。提供了10种分词算法,还提供了10种文本相似度算法,同时还无缝和Lucene、Solr、ElasticSearch、Luke集成。注意:word1.3需要JDK1.8
maven 中引入依赖:
<dependencies>
<dependency>
<groupId>org.apdplat</groupId>
<artifactId>word</artifactId>
<version>1.3</version>
</dependency>
</dependencies>
ElasticSearch插件:
1、打开命令行并切换到elasticsearch的bin目录
cd elasticsearch-2.1.1/bin
2、运行plugin脚本安装word分词插件:
./plugin install http://apdplat.org/word/archive/v1.4.zip
安装的时候注意:
如果提示:
ERROR: failed to download
或者
Failed to install word, reason: failed to download
或者
ERROR: incorrect hash (SHA1)
则重新再次运行命令,如果还是不行,多试两次
如果是elasticsearch1.x系列版本,则使用如下命令:
./plugin -u http://apdplat.org/word/archive/v1.3.1.zip -i word
3、修改文件elasticsearch-2.1.1/config/elasticsearch.yml,新增如下配置:
index.analysis.analyzer.default.type : "word"
index.analysis.tokenizer.default.type : "word"
4、启动ElasticSearch测试效果,在Chrome浏览器中访问:
http://localhost:9200/_analyze?analyzer=word&text=杨尚川是APDPlat应用级产品开发平台的作者
5、自定义配置
修改配置文件elasticsearch-2.1.1/plugins/word/word.local.conf
6、指定分词算法
修改文件elasticsearch-2.1.1/config/elasticsearch.yml,新增如下配置:
index.analysis.analyzer.default.segAlgorithm : "ReverseMinimumMatching"
index.analysis.tokenizer.default.segAlgorithm : "ReverseMinimumMatching"
这里segAlgorithm可指定的值有:
正向最大匹配算法:MaximumMatching
逆向最大匹配算法:ReverseMaximumMatching
正向最小匹配算法:MinimumMatching
逆向最小匹配算法:ReverseMinimumMatching
双向最大匹配算法:BidirectionalMaximumMatching
双向最小匹配算法:BidirectionalMinimumMatching
双向最大最小匹配算法:BidirectionalMaximumMinimumMatching
全切分算法:FullSegmentation
最少词数算法:MinimalWordCount
最大Ngram分值算法:MaxNgramScore
如不指定,默认使用双向最大匹配算法:BidirectionalMaximumMatching
10、jcseg分词器
https://code.google.com/archive/p/jcseg/
11、stanford分词器
Stanford大学的一个开源分词工具,目前已支持汉语。
首先,去【1】下载Download Stanford Word Segmenter version 3.5.2
,取得里面的 data 文件夹,放在maven project
的 src/main/resources
里。
然后,maven依赖添加:
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<corenlp.version>3.6.0</corenlp.version>
</properties>
<dependencies>
<dependency>
<groupId>edu.stanford.nlp</groupId>
<artifactId>stanford-corenlp</artifactId>
<version>${corenlp.version}</version>
</dependency>
<dependency>
<groupId>edu.stanford.nlp</groupId>
<artifactId>stanford-corenlp</artifactId>
<version>${corenlp.version}</version>
<classifier>models</classifier>
</dependency>
<dependency>
<groupId>edu.stanford.nlp</groupId>
<artifactId>stanford-corenlp</artifactId>
<version>${corenlp.version}</version>
<classifier>models-chinese</classifier>
</dependency>
</dependencies>
测试:
import java.util.Properties;
import edu.stanford.nlp.ie.crf.CRFClassifier;
public class CoreNLPSegment {
private static CoreNLPSegment instance;
private CRFClassifier classifier;
private CoreNLPSegment(){
Properties props = new Properties();
props.setProperty("sighanCorporaDict", "data");
props.setProperty("serDictionary", "data/dict-chris6.ser.gz");
props.setProperty("inputEncoding", "UTF-8");
props.setProperty("sighanPostProcessing", "true");
classifier = new CRFClassifier(props);
classifier.loadClassifierNoExceptions("data/ctb.gz", props);
classifier.flags.setProperties(props);
}
public static CoreNLPSegment getInstance() {
if (instance == null) {
instance = new CoreNLPSegment();
}
return instance;
}
public String[] doSegment(String data) {
return (String[]) classifier.segmentString(data).toArray();
}
public static void main(String[] args) {
String sentence = "他和我在学校里常打桌球。";
String ret[] = CoreNLPSegment.getInstance().doSegment(sentence);
for (String str : ret) {
System.out.println(str);
}
}
}
博客:
https://blog.sectong.com/blog/corenlp_segment.html
http://blog.csdn.net/lightty/article/details/51766602
12、Smartcn
Smartcn为Apache2.0协议的开源中文分词系统,Java语言编写,修改的中科院计算所ICTCLAS分词系统。很早以前看到Lucene上多了一个中文分词的contribution,当时只是简单的扫了一下.class文件的文件名,通过文件名可以看得出又是一个改的ICTCLAS的分词系统。
http://lucene.apache.org/core/5_1_0/analyzers-smartcn/org/apache/lucene/analysis/cn/smart/SmartChineseAnalyzer.html