处理人类语言edit

“我认识这句话里的所有单词,但并不能理解全句。”

-- Matt Groening

全文搜索是一场 查准率查全率 之间的较量—查准率即尽量返回较少的无关文档,而查全率则尽量返回较多的相关文档。 尽管能够精准匹配用户查询的单词,但这仍然不够,我们会错过很多被用户认为是相关的文档。 因此,我们需要把网撒得更广一些,去搜索那些和原文不是完全匹配但却相关的单词。

难道你不期待在搜索“quick brown fox“时匹配到包含“fast brown foxed“的文档,或是搜索“Johnny Walker“时匹配到“Johnnie Walker“, 又或是搜索“Arnolt Schwarzenneger“时匹配到“Arnold Schwarzenegger“吗?

如果文档 确实 包含用户查询的内容,那么这些文档应当出现在返回结果的最前面,而匹配程度较低的文档将会排在靠后的位置。 如果没有任何完全匹配的文档,我们至少可以给用户展示一些潜在的匹配结果;它们甚至可能就是用户最初想要的结果。

以下列出了一些可优化的地方:

  • 清除类似 ´^¨ 的变音符号,这样在搜索 rôle 的时候也会匹配 role ,反之亦然。请见 归一化词元
  • 通过提取单词的词干,清除单数和复数之间的差异—foxfoxes—以及时态上的差异—jumpingjumpedjumps 。请见 将单词还原为词根
  • 清除常用词或者 停用词 ,如 theand , 和 or ,从而提升搜索性能。请见 停用词: 性能与精度
  • 包含同义词,这样在搜索 quick 时也可以匹配 fast ,或者在搜索 UK 时匹配 United Kingdom 。 请见 同义词
  • 检查拼写错误和替代拼写方式,或者 同音异型词 —发音一致的不同单词,例如 theirtheremeatmeetmete 。 请见 拼写错误

在我们可以操控单个单词之前,需要先将文本切分成单词,这也意味着我们需要知道 单词 是由什么组成的。我们将在 词汇识别 章节阐释这个问题。

在这之前,让我们看看如何更快更简单地开始。