whitespace分词中文(white的过去分词)

http://www.itjxue.com  2023-01-25 19:06  来源:未知  点击次数: 

ElasticSearch 分词器,了解一下

这篇文章主要来介绍下什么是 Analysis ,什么是分词器,以及 ElasticSearch 自带的分词器是怎么工作的,最后会介绍下中文分词是怎么做的。

首先来说下什么是 Analysis:

顾名思义,文本分析就是 把全文本转换成一系列单词(term/token)的过程 ,也叫 分词 。在 ES 中,Analysis 是通过 分词器(Analyzer) 来实现的,可使用 ES 内置的分析器或者按需定制化分析器。

举一个分词简单的例子:比如你输入 Mastering Elasticsearch ,会自动帮你分成两个单词,一个是 mastering ,另一个是 elasticsearch ,可以看出单词也被转化成了小写的。

再简单了解了 Analysis 与 Analyzer 之后,让我们来看下分词器的组成:

分词器是专门处理分词的组件,分词器由以下三部分组成:

同时 Analyzer 三个部分也是有顺序的,从图中可以看出,从上到下依次经过 Character Filters , Tokenizer 以及 Token Filters ,这个顺序比较好理解,一个文本进来肯定要先对文本数据进行处理,再去分词,最后对分词的结果进行过滤。

其中,ES 内置了许多分词器:

接下来会对以上分词器进行讲解,在讲解之前先来看下很有用的 API: _analyzer API :

它可以通过以下三种方式来查看分词器是怎么样工作的:

再了解了 Analyzer API 后,让我们一起看下 ES 内置的分词器:

首先来介绍下 Stamdard Analyzer 分词器:

它是 ES 默认的分词器 ,它会对输入的文本 按词的方式进行切分 ,切分好以后会进行 转小写 处理, 默认的 stopwords 是关闭的 。

下面使用 Kibana 看一下它是怎么样进行工作的,在 Kibana 的开发工具(Dev Tools)中指定 Analyzer 为 standard ,并输入文本 In 2020, Java is the best language in the world. ,然后我们运行一下:

运行结果如下:

可以看出是按照空格、非字母的方式对输入的文本进行了转换,比如对 Java 做了转小写,对一些停用词也没有去掉,比如 in 。

其中 token 为分词结果; start_offset 为起始偏移; end_offset 为结束偏移; position 为分词位置。

下面来看下 Simple Analyzer 分词器:

它只包括了 Lower Case 的 Tokenizer ,它会按照 非字母切分 , 非字母的会被去除 ,最后对切分好的做 转小写 处理,然后接着用刚才的输入文本,分词器换成 simple 来进行分词,运行结果如下:

从结果中可以看出,数字 2020 被去除掉了,说明非字母的的确会被去除,所有的词也都做了小写转换。

现在,我们来看下 Whitespace Analyzer 分词器:

它非常简单,根据名称也可以看出是 按照空格进行切分 的,下面我们来看下它是怎么样工作的:

可以看出,只是按照空格进行切分, 2020 数字还是在的, Java 的首字母还是大写的, , 还是保留的。

接下来看 Stop Analyzer 分词器:

它由 Lowe Case 的 Tokenizer 和 Stop 的 Token Filters 组成的,相较于刚才提到的 Simple Analyzer ,多了 stop 过滤,stop 就是会把 the , a , is 等修饰词去除,同样让我们看下运行结果:

可以看到 in is the 等词都被 stop filter 过滤掉了。

接下来看下 Keyword Analyzer :

它其实不做分词处理,只是将输入作为 Term 输出,我们来看下运行结果:

我们可以看到,没有对输入文本进行分词,而是直接作为 Term 输出了。

接下来看下 Pattern Analyzer :

它可以通过 正则表达式的方式进行分词 ,默认是用 \W+ 进行分割的,也就是非字母的符合进行切分的,由于运行结果和 Stamdard Analyzer 一样,就不展示了。

ES 为不同国家语言的输入提供了 Language Analyzer 分词器,在里面可以指定不同的语言,我们用 english 进行分词看下:

可以看出 language 被改成了 languag ,同时它也是有 stop 过滤器的,比如 in , is 等词也被去除了。

最后,让我们看下中文分词:

中文分词有特定的难点,不像英文,单词有自然的空格作为分隔,在中文句子中,不能简单地切分成一个个的字,而是需要分成有含义的词,但是在不同的上下文,是有不同的理解的。

比如以下例子:

那么,让我们来看下 ICU Analyzer 分词器,它提供了 Unicode 的支持,更好的支持亚洲语言!

我们先用 standard 来分词,以便于和 ICU 进行对比。

运行结果就不展示了,分词是一个字一个字切分的,明显效果不是很好,接下来用 ICU 进行分词,分词结果如下:

可以看到分成了 各国 , 有 , 企业 , 相继 , 倒闭 ,显然比刚才的效果好了很多。

还有许多中文分词器,在这里列举几个:

IK :

jieba :

THULAC :

大家可以自己安装下,看下它中文分词效果。

本文主要介绍了 ElasticSearch 自带的分词器,学习了使用 _analyzer API 去查看它的分词情况,最后还介绍下中文分词是怎么做的。

五、ES的分词

可以看到中文字符串的都拆成了一个个字;

还有一种我们可以查询文档中某一个属性的拆分分析

并且不论大小写都会转换成小写

还有一种非标准的分词器,"analyzer":"simple",这种分词器可以将非字母的都给拆分开来。

"analyzer":"whitespace",这种分词器可以以空格来拆分词语。

"analyzer":"stop",这种分词器可以去掉一些无意义的单词;

"analyzer":"keyword",这种分词器可以把字符串当成一个整体,不会进行详细的进一步拆分。

ES(六) ElasticSearch搜索原理

关于ES的搜索,小白暂且简单的归纳如下:

? ? 新增文档时涉及分词、构建索引

????查询时涉及分词、查询索引、相关度评分

那么接下来,小白就从分词、索引、相关度评分三个方面开始瞎掰了...

????分词是指将文本转换成一系列单词(term or token)的过程,也可以叫做文本分析,在es里面称为Analysis。

? ? 分词机制:

? ? ? ? Character Filter:对原始文本进行处理,例如 去除html标签、替换字符等

? ? ? ? Tokenizer:将原始文本进行分词,例如 小白最帅 = 小白,最,帅

? ? ? ? Token Filters:分词后的关键字进行加工,例如?转小写、删除语气词、近义词和同义词等

????????在进行Tokenizer之前对对原始文本进行处理,例如 去除html标签、替换字符等

????????不过进行处理后,会影响后续Tokenizer解析的position和offset

????????HTML Strip? ? ? ? ?=????去除html标签和转换html实体

? ??????Mapping? ? ? ? ? ? ?=????字符串替换操作

? ??????Pattern Replace =????正则匹配替换

? ??????将原始文本进行分词,例如 小白最帅 = 小白,最,帅

? ??????Elasticsearch自带的分词器:

? ? ? 【分词器(Analyzer)】? ? ? ? ? ? 【特点】

????????standard(es默认)? ? ????? ? ????????支持多语言,按词切分并做小写处理

????????simple? ? ? ? ? ? ? ? ? ? ? ? ? ????????????????按照非字母切分,小写处理

????????whitespace? ? ? ? ? ? ? ? ? ????????????????按照空格来切分

????????stop? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????去除语气助词,如the、an、的、这等

? ? ? ? keyword? ? ? ? ? ? ? ? ? ? ? ?????????????????不分词

????????pattern? ? ? ? ? ? ? ? ? ? ? ? ?????????????????正则分词,默认\w+,即非字词符号做分割符

? ? ? ? language? ? ? ? ? ? ? ? ? ? ?????????????????常见语言的分词器(30+)

? ? ? ? 常见中文分词器:

? ? ? 【名称】? ? ? ? ? ? 【介绍】? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?【特点】

????????IK? ? ? ? ? ? ?实现中英文单词切分? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?自定义词库?

????????

????????Jieba????????python流行分词系统,支持分词和词性标注? ? ?支持繁体、自定义、并行分词

????????

????????Hanlp????????由一系列模型于算法组成的java工具包????????????普及自然语言处理在生产中应用

????????

????????THULAC????清华大学中文词法分析工具包? ? ? ? ? ? ? ? ? ? ? ? ?具有中文分词和词性标注功能

? ? ? ?

? ??????分词后的关键字进行加工,例如?转小写、删除语气词、近义词和同义词等

? ? ? ? lowercase? ? =? ?将所有term转换为小写

????????stop? ? ? ? ?????=???删除stop words

????????ngram? ? ? ? ? =? ?和Edge NGram连词分割

? ? ? ? synonym? ? ? =???添加近义词的term

? ? 提到ES中的索引,就算没用过,估计也听过,就是倒排索引,当然ES中不可能不涉及正排索引。

? ? 通俗地来讲,正排索引是通过key找value,倒排索引则是通过value找key。举个例子,如果要查找图书馆中名为【水浒传】的书籍时,提前建立正排索引会提高查询效率;如果要查找图书馆中所有包含词语【英雄】的书籍时,提前建立倒排索引会提高查询效率,而正排索引需要遍历所有的书籍内容。

? ? 记录文档id到文档内容or单词的关联关系,比如:

? ? 【DocId】? ? ? ? ? ? ? ? ? ?【content】

? ? ? ? ? ? 1? ? ? ? ? ? =? ? ? ? ?小白最帅(小白、最、帅)

? ? ? ? ? ? 2? ? ? ? ? ? =? ? ? ? ?小黑最帅(小黑、最、帅)

? ? ? ? ? ? 3? ? ? ? ? ? =? ? ? ? ?拳打小白(拳打、小白)

? ? 备注:IK分词器中提供了两个分词算法 ik_smart 和 ik_max_word

? ? ? ? ? ? ? ?其中 ik_smart 为最少切分,ik_max_word为最细粒度划分

? ? ? ? ? ? ? ?本小节分词采用的是?ik_smart

????记录单词到文档id的关联关系,包含:

? ? ? ? 1、Term DicTionary(单词词典):记录所有文档的单词,一般比较大

? ? ? ? 2、Posting List(倒排链表):记录单词倒排列表的关联信息

? ? 以第1节中文档【小白最帅】和【拳打小白】中的【小白】为例:

????????Term DicTionary:小白

? ??????Posting List:

? ? ? ? 【DocId】? ? ? ? ? 【TF】? ? ? ? 【Position】? ? ? ?【Offset】

? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ? ?1? ? ? ? ? ? ? ? ? ? ? 0? ? ? ? ? ? ? ? ? ?0-2

? ? ? ? ? ? ? ? 3? ? ? ? ? ? ? ? ? ? ?1? ? ? ? ? ? ? ? ? ? ? 1? ? ? ? ? ? ? ? ? ?2-4

????????DocId:文档id,指向文档的原始信息? ? ? ? ? ? ? ? ? ? ? ? ? ?

????????TF:单词频率,记录该词在文档中出现的次数,用于后续相关性评分

????????Position:位置,记录文档中字段分词后,单词所在的位置,从0开始

????????Offset:偏移量,记录单词在文档中开始和结束位置,用于高亮显示等,从0开始

? ? ? ? 不是很恰当的说,索引的建立,标志着key的创建,再让key和value之间建立联系,就可以让原本直接查找value,变成了先去查找key,再直接定位到对应的value,属于典型的空间换时间或者说是先栽树、再乘凉。

? ? ? ? 下面这个数据结构图,不管是java开发还是大数据开发,估计都看烂了。。。

? ? ? ? 备注:每个文档字段都有自己的倒排索引

? ??相关性描述的是“语句”与“某个文档”匹配的程度。ES 会对每个匹配查询的结果进?计算,得出_score,_score 的评分越高,相关度就越高,那这个计算就需要一个算法。在ES5之前默认的算法是TF/IDF,ES5之后默认采用的是BM25,BM25是对TF/IDF的改进,所以这里小白直接以BM25为主来叨叨。

? ? 在进行相关度计算之前,会先有一个过程叫Boolean Model,之后再使用TFNORM/IDF算法。

? ? ? ? 简单来说,Boolean Model就是根据查询条件,对文档进行一个快速的筛选,不涉及相关度计算。

? ??????即词频长度(Term Frequency Norm),单个term在文档中出现的频率,并结合字段长度,出现次数越高,字段长度越低,分越高

????????计算公式:

????????tfNorm(t in d) = (freq * (k1 + 1)) / (freq + k1 * (1 - b + b * fieldLength / avgFieldLength))

????????freq:term出现频率

????????k1? :这个参数控制着词频结果在词频饱和度中的上升速度 。 默认值为1.2。值越小饱和度变化越快,值越大饱和度变化越慢

????????b? ? :这个参数控制着字段长归一值所起的作用 , 0.0会禁用归一化,1.0会启用完全归一化。默认值为0.75

????????fieldLength:字段长度

????????avgFieldLength:平均字段长度

? ??????即逆向文档频率(inversed document frequency),单个term在所有文档里出现的频率,出现次数越高,分越低。

????????计算公式:

????????idf(t) = log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5))

????????docCount :索引中文档数量

????????docFreq? ?:包含该词的文档数

? ? ? ? 此公式将出现频率较高的词的得分降低。比如,“的”、“了”等词语在各文档中出现频率较高,但是并没有太大的参考意义,所以降低其得分。

? ? ? ? 然后,将上面两个算法的得分相乘,则是一个term的最终得分。

? ? ? ? 单个term:_score(单) = idf(t) * tfNorm(t in d)

? ? ? ? 多个term:_score(多) = 多个_score(单)的和

? ? 最后,我们在Kibana中通过explain查询语句来看一哈【所用索引和数据为下一节中的内容】:

ES(五) ElasticSearch+Kibana+IK 安装—ES集群 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ES(七) Demo-商品搜索

ES自定义分词器

es的分词器往往包括3个低级构建块包:

Standard Analyzer

标准分析仪按照Unicode文本分段算法的定义,将文本分割成单词边界的分词。它删除了大多数标点符号,小写显示分词,并支持删除stop words。

Simple Analyzer

当遇到不是字母的字符时,简单的分析器会将文本分成条目。小写显示分词。

Whitespace Analyzer

空格分析器遇到任何空格字符时都会将文本分为多个项目。不会把分词转换为小写字母。

Stop Analyzer

停止分析仪和Simple Analyzer类似,但也支持stop words的删除。

Keyword Analyzer

一个“noop”分析器,它可以接受任何给定的文本,并输出完全相同的文本作为一个单词。

Pattern Analyzer

使用正则表达式拆分分词,支持lower-casing和stop words。

Language Analyzers

Elasticsearch提供许多语言特定的分析器,如英语或法语。

Fingerprint Analyzer

一个专门的分析仪,它可以创建一个可用于重复检测的指纹。

对中文文本以英文逗号作为分隔符分词:

将分析器设置到索引上

获取分词结果

es 节点层面的默认分词设置已经废弃,不支持了。就是说在 elasticsearch.yml 配置诸如:

无效,会导致es启动失败:

推荐在索引层面动态设置。

Elasticsearch Analyzer详解

Elasticsearch 中文本分析Analysis是把全文本转换成一系列的单词(term/token)的过程,也叫分词。文本分析是使用分析器 Analyzer 来实现的,Elasticsearch内置了分析器,用户也可以按照自己的需求自定义分析器。

为了提高搜索准确性,除了在数据写入时转换词条,匹配 Query 语句时候也需要用相同的分析器对查询语句进行分析。

Analyzer 的组成

Analyzer 由三部分组成:Character Filters、Tokenizer、Token Filters

Character Filters

Character Filters字符过滤器接收原始文本text的字符流,可以对原始文本增加、删除字段或者对字符做转换。 一个Analyzer 分析器可以有 0-n 个按顺序执行的字符过滤器。

Tokenizer

Tokenizer 分词器接收Character Filters输出的字符流,将字符流分解成的那个的单词,并且输出单词流。例如空格分词器会将文本按照空格分解,将 "Quick brown fox!" 转换成 [Quick, brown, fox!]。分词器也负责记录每个单词的顺序和该单词在原始文本中的起始和结束偏移 offsets 。

一个Analyzer 分析器有且只有 1个分词器。

Token Filters

Token Filter单词过滤器接收分词器 Tokenizer 输出的单词流,可以对单词流中的单词做添加、移除或者转换操作,例如 lowercase token filter会将单词全部转换成小写,stop token filter会移除 the、and 这种通用单词,synonym token filter会往单词流中添加单词的同义词。

Token filters不允许改变单词在原文档的位置以及起始、结束偏移量。

一个Analyzer 分析器可以有 0-n 个按顺序执行的单词过滤器。

Elasticsearch内置的分词器

Standard Analyzer - 默认分词器,按词切分,小写处理

Simple Analyzer - 按照非字母切分(符号被过滤),小写处理

Stop Analyzer - 小写处理,停用词过滤(the ,a,is)

Whitespace Analyzer - 按照空格切分,不转小写

Keyword Analyzer - 不分词,直接将输入当做输出

Patter Analyzer - 正则表达式,默认 \W+

Language - 提供了 30 多种常见语言的分词器

常用的插件分词器

IK Analyzer - 对中文分词友好,支持远程词典热更新,有ik_smart 、ik_max_word 两种分析器

pinyin Analyzer - 可以对中文进行拼音分析,搜索时使用拼音即可搜索出来对应中文

ICU Analyzer - 提供了 Unicode 的支持,更好的支持亚洲语言

hanLP Analyzer - 基于NLP的中文分析器

(责任编辑:IT教学网)

更多

推荐安全产品文章