ik分词器 分词原理
测试Ik分词器以及增加自己的词汇

测试Ik分词器以及增加⾃⼰的词汇测试
启动kibana,打开开发⼯具
ik_smart:最少切分
GET _analyze
{
"analyzer": "ik_smart",
"text": ["中华⼈民共和国"]
}
ik_max_word:最细粒度划分,穷尽词库。
GET _analyze
{
"analyzer": "ik_max_word",
"text": ["中华⼈民共和国"]
}
我们输⼊⼀个⼈名:⽐如说宋殿鑫想当Java开发⼯程师,宋殿鑫是⼈名,但是被分开了。
出现问题:有些词被拆开了!
这种⾃⼰需要的词,要加到我们的分词字典中!
Ik分词器增加⾃⼰的配置
来到 elasticsearch-7.6.1\plugins\ik\config ⽬录下,打开IKAnalyzer.cfg.xml
我们先创建⼀个dic⽂件,也就是字典,其实我们打开其他的dic⽂件也是⼀样的。
编写后注⼊到配置⽂件中。
然后重启es和kibana,可以看到我们新加的⽂件
再分词,可以发现,宋殿鑫成为了单独的字段,没被细分。
原创:中文分词的逆向最大匹配算法

原创:中⽂分词的逆向最⼤匹配算法逆向最⼤匹配算法,中⽂分词机械化分词中最基本的算法,也是⼊门级别的算法。
但是,在机械化分词⽅⾯的效果,表现却很好。
尤其是在⼤⽂本的时候,⼀次取较多词语进⾏匹配,因为⼤⽂本匹配成词的概率远远⾼于⼩⽂本,所以会有很好的表现。
IK分词,在中⽂分词领域⾥,只能算是⽪⽑,或者说是⼀个壳⼉⽽已,根本不算真正的分词。
中⽂分词⾥⾯,运⽤CRF进⾏消除歧义分词,是主流,在NLP领域,RNN是主要技术⼿段,截⽌到2016年,RNN已经成功应⽤到NLP领域中,甚⾄在计算机视觉中也发挥着重要作⽤。
⽬前,在open nlp 社区⾥,有⼀个HanLP分词源码包,⾥⾯有极速分词和消歧分词,性能⾮常优异。
下⾯的代码,来⾃IK分词的⼀部分源码包,本⼈进⾏了逆向最⼤匹配算法的改造,闲着没事⼲,算是⼊门级别的分词。
package org.wltea.analyzer.core;import java.io.IOException;import java.io.Reader;import java.util.HashMap;import java.util.HashSet;import java.util.LinkedList;import java.util.Map;import java.util.Set;import org.wltea.analyzer.cfg.Configuration;import org.wltea.analyzer.dic.Dictionary;/*** 中分分词上下⽂环境* @author TongXueQiang* @date 2016/01/22* @since 1.7*/class AnalyzeContext {private char[] segmentBuff;private int[] charTypes;private int buffOffset;private int cursor;private int available;private Set<String> buffLocker;private QuickSortSet orgLexemes;private Map<Integer, LexemePath> pathMap;private LinkedList<Lexeme> results;private Configuration cfg;private Integer moveIndex;public AnalyzeContext(Configuration cfg) {this.cfg = cfg;this.segmentBuff = new char[4096];this.charTypes = new int[4096];this.buffLocker = new HashSet<String>();Lexemes = new QuickSortSet();this.pathMap = new HashMap<Integer, LexemePath>();this.results = new LinkedList<Lexeme>();}int getCursor() {return this.cursor;}char[] getSegmentBuff() {return this.segmentBuff;}char getCurrentChar() {return this.segmentBuff[this.cursor];}int getCurrentCharType() {return this.charTypes[this.cursor];}int getBufferOffset() {return this.buffOffset;}* 向缓冲区填充字符* @param reader* @return* @throws IOException*/int fillBuffer(Reader reader) throws IOException {int readCount = 0;if (this.buffOffset == 0) {readCount = reader.read(this.segmentBuff);} else {int offset = this.available - this.cursor;if (offset > 0) {System.arraycopy(this.segmentBuff, this.cursor,this.segmentBuff, 0, offset);readCount = offset;}readCount += reader.read(this.segmentBuff, offset, -offset);}this.available = readCount;this.cursor = 0;return readCount;}void initCursor() {this.cursor = this.available-1;//规范会字符this.segmentBuff[this.cursor] = CharacterUtil.regularize(this.segmentBuff[this.cursor]);//为字符指定类型,⽐如阿拉伯数字类型,英⽂字母类型等等this.charTypes[this.cursor] = CharacterUtil.identifyCharType(this.segmentBuff[this.cursor]);}boolean moveCursor() {if ((this.cursor-moveIndex) > 0) {this.cursor -= (moveIndex+1);//System.out.println("移动指针后的cursor位置:"+cursor);//移动指针后还要进⾏规范化当前字符this.segmentBuff[this.cursor] = CharacterUtil.regularize(this.segmentBuff[this.cursor]);//指定当前字符的类型this.charTypes[this.cursor] = CharacterUtil.identifyCharType(this.segmentBuff[this.cursor]);return true;}return false;}void lockBuffer(String segmenterName) {this.buffLocker.add(segmenterName);}void unlockBuffer(String segmenterName) {this.buffLocker.remove(segmenterName);}boolean isBufferLocked() {return (this.buffLocker.size() > 0);}boolean isBufferConsumed() {return (this.cursor == this.available - 1);}boolean needRefillBuffer() {return ((this.available == 4096) && (this.cursor < this.available - 1) && (this.cursor > this.available - 100) && (!(isBufferLocked())));void markBufferOffset() {this.buffOffset += this.cursor;}void addLexeme(Lexeme lexeme) {Lexemes.addLexeme(lexeme);}void addLexemePath(LexemePath path) {if (path != null)this.pathMap.put(Integer.valueOf(path.getPathBegin()), path);}QuickSortSet getOrgLexemes() {return Lexemes;}/*** 输出结果集*/void outputToResult() {int index = 0;while (index <= this.cursor) {LexemePath path = (LexemePath) this.pathMap.get(Integer.valueOf(index));if (path != null) {Lexeme l = path.pollFirst();if (l != null) {this.results.add(l);index = l.getBegin() + l.getLength();this.cursor = index;}} else {outputSingleCJK(index);++index;}}this.pathMap.clear();}private void outputSingleCJK(int index) {Lexeme singleCharLexeme;if (4 == this.charTypes[index]) {singleCharLexeme = new Lexeme(this.buffOffset, index, 1, 64);this.results.add(singleCharLexeme);} else if (8 == this.charTypes[index]) {singleCharLexeme = new Lexeme(this.buffOffset, index, 1, 8);this.results.add(singleCharLexeme);}}/*** 取出词元,为词元赋值* @return*/Lexeme getNextLexeme() {Lexeme result = (Lexeme) this.results.pollFirst();while (result != null) {compound(result);//数量词合并//过滤掉停⽤词if (Dictionary.getSingleton().isStopWord(this.segmentBuff,result.getBegin(), result.getLength())) {//System.out.println(Dictionary.getSingleton().isStopWord(this.segmentBuff, //result.getBegin(), result.getLength()));result = (Lexeme) this.results.pollFirst();} else {//为Lexeme赋值result.setLexemeText(String.valueOf(this.segmentBuff, result.getBegin(), result.getLength()));break;}}return result;}void reset() {this.buffLocker.clear();Lexemes = new QuickSortSet();this.available = 0;this.buffOffset = 0;this.charTypes = new int[4096];this.cursor = 0;this.results.clear();this.segmentBuff = new char[4096];this.pathMap.clear();}/*** 数量词合并* @param result*/private void compound(Lexeme result) {if (!(eSmart())) {return;}if (this.results.isEmpty())return;Lexeme nextLexeme;boolean appendOk;if (2 == result.getLexemeType()) {nextLexeme = (Lexeme) this.results.peekFirst();appendOk = false;if (16 == nextLexeme.getLexemeType()) {appendOk = result.append(nextLexeme, 16);} else if (32 == nextLexeme.getLexemeType()) {appendOk = result.append(nextLexeme, 48);}if (appendOk) {this.results.pollFirst();}}if ((16 == result.getLexemeType()) && (!(this.results.isEmpty()))) { nextLexeme = (Lexeme) this.results.peekFirst();appendOk = false;if (32 == nextLexeme.getLexemeType()) {appendOk = result.append(nextLexeme, 48);}if (!(appendOk))return;this.results.pollFirst();}}public void setMoveIndex(Integer moveIndex) {this.moveIndex = moveIndex;}}以下是CJK逆向最⼤匹配算法:package org.wltea.analyzer.core;import org.wltea.analyzer.dic.Dictionary;import org.wltea.analyzer.dic.Hit;/*** 中⽇韩分词器,逆向最⼤匹配算法** @author TongXueQiang* @date 2016/01/20* @since 1.7*/class CJKSegmenter implements ISegmenter {static final String SEGMENTER_NAME = "CJK_SEGMENTER";static Integer MATCH_LEN = 7;static Integer moveIndex = MATCH_LEN - 1;CJKSegmenter() {}/**逆向最⼤匹配算法** @see org.wltea.analyzer.core.ISegmenter#analyze(org.wltea.analyzer.core.* AnalyzeContext)*/public void analyze(AnalyzeContext context) {if (context.getCursor() < moveIndex) {moveIndex = context.getCursor();MATCH_LEN = context.getCursor() + 1;}Hit singleCharHit = Dictionary.getSingleton().matchInMainDict(context.getSegmentBuff(), context.getCursor() - moveIndex,MATCH_LEN);if (singleCharHit.isMatch() || MATCH_LEN == 1) {Lexeme newLexeme = new Lexeme(context.getBufferOffset(),context.getCursor() - moveIndex, MATCH_LEN, 4);context.addLexeme(newLexeme);context.setMoveIndex(moveIndex);init();} else {if (!singleCharHit.isUnmatch() || singleCharHit.isUnmatch()) {--moveIndex;--MATCH_LEN;analyze(context);}}}private void init() {moveIndex = 6;MATCH_LEN = 7;}@Overridepublic void reset() {}}⾰命尚未成功,同志仍需努⼒!专注机器学习理论的研究,寻求理论的突破,然后转化成代码,苦练最底层的基本功,持之以恒,兼顾理论和编程,成为不可或缺的⼈才,定能成为⼀流的⾼⼿!。
分词器——精选推荐

分词器分词器-介绍•IKAnalyzer是⼀个开源的,基于java语⾔开发的轻量级的中⽂分词⼯具包•是⼀个基于Maven构建的项⽬•具有60万字/秒的⾼速处理能⼒•⽀持⽤户词典扩展定义安装包在资料⽂件夹中提供ik分词器安装环境准备Elasticsearch 要使⽤ ik,就要先构建 ik 的 jar包,这⾥要⽤到 maven 包管理⼯具,⽽ maven 需要java 环境,⽽ Elasticsearch 内置了jdk,所以可以将JAVA_HOME设置为Elasticsearch 内置的jdk1)设置JAVA_HOMEvim /etc/profile# 在profile⽂件末尾添加#java environmentexport JAVA_HOME=/opt/elasticsearch-7.4.0/jdkexport PATH=$PATH:${JAVA_HOME}/bin# 保存退出后,重新加载profilesource /etc/profile2)下载maven安装包wget /pub/software/apache/maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.tar.gz3)解压maven安装包tar xzf apache-maven-3.1.1-bin.tar.gz4)设置软连接ln -s apache-maven-3.1.1 maven5)设置path打开⽂件vim /etc/profile.d/maven.sh将下⾯的内容复制到⽂件,保存export MAVEN_HOME=/opt/mavenexport PATH=${MAVEN_HOME}/bin:${PATH}设置好Maven的路径之后,需要运⾏下⾯的命令使其⽣效source /etc/profile.d/maven.sh6)验证maven是否安装成功mvn -v安装IK分词器1)下载IKwget https:///medcl/elasticsearch-analysis-ik/archive/v7.4.0.zip2)解压IK由于这⾥是zip包不是gz包,所以我们需要使⽤unzip命令进⾏解压,如果本机环境没有安装unzip,请执⾏:yum install zipyum install unzip解压IKunzip v7.4.0.zip3)编译jar包# 切换到 elasticsearch-analysis-ik-7.4.0⽬录cd elasticsearch-analysis-ik-7.4.0/#打包mvn package4) jar包移动package执⾏完毕后会在当前⽬录下⽣成target/releases⽬录,将其中的elasticsearch-analysis-ik-7.4.0.zip。
Es学习第五课,分词器介绍和中文分词器配置

Es学习第五课,分词器介绍和中⽂分词器配置上课我们介绍了倒排索引,在⾥⾯提到了分词的概念,分词器就是⽤来分词的。
分词器是ES中专门处理分词的组件,英⽂为Analyzer,定义为:从⼀串⽂本中切分出⼀个⼀个的词条,并对每个词条进⾏标准化。
它由三部分组成,Character Filters:分词之前进⾏预处理,⽐如去除html标签Tokenizer:将原始⽂本按照⼀定规则切分为单词Token Filters:针对Tokenizer处理的单词进⾏再加⼯,⽐如转⼩写、删除或增新等处理,也就是标准化预定义的分词器ES⾃带的分词器有如下:Standard Analyzer默认分词器按词切分,⽀持多语⾔⼩写处理⽀持中⽂采⽤的⽅法为单字切分Simple Analyzer按照⾮字母切分⼩写处理Whitespace Analyzer空⽩字符作为分隔符Stop Analyzer相⽐Simple Analyzer多了去除请⽤词处理停⽤词指语⽓助词等修饰性词语,如the, an, 的,这等Keyword Analyzer不分词,直接将输⼊作为⼀个单词输出Pattern Analyzer通过正则表达式⾃定义分隔符默认是\W+,即⾮字词的符号作为分隔符ES默认对中⽂分词是⼀个⼀个字来解析,这种情况会导致解析过于复杂,效率低下,所以⽬前有⼏个开源的中⽂分词器,来专门解决中⽂分词,其中常⽤的叫IK中⽂分词难点中⽂分词指的是将⼀个汉字序列切分为⼀个⼀个的单独的词。
在英⽂中,单词之间以空格作为⾃然分界词,汉语中词没有⼀个形式上的分界符上下⽂不同,分词结果迥异,⽐如交叉歧义问题常见分词系统:实现中英⽂单词的切分,可⾃定义词库,⽀持热更新分词词典:⽀持分词和词性标注,⽀持繁体分词,⾃定义词典,并⾏分词等:由⼀系列模型与算法组成的Java⼯具包,⽬标是普及⾃然语⾔处理在⽣产环境中的应⽤:中⽂分词和词性标注安装配置ik中⽂分词插件# 在Elasticsearch安装⽬录下执⾏命令,然后重启esbin/elasticsearch-plugin install https:///medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0.zip # 如果由于⽹络慢,安装失败,可以先下载好zip压缩包,将下⾯命令改为实际的路径,执⾏,然后重启esbin/elasticsearch-plugin install file:///path/to/elasticsearch-analysis-ik-6.3.0.zipik两种分词模式ik_max_word 和 ik_smart 什么区别?ik_max_word: 会将⽂本做最细粒度的拆分,⽐如会将“中华⼈民共和国国歌”拆分为“中华⼈民共和国,中华⼈民,中华,华⼈,⼈民共和国,⼈民,⼈,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;ik_smart: 会做最粗粒度的拆分,⽐如会将“中华⼈民共和国国歌”拆分为“中华⼈民共和国,国歌”。
如何在Elasticsearch中安装中文分词器(IK+pinyin)

如何在Elasticsearch中安装中⽂分词器(IK+pinyin)如果直接使⽤Elasticsearch的朋友在处理中⽂内容的搜索时,肯定会遇到很尴尬的问题——中⽂词语被分成了⼀个⼀个的汉字,当⽤Kibana作图的时候,按照term来分组,结果⼀个汉字被分成了⼀组。
这是因为使⽤了Elasticsearch中默认的标准分词器,这个分词器在处理中⽂的时候会把中⽂单词切分成⼀个⼀个的汉字,因此引⼊中⽂的分词器就能解决这个问题。
本篇⽂章按照下⾯的内容进⾏描述:分词器的作⽤安装IK简单的测试模拟测试安装elasticsearch-analysis-pinyin简单的测试模拟测试分词器的作⽤分词顾名思义,就是把⼀句话分成⼀个⼀个的词。
这个概念在搜索中很重要,⽐如This is a banana.如果按照普通的空格来分词,分成this,is,a,banana,的出来的a其实对我们并没有什么⽤处。
因此需要注意下⾯的问题:1 区分停顿词(a,or,and这种都属于停顿词)2 ⼤⼩写转换(Banana与banana)3 时态的转换....相⽐中⽂,就复杂的度了。
因为中⽂不能单纯的依靠空格,标点这种进⾏分词。
就⽐如中华⼈民共和国国民,不能简单的分成⼀个词,也不能粗暴的分成中华⼈民共和国和国民,⼈民、中华这些也都算⼀个词!因此常见的分词算法就是拿⼀个标准的词典,关键词都在这个词典⾥⾯。
然后按照⼏种规则去查找有没有关键词,⽐如:正向最⼤匹配(从左到右)逆向最⼤匹配(从右到左)最少切分双向匹配(从左扫描⼀次,从右扫描⼀次)提供了两种⽅式,ik_smart就是最少切分,ik_max_word则为细粒度的切分(可能是双向,没看过源码)了解了分词器的背景后,就可以看⼀下如何在Elasticsearch重安装分词器了。
安装IK在,⽐如我的最新版本2.4.0就没有对应的ik版本,不⽤担⼼,只需要修改pom.xml就可以了:<properties><!-- 这⾥的版本号,修改成你对应的版本就⾏了。
IKanalyzer、ansj_seg、jcseg三种中文分词器的实战较量

IKanalyzer、ansj_seg、jcseg三种中⽂分词器的实战较量选⼿:IKanalyzer、ansj_seg、jcseg硬件:i5-3470 3.2GHz 8GB win7 x64⽐赛项⽬:1、搜索;2、⾃然语⾔分析选⼿介绍: 1,IKanalyzer IKanalyzer采⽤的是“正向迭代最细粒度切分算法”,是⽐较常见⽽且很容易上⼿的分词器了。
⼀般新⼿上路学习lucene或者solr都会⽤这个。
优点是开源(其实java分词器多是开源的,毕竟算法都是业内熟知的)、轻量、⽬前来看没有太⼤的bug,源码简单易懂,做⼆次开发也很简单,即使遇到solr/Lucene版本更新,只需要⾃⼰稍微修改下实现类就可以通⽤。
缺点是过于简单⽩痴,只是简单的根据配置好的词库进⾏分词,没有任何智能可⾔,连“和服”、“和服务器”这种⽼梗都破不了。
我⼿头的IKanalyzer是被我进⾏⼆次开发后的版本,修改了⼀些问题,词库读取⽅式改成树形。
IKanalyzer可以作为⾮智能分词器的代表出场。
2,ansj_segansj_seg分词器⽤的⼈可能不太多吧,不过个⼈觉得是开源分词器⾥最强悍功能最丰富的。
作者孙建,我曾在微博上与他有过简单的交流,讨论过ansj_seg分词器的⼀些⼩的bug和不⾜。
ansj_seg基于中科院的 ictclas 中⽂分词算法,智能、⾼效。
虽然现在已经有ictclas 的for java版本,但是 ansj_seg从实现到使⽤来说要强⼤的多,⽽且作者⾃产⾃销⾃⽤,很多细节和⼩功能都有考虑,在索引和⾃然语⾔分析⽅⾯都有很优秀的表现。
我⼿头的ansj_seg是⾃⼰修复了⼀些bug后的版本。
ansj_seg可以作为ictclas 算法实现的分词器的代表出场。
3,jcsegjcseg分词器使⽤的是mmseg算法和fmm算法,这个分词器类似ansj_seg的很多地⽅,智能、⼈性化,个⼈感觉体验要超过同门师兄弟mmseg4j,所以可以作为mmseg算法实现的分词器的代表出场。
elasticsearchik分词插件的扩展字典和扩展停止词字典用法

elasticsearchik分词插件的扩展字典和扩展停⽌词字典⽤法cnblog的排版好看很多,所以在这⾥建⼀篇分享博客。
-----------------------------------------------------------------------------------------------扩展字典中的词会被筛选出来,扩展停⽌词中的词会被过滤掉1.没有加⼊扩展字典停⽌词字典⽤法1) ik分词器[root@localhost custom]# curl -i -X GET -H 'Content-type:application/json' -d '{"analyzer":"ik","text":"⾃古⼑扇过背刺"}' http://192.168.0.110:9200/_analyze?prettyHTTP/1.1200 OKContent-Type: application/json; charset=UTF-8Content-Length: 725{"tokens" : [ {"token" : "⾃古","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0}, {"token" : "⼑","start_offset" : 2,"end_offset" : 3,"type" : "CN_WORD","position" : 1}, {"token" : "扇","start_offset" : 3,"end_offset" : 4,"type" : "CN_WORD","position" : 2}, {"token" : "过","start_offset" : 4,"end_offset" : 5,"type" : "CN_CHAR","position" : 3}, {"token" : "背","start_offset" : 5,"end_offset" : 6,"type" : "CN_WORD","position" : 4}, {"token" : "刺","start_offset" : 6,"end_offset" : 7,"type" : "CN_CHAR","position" : 5} ]}2) ik_smart分词器[root@localhost custom]# curl -i -X GET -H 'Content-type:application/json' -d '{"analyzer":"ik_smart","text":"⾃古⼑扇过背刺"}' http://192.168.0.110:9200/_analyze?pretty HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8Content-Length: 725{"tokens" : [ {"token" : "⾃古","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0}, {"token" : "⼑","start_offset" : 2,"end_offset" : 3,"type" : "CN_WORD","position" : 1}, {"token" : "扇","start_offset" : 3,"end_offset" : 4,"type" : "CN_WORD","position" : 2}, {"token" : "过","start_offset" : 4,"end_offset" : 5,"type" : "CN_CHAR","position" : 3}, {"token" : "背","start_offset" : 5,"end_offset" : 6,"type" : "CN_WORD","position" : 4}, {"token" : "刺","start_offset" : 6,"end_offset" : 7,"type" : "CN_CHAR","position" : 5} ]}3) ik_max_word分词器[root@localhost custom]# curl -i -X GET -H 'Content-type:application/json' -d '{"analyzer":"ik_max_word","text":"⾃古⼑扇过背刺"}' http://192.168.0.110:9200/_analyze?pretty HTTP/1.1200 OKContent-Type: application/json; charset=UTF-8Content-Length: 725{"tokens" : [ {"token" : "⾃古","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0}, {"token" : "⼑","start_offset" : 2,"end_offset" : 3,"type" : "CN_WORD","position" : 1}, {"token" : "扇","start_offset" : 3,"end_offset" : 4,"type" : "CN_WORD","position" : 2}, {"token" : "过","start_offset" : 4,"end_offset" : 5,"type" : "CN_CHAR","position" : 3}, {"token" : "背","start_offset" : 5,"end_offset" : 6,"type" : "CN_WORD","position" : 4}, {"token" : "刺","start_offset" : 6,"end_offset" : 7,"type" : "CN_CHAR","position" : 5} ]}2.加⼊⾃定义字典扩展字典:⽤于创建分词的字典停⽌字典:⽤于过滤的字典,也就是说,该字典的单词或者字符串都会进⾏过滤test.dic⼑扇背刺teststop.dic⾃古过/analysis-ik/config/IKAnalyzer.cfg.xml1) ik分词器[root@localhost config]# curl -i -X GET -H 'Content-type:application/json' -d '{"analyzer":"ik","text":"⾃古⼑扇过背刺"}' http://192.168.0.110:9200/_analyze?prettyHTTP/1.1200 OKContent-Type: application/json; charset=UTF-8Content-Length: 728{"tokens" : [ {"token" : "⼑扇","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 0}, {"token" : "⼑","start_offset" : 2,"end_offset" : 3,"type" : "CN_WORD","position" : 1}, {"token" : "扇","start_offset" : 3,"end_offset" : 4,"type" : "CN_WORD","position" : 2}, {"token" : "背刺","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 3}, {"token" : "背","start_offset" : 5,"end_offset" : 6,"type" : "CN_WORD","position" : 4}, {"token" : "刺","start_offset" : 6,"end_offset" : 7,"type" : "CN_CHAR","position" : 5} ]}2) ik_smart分词器[root@localhost config]# curl -i -X GET -H 'Content-type:application/json' -d '{"analyzer":"ik_smart","text":"⾃古⼑扇过背刺"}' http://192.168.0.110:9200/_analyze?pretty HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8Content-Length: 260{"tokens" : [ {"token" : "⼑扇","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 0}, {"token" : "背刺","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 1} ]}3) ik_max_word分词器[root@localhost config]# curl -i -X GET -H 'Content-type:application/json' -d '{"analyzer":"ik_max_word","text":"⾃古⼑扇过背刺"}' http://192.168.0.110:9200/_analyze?prettyHTTP/1.1200 OKContent-Type: application/json; charset=UTF-8Content-Length: 728{"tokens" : [ {"token" : "⼑扇","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 0}, {"token" : "⼑","start_offset" : 2,"end_offset" : 3,"type" : "CN_WORD","position" : 1}, {"token" : "扇","start_offset" : 3,"end_offset" : 4,"type" : "CN_WORD","position" : 2}, {"token" : "背刺","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 3}, {"token" : "背", "start_offset" : 5, "end_offset" : 6, "type" : "CN_WORD", "position" : 4}, {"token" : "刺", "start_offset" : 6, "end_offset" : 7, "type" : "CN_CHAR", "position" : 5} ]}。
分词技术Web信息检索与数据抓取 IKAnalyzer 分词.pptx

} }}
参考文献(资源)
10
1.网络爬虫在Web信息搜索与数据挖掘中应用 杨定中 , 赵刚 , 王泰 《计算 机工程与设计》 , 2009 , 30 (24) 2.刘清林 web信息检索与数据抓取电子讲义
IKAnalyzer 分词实例
6
public class IKAnalyzerDemo { public static void main(String[] args) { // Lucene Document的域名 String fieldName = "text"; String indexpath = "d://index"; String text = "北京商务局局长到武汉访问";
IKAnalyzer 分词实例
7
try {
directory = FSDirectory.open(new File(indexpath));
// 配置IndexWriterConfig IndexWriterConfig iwConfig = new
IndexWriterConfig(Version.LUCENE_34, analyzer); iwConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
IKAnalyzer 分词
3
支持停用词
重要特性
支持扩展词
IKAnalyzer 分词实例
4
1
下载IKAnalyzer2012.jar、lucene-core-3.5.0.jar
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ik分词器分词原理
IK分词器(IKAnalyzer)是一款针对中文文本的智能分词器,其为搜索引擎、虚拟客服交互、搜索导航系统等提供智能分词服务,是目前中文处理领域应用最广泛、使用最多的中文分词器。
分词器使用算法能够自动对中文文本进行分词处理,其原理主要分为以下四部分:
1.库算法:IK分词器使用词库算法来处理中文文本。
使用词库算法时,先分析出每个文本中的词语,然后从词库中找出其中的名词、动词等词,最终将文本中的每个词按规则匹配出来。
2.向分词:使用双向分词算法时,会将文本从左到右、从右到左依次拆分,以最大概率的分词结果来分析文本。
这样就能将一个文本拆分成尽可能多的最短的词语,使搜索更加准确简单。
3. N-最短路径:使用N-最短路径算法时,会构建一个有向图,将其中每个点都看作是文本中的一个词,而每个边都会携带一个权值,表示两个词之间的词性分析结果。
然后在有向图中搜索出来一条最优的路径,从而得到一个最优的分词结果。
4. HMM算法:HMM算法是一种基于隐马尔科夫模型的算法,是计算机语言处理领域常用的算法之一。
使用HMM算法时,先搭建一个隐马尔科夫模型,然后根据文本中的每个词语来计算概率,最终得到一个最优的分词结果。
以上就是IK分词器分词原理的总结,基于这四种分词算法,IK 分词器能够对中文文本进行准确的分词处理,为文本信息搜索提供
了可靠的技术基础。
IK分词器的分词原理是以中文文本的分词为基础的,它是通过新颖的语言处理技术,将文本中的内容进行语义解析,最后得出准确有效的分词结果。
IK分词器可以针对文本内容,根据文本中出现的词语,使用词库算法来处理文本,通过双向分词算法从中提取出尽可能多的最短的词语,从而保证搜索的准确性。
此外,IK分词器还使用N-最短路径算法和HMM算法,可以从中构建出一个有向图,搜索出最优的路径,从而完成文本的分词处理。
综上所述,IK分词器具有易用性高、计算效率高、速度快等优点,为新型搜索引擎等提供可靠的技术基础,是当前中文分词领域应用最广泛、使用最多的分词器。