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

打印 上一主题 下一主题

主题 1001|帖子 1001|积分 3005

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
0. 前言

国内企业出海是局势所趋,那么基于差异的语种进行分词就显得尤为紧张,因为这会让用户的搜索体验更棒!
国内出海企业,会更偏向于选择欧美、中东这 2 个地区。
因此本文章也重点先容英语、阿拉伯语的分词。
在 ES 中内置的分词器中,有一个叫 Language analyzers,我们可以根据该分词器,自定义出符合业务需求的特定语言分词器。
1. 英语分词器

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

  • 不区分大小写
  • 去掉英语停顿词
  • 具有相同的词干可以被以为是同一个词,例如 friends = fried
  • 可能还必要有同义词,例如 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
  1. {
  2.   "mappings": {
  3.       "properties": {
  4.       "text": {
  5.         "type": "text",
  6.         "analyzer": "my_custom_analyzer"
  7.       }
  8.     }
  9.   },
  10.   "settings": {
  11.     "analysis": {
  12.       "analyzer": {
  13.         "my_custom_analyzer": {
  14.           "tokenizer": "standard",
  15.           "filter": [
  16.             "lowercase",
  17.             "english_stop",
  18.             "english_stemmer",
  19.             "english_synonym"
  20.           ]
  21.         }
  22.       },
  23.       "filter": {
  24.         "english_stop": {
  25.           "type": "stop",
  26.           "stopwords": "_english_"
  27.         },
  28.         "english_stemmer": {
  29.           "type": "stemmer",
  30.           "language": "english"
  31.         },
  32.         "english_synonym": {
  33.           "type": "synonym",
  34.           "synonyms": [ "quick => fast" ]
  35.         }
  36.       }
  37.     }
  38.   }
  39. }
复制代码
接下来,我们验证下效果
GET test9_en/_analyze
  1. {
  2.   "analyzer": "my_custom_analyzer",
  3.   "text": "the Friends quick"
  4. }
复制代码
输出如下
  1. {
  2.   "tokens" : [
  3.     {
  4.       "token" : "friend",
  5.       "start_offset" : 4,
  6.       "end_offset" : 11,
  7.       "type" : "<ALPHANUM>",
  8.       "position" : 1
  9.     },
  10.     {
  11.       "token" : "fast",
  12.       "start_offset" : 12,
  13.       "end_offset" : 17,
  14.       "type" : "SYNONYM",
  15.       "position" : 2
  16.     }
  17.   ]
  18. }
复制代码
符合我们的预期:


  • the 是停顿词,被过滤掉
  • Friends 的词干为 friend;同时因为 lowercase token filter 的存在,大小被转换为小写了
  • quick 和 fast 是同义词
ES 内置了非常丰富的 token filter 更多可以参考 ES token filter 官网
2. 阿拉伯语分词器

阿拉伯语分词器做法和英语类似,
对于 stop token filter、stemmer token filter 均支持阿拉伯语。
在英语中,字母有大小写,而在阿拉伯语中,则存在差异字母的变形,因此我们必要将文本先做归一化处理。
这必要用到 ES 的 Normalizers。用于将文本进行归一化处理。
本质上 lowercase token filter 就是一种 Normalizers,即将全部文本都同一修改为小写
更详细的先容,参考 ES Normalizers 官网
那么其 Mapping 如下
PUT test9_alb
  1. {
  2.         "mappings": {
  3.                 "properties": {
  4.                         "text": {
  5.                                 "type": "text",
  6.                                 "analyzer": "arabic"
  7.                         }
  8.                 }
  9.         },
  10.         "settings": {
  11.                 "analysis": {
  12.                         "filter": {
  13.                                 "arabic_stop": {
  14.                                         "type": "stop",
  15.                                         "stopwords": "_arabic_"
  16.                                 },
  17.                                 "arabic_stemmer": {
  18.                                         "type": "stemmer",
  19.                                         "language": "arabic"
  20.                                 }
  21.                         },
  22.                         "analyzer": {
  23.                                 "arabic": {
  24.                                         "tokenizer": "standard",
  25.                                         "filter": [
  26.                         "arabic_normalization",
  27.                                                 "arabic_stop",
  28.                                                 "arabic_stemmer"
  29.                                         ]
  30.                                 }
  31.                         }
  32.                 }
  33.         }
  34. }
复制代码
我对阿拉伯语也不认识,这里就不进行效果验证了。
3. 结语

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表