ES分词原理探究
1. 分词器
1.1 ansj_seg(用java写的中文分词器)
1.1.1 分词方式
1.1.1.1 ToAnalysis(精准分词)
它在易用性,稳定性.准确性.以及分词效率上.都取得了一个不错的平衡.如果你初次尝试Ansj如果你想开箱即用.那么就用这个分词方式是不会错的
1.1.1.2 DicAnalysis(用户自定义词典优先策略的分词)
用户自定义词典优先策略的分词,如果你的用户自定义词典足够好,或者你的需求对用户自定义词典的要求比较高,那么强烈建议你使用DicAnalysis的分词方式
1.1.1.3 NlpAnalysis(带有新词发现功能的分词)
nlp的适用方式.1.语法实体名抽取.未登录词整理.主要是对文本进行发现分析等工作
1.1.1.4 IndexAnalysis(面向索引的分词)
顾名思义就是适合在lucene等文本检索中用到的分词。 主要考虑以下两点
召回率 * 召回率是对分词结果尽可能的涵盖。比如对“上海虹桥机场南路” 召回结果是[上海/ns, 上海虹桥机场/nt, 虹桥/ns, 虹桥机场/nz, 机场/n, 南路/nr]
准确率 * 其实这和召回本身是具有一定矛盾性的Ansj的强大之处是很巧妙的避开了这两个的冲突 。比如我们常见的歧义句“旅游和服务”->对于一般保证召回 。大家会给出的结果是“旅游 和服 服务” 对于ansj不存在跨term的分词。意思就是。召回的词只是针对精准分词之后的结果的一个细分。比较好的解决了这个问题
1.1.1.5 BaseAnalysis(最小颗粒度的分词)
基本就是保证了最基本的分词.词语颗粒度最非常小的…所涉及到的词大约是10万左右.
基本分词速度非常快.在macAir上.能到每秒300w字每秒.同时准确率也很高.但是对于新词他的功能十分有限.
1.1.2 用户自定义词典
1.1.2.1 DicLibrary(自定义词典)
1.1.2.2 StopLibrary(停用词词典)
1.1.2.1 CrfLibrary(crf模型)
1.1.2.1 AmbiguityLibrary(歧义词典)
1.1.2.1 SynonymsLibrary(同义词词典)
2. ES分析器
2.1 分析器组成
分析器由三个部分组成,按照执行先后顺序分别是:字符过滤器、分词器、分词过滤器。其中字符过滤器和分词过滤器均为可选组成部分,可以不包含,也可以包含多个,分词器是必须有的且只能有一个。
2.1.1 字符过滤器(Character filters)
2.1.2 分词器(Tokenizer)
分词器就是用来切分文本用的,负责将一段文本按照指定的规则进行分割,并保存分割后的分词的顺序以及开始字符和结束字符
2.1.3 分词过滤器(Token filters)
2.2 ES内置分析器
分析器是一个打包单元,ES预先将一些字符过滤器、分词器和分词过滤器组合打包在一起,称为内置分析器。常用有以下几个:标准分析器、空白分析器、关键词分析器等。
2.2.1 标准分析器(Standard Analyzer)
标准分析器会移除文本里的大多数标点符号,并根据单词边界切分文本,比较适合英文文本,在中文文本上会逐字切分。
标准分析器由以下部分组成:标准分词器、标准分词过滤器、小写过滤器、停用词过滤器。
2.2.1.1 标准分词器
标准分词器基于语法分词(基于Unicode文本分段算法),适用于非中文语言。
分割标准:http://unicode.org/reports/tr29/
2.2.2 空白分析器(Whitespace Analyzer)
空白分析器里的分词器会根据空白切分文本。空白分析器没有过滤器,只包含空白分词器。
2.2.3 关键词分析器(Keyword Analyzer)
关键词分析器不会对文本进行切分,即不会分词。关键词分析器只包含关键词分词器。
2.3 自定义分析器
由上文可知,分析器只是各种分词器和过滤器的组合,如果内置的分析器不能满足需要,我们可以很方便地自定义分析器。比如,我想利用标准分词器的文本切分能力,但不需要将文本转换为小写,则可以按如下步骤操作:
2.3.1 创建自定义分析器
1 | PUT demo_index |
2.3.2 使用自定义分析器
1 | POST demo_index/_analyze |
3. ES插件
插件是一种以自定义方式增强ES核心功能的方法。包括添加自定义映射类型、自定义分析器等。必须安装在集群中的每个节点上,安装后,必须重启才能生效。分为核心插件和社区插件,核心插件属于ES项目组成部分,社区插件是个人或其他公司开发的外部项目。本文关注分析类插件。
官方有专门的文档用来介绍ES插件,不在ES官方文档里,文档地址:https://www.elastic.co/guide/en/elasticsearch/plugins/6.3/index.html
3.1 核心分析插件
主要有ICU、Phonetic、SmartCN等。
3.2 社区分析插件
主要关注中文分析插件,比如IK、Ansj等。本文介绍Ansj及其插件。
3.2.1 elasticsearch-analysis-ansj(基于ansj的es分析插件)
该插件会在es集群中增加以下分析器:base_ansj、index_ansj、query_ansj、dic_ansj、nlp_ansj。
query_ansj分析器对应的分词方式为ToAnalysis。
识别优先级:人名识别=》数字识别=》用户自定义词典识别
index_ansj分析器对应的分词方式为IndexAnalysis。
识别优先级:数字识别=》人名识别=》用户自定义词典识别
dic_ansj分析器对应的分词方式为DicAnalysis。
识别优先级:用户自定义词典识别=》数字识别=》人名识别
nlp_ansj分析器对应的分词方式为NlpAnalysis。
识别优先级:人名识别=》数字识别=》用户自定义词典识别=》新词识别(crf模型)
base_ansj分析器对应的分词方式为BaseAnalysis。只识别数字,其他一律不管。
分词过程:加载用户自定义词典和歧义词典-》执行分词=》停用词识别=》同义词识别