当前位置: 首页 > news >正文

重生之我们在ES顶端相遇第11 章 - 深入自定义语言分词器

文章目录

      • 0. 前言
      • 1. 英语分词器
      • 2. 阿拉伯语分词器
      • 3. 结语

0. 前言

国内企业出海是大势所趋,那么基于不同的语种进行分词就显得尤为重要,因为这会让用户的搜索体验更棒!

国内出海企业,会更偏向于选择欧美、中东这 2 个地区。

因此本文章也重点介绍英语、阿拉伯语的分词。

在 ES 中内置的分词器中,有一个叫 Language analyzers,我们可以根据该分词器,自定义出符合业务需求的特定语言分词器。

1. 英语分词器

英语分词器一般而言应该满足以下要求

  1. 不区分大小写
  2. 去掉英语停顿词
  3. 具有相同的词干可以被认为是同一个词,例如 friends = fried
  4. 可能还需要有同义词,例如 quick = fast

Ok,基于以上要求,我们来自定义一个英文分词器。

  • 不区分大小写,ES 有现成的 token filters: lowercase token filter
  • 去掉英语停顿词,ES 有现成的 token filters: stop token filter。并且 stop token filter 对多个语种均有支持
  • 词干提取器,ES 有现成的 token filters: stemmer token filter。并且 stemmer token filter 对多个语种均有支持
  • 同义词,ES 有现成的 token filters: synonym token filter, 不过需要我们提前定义好哪些词属于同义词。

OK,接下来,让我们看下具体的 Mapping 如何编写

PUT test9_en

{"mappings": {"properties": {"text": {"type": "text","analyzer": "my_custom_analyzer"}}},"settings": {"analysis": {"analyzer": {"my_custom_analyzer": {"tokenizer": "standard","filter": ["lowercase","english_stop","english_stemmer","english_synonym"]}},"filter": {"english_stop": {"type": "stop","stopwords": "_english_"},"english_stemmer": {"type": "stemmer","language": "english"},"english_synonym": {"type": "synonym","synonyms": [ "quick => fast" ]}}}}
}

接下来,我们验证下效果
GET test9_en/_analyze

{"analyzer": "my_custom_analyzer","text": "the Friends quick"
}

输出如下

{"tokens" : [{"token" : "friend","start_offset" : 4,"end_offset" : 11,"type" : "<ALPHANUM>","position" : 1},{"token" : "fast","start_offset" : 12,"end_offset" : 17,"type" : "SYNONYM","position" : 2}]
}

符合我们的预期:

  • the 是停顿词,被过滤掉
  • Friends 的词干为 friend;同时因为 lowercase token filter 的存在,大小被转换为小写了
  • quick 和 fast 是同义词

ES 内置了非常丰富的 token filter 更多可以参考 ES token filter 官网

2. 阿拉伯语分词器

阿拉伯语分词器做法和英语类似,
对于 stop token filterstemmer token filter 均支持阿拉伯语。

在英语中,字母有大小写,而在阿拉伯语中,则存在不同字母的变形,因此我们需要将文本先做归一化处理。

这需要用到 ES 的 Normalizers。用于将文本进行归一化处理。
本质上 lowercase token filter 就是一种 Normalizers,即将所有文本都统一修改为小写
更详细的介绍,参考 ES Normalizers 官网

那么其 Mapping 如下

PUT test9_alb

{"mappings": {"properties": {"text": {"type": "text","analyzer": "arabic"}}},"settings": {"analysis": {"filter": {"arabic_stop": {"type": "stop","stopwords": "_arabic_"},"arabic_stemmer": {"type": "stemmer","language": "arabic"}},"analyzer": {"arabic": {"tokenizer": "standard","filter": ["arabic_normalization","arabic_stop","arabic_stemmer"]}}}}
}

我对阿拉伯语也不熟悉,这里就不进行效果验证了。

3. 结语

该篇我们探讨了如何实现英语、阿拉伯语的分词器。理论上其他语种的分词器也是类似的做法。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • centos 系统yum 安装 mariadb
  • 书生大模型实战营基础(3)——LangGPT结构化提示词编写实践
  • C#基础(2)枚举
  • Linux系统安装MySQL8.0
  • ES6更新的内容中什么是proxy
  • 力扣8.29
  • React多功能管理平台项目开发全教程
  • C++ | Leetcode C++题解之第387题字符串中的第一个唯一字符
  • Go入门:gin框架极速搭建图书管理系统
  • MySQL:复合查询
  • 深度学习(二)
  • minio最新源码编译(处理安全扫描中跨域访问、.js.map等不安全问题)
  • SQLite3 数据类型深入全面讲解
  • 【PyQt】切换界面的实现
  • day-45 全排列 II
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • C++类的相互关联
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • PHP 7 修改了什么呢 -- 2
  • Python socket服务器端、客户端传送信息
  • Python打包系统简单入门
  • React的组件模式
  • Spark学习笔记之相关记录
  • use Google search engine
  • 百度小程序遇到的问题
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从零开始学习部署
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 实战|智能家居行业移动应用性能分析
  • 使用SAX解析XML
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 微信小程序设置上一页数据
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​Linux·i2c驱动架构​
  • ​香农与信息论三大定律
  • #includecmath
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (007)XHTML文档之标题——h1~h6
  • (30)数组元素和与数字和的绝对差
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (论文阅读11/100)Fast R-CNN
  • (七)Activiti-modeler中文支持
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • .NET C# 操作Neo4j图数据库
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .Net FrameWork总结
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法