将单词还原为词根
大多数语言的单词都可以 词形变化 ,意味着下列单词可以改变它们的形态用来表达不同的意思:
- 单复数变化 : fox 、foxes
- 时态变化 : pay 、 paid 、 paying
- 性别变化 : waiter 、 waitress
- 动词人称变化 : hear 、 hears
- 代词变化 : I 、 me 、 my
- 不规则变化 : ate 、 eaten
- 情景变化 : so be it 、 were it so
虽然词形变化有助于表达,但它干扰了检索,一个单一的词根 词义 (或意义)可能被很多不同的字母序列表达。英语是一种弱词形变化语言(你可以忽略词形变化并且能得到合理的搜索结果),但是一些其他语言是高度词形变化的并且需要额外的工作来保证高质量的搜索结果。
词干提取 试图移除单词的变化形式之间的差别,从而达到将每个词都提取为它的词根形式。例如 foxes
可能被提取为词根 fox
,移除单数和复数之间的区别跟我们移除大小写之间的区别的方式是一样的。
单词的词根形式甚至有可能不是一个真的单词,单词 jumping
和 jumpiness
或许都会被提取词干为 jumpi
。
这并没有什么问题—只要在索引时和搜索时产生相同的词项,搜索会正常的工作。
如果词干提取很容易的话,那只要一个插件就够了。不幸的是,词干提取是一种遭受两种困扰的模糊的技术:词干弱提取和词干过度提取。
词干弱提取 就是无法将同样意思的单词缩减为同一个词根。例如, jumped
和 jumps
可能被提取为 jump
,但是 jumping
可能被提取为 jumpi
。弱词干提取会导致搜索时无法返回相关文档。
词干过度提取 就是无法将不同含义的单词分开。例如,general
和 generate
可能都被提取为 gener
。词干过度提取会降低精准度:不相干的文档会在不需要他们返回的时候返回。
词形还原
原词是一组相关词的规范形式,或词典形式(((“lemma”))) — paying
、 paid
和 pays
的原词是 pay
。
通常原词很像与其相关的词,但有时也不像 — is
、 was
、 am
和 being
的原词是 be
。
词形还原,很像词干提取,试图归类相关单词,但是它比词干提取先进一步的是它企图按单词的 词义 ,或意义归类。 同样的单词可能表现出两种意思—例如, wake 可以表现为 to wake up 或 a funeral 。然而词形还原试图区分两个词的词义,词干提取却会将其混为一谈。
词形还原是一种更复杂和高资源消耗的过程,它需要理解单词出现的上下文来决定词的意思。实践中,词干提取似乎比词形还原更高效,且代价更低。
首先我们会讨论下两个 Elasticsearch 使用的经典词干提取器 — algorithmic-stemmers 和 dictionary-stemmers — 并且在 choosing-a-stemmer 讨论了怎么根据你的需要选择合适的词干提取器。 最后将在 controlling-stemming 和 stemming-in-situ 中讨论如何裁剪词干提取。