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

devtools/2024/10/21 15:34:17/

文章目录

      • 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. 结语

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


http://www.ppmy.cn/devtools/104198.html

相关文章

一键翻译全球:2024年跨文化交流的得力助手

翻译工具作为沟通不不同语言桥梁上的重要使者&#xff0c;正在从古老的字典查阅到现代的机器翻译软件发展。今天&#xff0c;让我们一同探索与搜狗翻译工具相似的翻译工具们怎么带我们走进奇妙世界。 1.福晰翻译 链接直达>>https://www.foxitsoftware.cn/fanyi/ 这款多…

静态工厂模式(简单工厂模式)与动态工厂模式(工厂方法模式)

1. 简单工厂模式 核心是定义一个创建对象的接口&#xff0c;将对象的创建和本身的业务逻辑分离&#xff0c;降低系统的耦合度&#xff0c;使得两个修改起来相对容易些&#xff0c;当以后实现改变时&#xff0c;只需要修改工厂类即可。该模式对对象创建管理方式最为简单&#x…

HarmonyOS开发实战( Beta5版)应用性能工具CPU Profiler的使用规范

简介 本文档介绍应用性能分析工具CPU Profiler的使用方法&#xff0c;该工具为开发者提供性能采样分析手段&#xff0c;可在不插桩情况下获取调用栈上各层函数的执行时间&#xff0c;并展示在时间轴上。 开发者可通过该工具查看TS/JS代码及NAPI代码执行过程中的时序及耗时情况…

HTML静态网页成品作业(HTML+CSS)——游戏战地介绍设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

已知弧度和半径,如何确定两点之间的距离?

如果已知弧度&#xff08;通常表示为 θ&#xff09;和半径&#xff08;表示为 r&#xff09;&#xff0c;可以使用以下几何关系来确定圆弧上的两点之间的实际线性距离。 圆弧的长度&#xff08;即两点之间的距离&#xff09;可以通过以下公式计算&#xff1a; 弧长rθ 其中&a…

Zoom iOS 转录例子

一、在zoom marketplace创建通用app&#xff0c;zoom-recall 详见Zoom会议机器人转写例子-CSDN博客 二、mac下按照Xcode&#xff0c;创建APP项目meetingbot4ios 三、本实用的SDK为MobileRTC&#xff0c;即Meeting SDK的iOS版本 四、依赖如下&#xff1a; MobileRTC和Crypto…

鸿蒙启动框架配置文件(StartUpTask)

{"startupTasks": [//有哪些任务{"name": "StartupTask_001",//任务名字"srcEntry": "./ets/startup/StartupTask_001.ets",//任务的文件路径"runOnThread": "taskpool",//运行在哪个现成&#xff0c;有…

为了支持XR,3GPP R18都做了哪些增强?

这篇是R18 XR enhancement的第二篇,主要看下从NAS->L3->L2->L1针对XR都做了哪些增强。 1 PDU set QoS 在UL和DL中,XR-Awareness有助于优化gNB无线资源调度,但是这里就依赖于 PDU set和data burst。这两个东西是什么意思?其实PDU set就是由一个或多个 PDU组成,这…