词干提取
词干提取是将词语简化为其根形式或基本形式(称为词干)的过程。这项技术确保在搜索操作期间,词语的不同变体能够匹配。例如,单词“running”、“runner”和“ran”都可以简化为词干“run”,从而允许对这些术语的任何搜索都能返回相关结果。
在自然语言中,词语通常由于动词变位、复数形式或派生而以各种形式出现。词干提取通过以下方式改进搜索操作:
- 提高搜索召回率:通过将不同词形匹配到共同的词干,词干提取增加了检索到的相关文档数量。
- 减小索引大小:只存储词语的词干版本可以减小搜索索引的总体大小。
词干提取是使用 分析器 中的词元过滤器配置的。一个分析器包括以下组件:
- 字符过滤器:在分词之前修改字符流。
- 分词器:将文本拆分为词元(通常是单词)。
- 词元过滤器:在分词之后修改词元,例如,应用词干提取。
使用内置词元过滤器进行词干提取的示例
要实现词干提取,您可以配置一个内置词元过滤器,例如 porter_stem
或 kstem
过滤器。
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_english
、minimal_english
和porter2
等不同词干提取算法选项。 -
snowball
:应用 Snowball 算法,为多种语言(包括英语、法语、德语等)提供高效准确的词干提取。
字典词干提取器
字典词干提取器依靠庞大的字典将单词映射到其根形式,有效处理不规则单词的词干提取。它们会在预编译列表中查找每个单词以找到其对应的词干。此操作资源消耗更大,但对于不规则单词以及词干相似但含义迥异的单词,通常能获得更好的结果。
字典词干提取器最突出的例子是 hunspell
词元过滤器,它使用 Hunspell——一个在许多开源应用程序中使用的拼写检查引擎。
注意事项
选择词干提取器时,请注意以下几点:
- 当处理速度和内存效率是优先考虑因素,并且语言具有相对规则的形态模式时,算法词干提取器是合适的。
- 当处理不规则词形的准确性至关重要,并且有可用资源支持增加的内存使用和处理时间时,字典词干提取器是理想的选择。
额外的词干提取配置
尽管“organize”和“organic”共享一个共同的语言词根,导致词干提取器都生成“organ”,但它们的概念差异显著。在实际搜索场景中,这种共享词根可能导致搜索结果返回不相关的匹配。
您可以通过以下方法解决这些挑战:
-
显式词干提取覆盖:您可以通过定义特定的词干提取规则,而不是仅仅依赖算法词干提取。使用
stemmer_override
可以确保“organize”保持不变,而“organic”被简化为“organ”。这提供了对词语最终形式的精细控制。 -
关键词保留:为保持重要词语的完整性,您可以使用
keyword_marker
词元过滤器。此过滤器将特定单词指定为关键词,阻止后续的词干提取器对其进行更改。在此示例中,您可以将“organize”标记为关键词,确保它按原样被索引。 -
条件词干提取控制:条件 词元过滤器使您能够建立规则,以确定一个词元是否应进行词干提取。这些规则可以基于各种标准,例如词元是否存在于预定义列表中。
-
特定语言的词元排除:对于内置的语言分析器,
stem_exclusion
参数提供了一种指定应豁免词干提取的单词的方法。例如,您可以将“organize”添加到stem_exclusion
列表中,从而阻止分析器对其进行词干提取。这对于在给定语言中保留特定词语的独特含义很有用。