本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
原形词干提取
edit原形词干提取
edit为了完整地 完成本章的内容,我们将讲解如何将已提取词干的词和原词索引到同一个字段中。举个例子,分析句子 The quick foxes jumped 将会得到以下词项:
Warning:使用此方法前请先阅读 原形词干提取是个好主意吗 。
为了归档词干提取出的 原形 ,我们将使用 keyword_repeat
过滤器,跟 keyword_marker
过滤器 ( see 阻止词干提取 ) 一样,它把每一个词项都标记为关键词,以防止后续词干提取器对其修改。但是,它依然会在相同位置上重复词项,并且这个重复的词项 是 提取的词干。
单独使用 keyword_repeat
token 过滤器将得到以下结果:
为了防止提取和未提取词干形式相同的词项中的无意义重复,我们增加了组合的 unique
语汇单元过滤器 :
PUT /my_index { "settings": { "analysis": { "filter": { "unique_stem": { "type": "unique", "only_on_same_position": true } }, "analyzer": { "in_situ": { "tokenizer": "standard", "filter": [ "lowercase", "keyword_repeat", "porter_stem", "unique_stem" ] } } } } }
设置 |
|
语汇单元过滤器必须出现在词干提取器之前。 |
|
|
原形词干提取是个好主意吗
edit用户喜欢 原形 词干提取这个主意:“如果我可以只用一个组合字段,为什么还要分别存一个未提取词干和已提取词干的字段呢?” 但这是一个好主意吗?答案一直都是否定的。因为有两个问题:
第一个问题是无法区分精准匹配和非精准匹配。本章中,我们看到了多义词经常会被展开成相同的词干词:organs
和 organization
都会被提取为 organ
。
在 使用语言分析器 我们展示了如何整合一个已提取词干属性的查询(为了增加召回率)和一个未提取词干属性的查询(为了提升相关度)。 当提取和未提取词干的属性相互独立时,单个属性的贡献可以通过给其中一个属性增加boost值来优化(参见 语句的优先级 )。相反地,如果已提取和未提取词干的形式置于同一个属性,就没有办法来优化搜索结果了。
第二个问题是,必须搞清楚 相关度分值是否如何计算的。在 什么是相关性? 我们解释了部分计算依赖于逆文档频率(IDF)—— 即一个词在索引库的所有文档中出现的频繁程度。 在一个包含文本 jump jumped jumps
的文档上使用原形词干提取,将得到下列词项:
Pos 1: (jump) Pos 2: (jumped,jump) Pos 3: (jumps,jump)
jumped
和 jumps
各出现一次,所以有正确的IDF值;jump
出现了3次,作为一个搜索词项,与其他未提取词干的形式相比,这明显降低了它的IDF值。
基于这些原因,我们不推荐使用原形词干提取。