英语形态分词器

英语形态分词器 #

英语形态分词器(english_morphology)专为处理复杂的英语文本而设计。与仅执行简单算法剪裁的常规分词器不同, 它基于 词形还原(Lemmatization)技术,能够精准识别英语词汇的形态变化,并将其还原为词典中的标准原型。

这确保了用户在搜索单词的不同形态(如动词时态 ran/running、名词单复数 foxes/fox、或不规则变化 feet/foot)时,能够实现精准的跨形态匹配。

该分词器由以下词元生成器和词元过滤器组成:

  • 标准(standard)词元生成器:去除大部分标点符号,并依据空格和其他常见分隔符对文本进行分割。
  • 小写(lowercase)词元过滤器:将所有词元转换为小写,以确保匹配时不区分大小写。
  • 英语形态(english_morphology)词元过滤器:执行英语词汇的形态分析,将动词的时态、形容词的比较级以及名词的复数形式映射到其唯一的语义原型。

安装 #

英语形态分词器包含在Morphological Analysis插件中。此插件已包含在Easysearch的bundle包中。

analysis-morphology插件安装命令如下:

bin/easysearch-plugin install analysis-morphology

参考样例 #

以下命令创建一个名为 my_morphology_index 的索引,并为 my_field 字段配置俄语形态分词器的索引:

PUT /my_morphology_index
{
  "mappings": {
    "properties": {
      "my_field": {
        "type": "text",
        "analyzer": "english_morphology"
      }
    }
  }
}

配置自定义分词器 #

在生产环境中,为了兼顾性能和准确度,建议定义一个包含小写化形态还原停用词过滤的自定义分析器:

PUT /my_custom_morphology_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "english_morphology",
            "stop"
          ]
        }
      }
    }
  }
}

产生的词元 #

通过形态分析,不同的词形会被索引为相同的词元。

以下请求用来检查分词器生成的词元:

POST /my_morphology_index/_analyze
{
  "analyzer": "english_morphology",
  "text": "A runner was running."
}

返回内容中包含了产生的词元:

{
  "tokens": [
    { "token": "a", "start_offset": 0, "end_offset": 1, "type": "<ALPHANUM>", "position": 0 },
    { "token": "run", "start_offset": 2, "end_offset": 8, "type": "<ALPHANUM>", "position": 1 },
    { "token": "runner", "start_offset": 2, "end_offset": 8, "type": "<ALPHANUM>", "position": 1 },
    { "token": "be", "start_offset": 9, "end_offset": 12, "type": "<ALPHANUM>", "position": 2 },
    { "token": "running", "start_offset": 13, "end_offset": 20, "type": "<ALPHANUM>", "position": 3 },
    { "token": "run", "start_offset": 13, "end_offset": 20, "type": "<ALPHANUM>", "position": 3 }
  ]
}

返回结果分析 #

英语形态分词器能够识别单词的派生关系及动词时态,并同时索引多个相关的原型词元:

原始单词产生的词元(原型)说明
runnerrunner, run派生名词还原:既保留独立名词,又关联到动词词根 run。
wasbe不规则动词还原:将助动词 was 还原为原形 be。
runningrunning, run多重形态识别:索引独立名词形式及动词 run 的分词形式。

与常规分词器的区别 #

在 Elasticsearch 中,处理英语通常有两种主流方式:一种是基于 词干提取(Stemming) 的常规分词器(如 english analyzer), 另一种是基于 词形还原(Lemmatization) 的形态分词器(如 analysis-morphology 插件)。

特性常规分词器 (基于Stemming)形态分词器 (基于Lemmatization)
处理方式启发式剪裁:根据算法(如Porter Stemmer) 剥离后缀(如-ing,-ed,-s)词典比对:通过内置词典查找单词的真实词源 (Lemma)
结果准确性较低。容易产生非单词的词根(如 universal 变为 univers)极高。始终返回具有语义的真实单词 (如saw还原为see或saw)
过度匹配常见。可能会将 organization 和 organ 还原为同一词根造成误报极少。基于语法和词典,严格区分语义
性能消耗极低。算法简单,计算速度极快较高。需要加载和检索词典,内存和 CPU 消耗略大

演示 #

具体地展示了英语形态分词器的工作原理和使用方法的脚本,详见 俄语形态分词器