Link Search Menu Expand Document Documentation Menu

词干提取

词干提取是将词语简化为其根形式或基本形式(称为词干)的过程。这项技术确保在搜索操作期间,词语的不同变体能够匹配。例如,单词“running”、“runner”和“ran”都可以简化为词干“run”,从而允许对这些术语的任何搜索都能返回相关结果。

在自然语言中,词语通常由于动词变位、复数形式或派生而以各种形式出现。词干提取通过以下方式改进搜索操作:

  • 提高搜索召回率:通过将不同词形匹配到共同的词干,词干提取增加了检索到的相关文档数量。
  • 减小索引大小:只存储词语的词干版本可以减小搜索索引的总体大小。

词干提取是使用 分析器 中的词元过滤器配置的。一个分析器包括以下组件:

  1. 字符过滤器:在分词之前修改字符流。
  2. 分词器:将文本拆分为词元(通常是单词)。
  3. 词元过滤器:在分词之后修改词元,例如,应用词干提取。

使用内置词元过滤器进行词干提取的示例

要实现词干提取,您可以配置一个内置词元过滤器,例如 porter_stemkstem 过滤器。

Porter 词干提取算法 是一种常用于英语的算法词干提取器。

使用自定义分析器创建索引

以下示例请求创建一个名为 my_stemming_index 的新索引,并使用 porter_stem 词元过滤器配置分析器:

PUT /my_stemming_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_stemmer_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "porter_stem"
          ]
        }
      }
    }
  }
}

此配置包括以下内容:

  • standard 分词器根据词边界将文本拆分为词元。
  • lowercase 过滤器将所有词元转换为小写。
  • porter_stem 过滤器将词语简化为其根形式。

测试分析器

要检查词干提取操作,请使用先前配置的自定义分析器分析示例文本:

POST /my_stemming_index/_analyze
{
  "analyzer": "my_stemmer_analyzer",
  "text": "The runners are running swiftly."
}

响应包含生成的词元

{
  "tokens": [
    {
      "token": "the",
      "start_offset": 0,
      "end_offset": 3,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "runner",
      "start_offset": 4,
      "end_offset": 11,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "ar",
      "start_offset": 12,
      "end_offset": 15,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "run",
      "start_offset": 16,
      "end_offset": 23,
      "type": "<ALPHANUM>",
      "position": 3
    },
    {
      "token": "swiftli",
      "start_offset": 24,
      "end_offset": 31,
      "type": "<ALPHANUM>",
      "position": 4
    }
  ]
}

词干提取器类别

您可以配置属于以下两个类别的词干提取器:

算法词干提取器

算法词干提取器应用预定义规则,系统地从单词中剥离词缀(前缀和后缀),将其简化为词干。以下词元过滤器使用算法词干提取器:

  • porter_stem:应用 Porter 词干提取算法,去除常见后缀并将单词简化为词干。例如,“running”变为“run”。

  • kstem:一个为英语设计的轻量级词干提取器,它结合了算法词干提取和内置字典。它将复数简化为单数,将动词时态转换为其基本形式,并删除常见的派生词尾。

  • stemmer:为多种语言(包括英语)提供算法词干提取,并提供 light_englishminimal_englishporter2 等不同词干提取算法选项。

  • snowball:应用 Snowball 算法,为多种语言(包括英语、法语、德语等)提供高效准确的词干提取。

字典词干提取器

字典词干提取器依靠庞大的字典将单词映射到其根形式,有效处理不规则单词的词干提取。它们会在预编译列表中查找每个单词以找到其对应的词干。此操作资源消耗更大,但对于不规则单词以及词干相似但含义迥异的单词,通常能获得更好的结果。

字典词干提取器最突出的例子是 hunspell 词元过滤器,它使用 Hunspell——一个在许多开源应用程序中使用的拼写检查引擎。

注意事项

选择词干提取器时,请注意以下几点:

  • 当处理速度和内存效率是优先考虑因素,并且语言具有相对规则的形态模式时,算法词干提取器是合适的。
  • 当处理不规则词形的准确性至关重要,并且有可用资源支持增加的内存使用和处理时间时,字典词干提取器是理想的选择。

额外的词干提取配置

尽管“organize”和“organic”共享一个共同的语言词根,导致词干提取器都生成“organ”,但它们的概念差异显著。在实际搜索场景中,这种共享词根可能导致搜索结果返回不相关的匹配。

您可以通过以下方法解决这些挑战:

  • 显式词干提取覆盖:您可以通过定义特定的词干提取规则,而不是仅仅依赖算法词干提取。使用 stemmer_override 可以确保“organize”保持不变,而“organic”被简化为“organ”。这提供了对词语最终形式的精细控制。

  • 关键词保留:为保持重要词语的完整性,您可以使用 keyword_marker 词元过滤器。此过滤器将特定单词指定为关键词,阻止后续的词干提取器对其进行更改。在此示例中,您可以将“organize”标记为关键词,确保它按原样被索引。

  • 条件词干提取控制条件 词元过滤器使您能够建立规则,以确定一个词元是否应进行词干提取。这些规则可以基于各种标准,例如词元是否存在于预定义列表中。

  • 特定语言的词元排除:对于内置的语言分析器,stem_exclusion 参数提供了一种指定应豁免词干提取的单词的方法。例如,您可以将“organize”添加到 stem_exclusion 列表中,从而阻止分析器对其进行词干提取。这对于在给定语言中保留特定词语的独特含义很有用。