自然语言处理 (NLP) 和自然语言理解 (NLU) 是两种经常被混淆的技术,它们使搜索更加智能,并确保人们可以搜索并找到他们想要的东西。
这种智能是语义搜索的核心组成部分。
NLP 和 NLU 是您可以输入“dresses”并找到备受追捧的“NYE Party Dress”的原因,也是您可以输入“Matthew McConnahey”并让 McConnaughey 先生回来的原因。
使用这两种技术,搜索者可以找到他们想要的内容,而无需完全按照在页面或产品中找到的查询输入。
NLP 是具有如此重大意义的事物之一,以至于很容易忽略它确切地告诉您它是什么的事实:NLP 处理自然语言,特别是处理成计算机可以理解的格式。
这些类型的处理可以包括规范化、拼写更正或词干提取等任务,我们将更详细地研究其中的每一个。
另一方面,NLU 旨在“理解”自然语言块正在交流什么。
例如,它执行的任务可以识别句子中的动词和名词或文本中的重要项目。然后,人们或程序可以使用此信息来完成其他任务。
计算机看起来很先进,因为它们可以在短时间内完成很多动作。然而,在很多方面,计算机都是相当愚蠢的。
他们需要以特定的方式构建信息以构建信息。对于自然语言数据,这就是 NLP 的用武之地。
它需要杂乱的数据(自然语言可能非常杂乱)并将其处理成计算机可以使用的东西。
文本规范化
当搜索者在搜索栏中输入文本时,他们是在尝试找到一个好的匹配项,而不是在“猜测格式”。
例如,要求用户以与记录中的匹配词完全相同的格式键入查询,这是不公平且没有效率的。
我们使用文本规范化来消除此要求,以便文本无论来自何处都将采用标准格式。
当我们经历不同的标准化步骤时,我们会看到没有每个人都遵循的方法。每个归一化步骤通常会增加召回率并降低精度。
顺便说一句:“召回”意味着搜索引擎会找到已知好的结果。
精确意味着搜索引擎只能找到好的结果。
通过返回索引中的每个文档,搜索结果可能具有 100% 的召回率,但精度会很差。
相反,搜索引擎可以通过仅返回它知道非常合适的文档来实现 100% 的召回率,但坐下来可能会错过一些好的结果。
同样,归一化通常会增加召回率并降低精度。
向召回精度谱的一端移动是否有价值取决于用例和搜索技术。这不是应用所有归一化技术的问题,而是决定哪些技术可以提供精确度和召回率的最佳平衡。
字母规范化
您可以想象的最简单的规范化将是处理字母大小写。
至少在英语中,单词通常在句子的开头大写,偶尔在标题中以及当它们是专有名词时。(也有其他规则,取决于你问谁。)
但在德语中,所有名词都大写。其他语言有自己的规则。
这些规则很有用。否则,我们不会跟随他们。
例如,将句子的第一个单词大写有助于我们快速查看句子的开头。
然而,这种有用性在信息检索环境中被削弱了。
单词的含义不会仅仅因为它们在标题中并且首字母大写而改变。
更棘手的是,有规则,然后是人们实际写作的方式。
如果我给我妻子发短信,“有人撞了我们的车!” 我们都知道我说的是汽车,而不是不同的东西,因为这个词是大写的。
通过反思有多少人在非正式交流时不使用大写字母,我们可以清楚地看到这一点——顺便说一句,这就是大多数情况规范化的工作方式。
当然,我们知道有时大写确实会改变单词或短语的含义。我们可以看到“猫”是动物,“猫”是音乐剧。
然而,在大多数情况下,由于没有对案例进行归一化而提高的精度会被召回率的大幅降低所抵消。
两者之间的区别也很容易通过上下文来分辨,我们将能够通过自然语言理解来利用它。
虽然在英语中不太常见,但处理变音符号也是字母规范化的一种形式。
变音符号是附加在字母上的标记或“字形”,如 á、ë 或 ç。
单词可以以其他方式拼写相同,但添加变音符号可以改变含义。在法语中,“élève”的意思是“学生”,而“élevé”的意思是“高尚的”。
尽管如此,很多人在搜索时不会包含变音符号,因此另一种形式的规范化是去除所有变音符号,留下简单的(现在是模棱两可的)“eleve”。
代币化
下一个规范化挑战是分解搜索者在搜索栏中输入的文本和文档中的文本。
此步骤是必要的,因为查询和文档文本之间的词序不需要完全相同,除非搜索者将查询用引号括起来。
将查询、短语和句子分解成单词似乎是一项简单的任务:只需在每个空格处分解文本即可。
这种方法很快就会出现问题。再次,让我们从英语开始。
仅在空格上分隔意味着“让我们打破这个短语!”这句话。产生我们让我们分手、分手、这个和短语!作为词。
对于搜索,我们几乎肯定不希望在“短语”一词的末尾出现感叹号。
我们是否要保留“让我们”这个缩写词还不清楚。
有些软件会进一步分解单词(“let”和“’s”),有些则不会。
有些人不会将“让我们”分解,而将“不要”分解为两部分。
这个过程称为“标记化”。
我们称之为标记化的原因现在应该很清楚了:我们最终得到的不是单词,而是离散的字符组。对于英语以外的语言来说,情况更是如此。
例如,讲德语的人可以将单词(更准确地说是“语素”,但足够接近)合并在一起以形成一个更大的单词。“狗屋”的德语单词是“Hundehütte”,其中包含“狗”(“Hund”)和“房子”(“Hütte”)的词。
几乎所有搜索引擎都会对文本进行标记,但引擎可以采取进一步的步骤来规范化标记。两种相关的方法是词干提取和词形还原。
词干和词形还原
词干提取和词形还原采用不同形式的标记并将它们分解以进行比较。
例如,使用“calculator”和“calculation”或“slowing”和“slowly”这两个词。
我们可以看到有一些明显的相似之处。
词干将一个词分解成它的“词干”,或者它所基于的词的其他变体。词干提取相当简单。你可以自己做。
“词干”的词根是什么?
您可能会猜到它是“茎”。通常,词干意味着删除前缀或后缀,如本例所示。
有多种词干算法,最流行的是自 1980 年代以来一直存在的 Porter Stemming 算法。这是一系列应用于令牌以获取词干的步骤。
词干有时会导致您无法预见的结果。
查看“carry”和“carry”这两个词,您可能会认为每个词的词干都是“carry”。
至少根据波特词干算法,实际的词干是“carri”。
这是因为词干试图比较相关的词并将词分解成尽可能小的部分,即使该部分本身不是词。
另一方面,如果您想要一个始终是可识别单词的输出,您需要词形还原。同样,有不同的词形还原器,例如使用 Wordnet 的 NLTK。
词形还原将一个标记分解为它的“引理”,或者被认为是其派生词基础的词。那么,Wordnet 中“carry”和“carry”的引理就是我们之前所期望的:“carry”。
词形还原通常不会像词干分解那样分解单词,也不会在操作后将尽可能多的不同单词形式视为相同。
“say”、“says”和“saying”的词干都是“say”,而 Wordnet 中的词根是“say”、“say”和“saying”。为了得到这些引理,词形还原器通常是基于语料库的。
如果您想要尽可能广泛的回忆,您将需要使用词干提取。如果您想要尽可能高的精度,请不要使用词干提取或词形还原。
您选择哪种最终取决于您的目标,但大多数搜索通常可以很好地执行,既不进行词干提取也不进行词形还原,检索正确的结果,并且不引入噪音。
复数
如果您决定不在搜索引擎中包含词形还原或词干提取,那么您仍然应该考虑一种规范化技术。
那就是将复数规范化为单数形式。
通常,忽略复数是通过使用字典来完成的。
即使“去多元化”看起来就像砍掉一个“-s”一样简单,但情况并非总是如此。第一个问题是不规则复数形式,例如“deer”、“oxen”和“mice”。
第二个问题是带有“-es”后缀的复数形式,例如“potato”。最后,还有一些以“s”结尾但不是复数的词,比如“always”。
基于字典的方法将确保您引入召回,但不会不正确。
就像词形还原和词干提取一样,是否将复数标准化取决于您的目标。
通过规范化复数来撒下更广的网络,通过避免规范化来撒下更精确的网络。
通常,规范化复数是正确的选择,当您发现规范化对导致问题时,您可以从字典中删除它们。
然而,在处理拼写错误时,您几乎总是希望增加召回率。
错字容错和拼写检查
我们都在搜索中遇到过错字容忍和拼写检查,但考虑一下它为什么会出现是很有用的。
有时,由于手指滑落并按错键,会出现拼写错误。
其他时候,搜索者认为一个词的拼写与实际不同。
越来越多的“错别字”也可能是由于对语音到文本的理解不佳造成的。
最后,单词可能看起来有错别字,但实际上没有,例如比较“尖叫”和“奶油”。
处理这些错别字、拼写错误和变体的最简单方法是完全避免尝试纠正它们。一些算法可以比较不同的令牌。
其中之一是 Damerau-Levenshtein 距离算法。
该度量查看从一个令牌到另一个令牌需要多少次编辑。
然后,您可以过滤掉距离太高的所有标记。
(二通常是一个很好的阈值,但您可能需要根据令牌的长度来调整它。)
过滤后,您可以使用距离对结果进行排序或输入排名算法。
很多时候,在确定一个单词是否拼写错误时,上下文可能很重要。“尖叫”这个词可能在“我”之后是正确的,但在“冰”之后可能是正确的。
机器学习可以通过为这个 NLP 任务带来上下文来解决这个问题。
该拼写检查软件可以使用单词周围的上下文来识别它是否可能拼写错误以及最可能的更正。
文档中的错别字
我们之前跳过的一件事是,当用户在搜索栏中输入单词时,单词可能不仅会出现拼写错误。
文档中的单词也可能有错别字。
当文档由用户生成的内容组成时尤其如此。
这个细节是相关的,因为如果搜索引擎只查看拼写错误的查询,它会丢失一半的信息。
最好的错字容错应该适用于查询和文档,这就是为什么编辑距离通常最适合检索和排名结果。
拼写检查可用于制作更好的查询或向搜索者提供反馈,但它通常是不必要的,也不应该单独存在。
自然语言理解
NLP 是关于处理文本和自然语言的,而 NLU 是关于理解文本的。
命名实体识别
可以帮助搜索的任务是命名实体识别或 NER。NER 识别文本中的关键项目或“实体”。
虽然有些人将 NER 称为自然语言处理,而另一些人将其称为自然语言理解,但很明显,它可以在文本中找到重要的内容。
对于查询“NYE party dress”,您可能会得到一个映射到“类别”类型的“dress”实体。
NER 将始终将实体映射到类型,从“地点”或“人”等通用类型到您自己的方面一样具体。
NER 还可以使用上下文来识别实体。
查询“white house”可能指的是一个地方,而“white house paint”可能指的是“白色”的颜色和“油漆”的产品类别。
查询分类
命名实体识别在搜索中很有价值,因为它可以与构面值结合使用以提供更好的搜索结果。
回顾“白色房屋油漆”示例,您可以使用“白色”颜色和“油漆”产品类别来过滤结果,仅显示与这两个值匹配的结果。
这将为您提供高精度。
如果您不想走那么远,您可以简单地提升与这两个值之一匹配的所有产品。
查询分类也有助于回忆。
对于结果很少的搜索,您可以使用实体来包含相关产品。
想象一下,没有与关键字“白色房屋涂料”相匹配的产品。
在这种情况下,利用“油漆”产品类别可以返回其他可能是不错的替代品的油漆,例如漂亮的蛋壳色。
文档标记
命名实体识别有助于提高搜索质量的另一种方法是将任务从查询时间转移到摄取时间(将文档添加到搜索索引时)。
摄取文档时,NER 可以使用文本自动标记这些文档。
然后,搜索者将更容易找到这些文档。
搜索者使用显式过滤,或者搜索引擎应用自动查询分类过滤,以使搜索者能够使用构面值直接找到正确的产品。
意图检测
与实体识别相关的是意图检测,或确定用户想要采取的行动。
意图检测与我们所说的“识别搜索者意图”不同。
识别搜索者的意图是让人们在正确的时间找到正确的内容。
意图检测将请求映射到特定的预定义意图。
然后它会根据该意图采取行动。用户搜索“如何退货”可能会触发“帮助”意图,而“红鞋”可能会触发“产品”意图。
在第一种情况下,您可以将搜索路由到您的帮助台搜索。
在第二个中,您可以将其路由到产品搜索。这与您在 Google 上搜索天气时看到的并没有太大区别。
看,并注意到您在页面的最顶部看到了一个天气框。(新推出的网络搜索引擎 Andi 将这一概念发挥到了极致,将搜索捆绑在聊天机器人中。)
对于大多数搜索引擎而言,此处所述的意图检测不是必需的。
大多数搜索引擎一次只有一种内容类型可供搜索。
当有多种内容类型时,联合搜索可以通过在单个 UI 中同时显示多个搜索结果来出色地执行。
其他 NLP 和 NLU 任务
还有很多其他的 NLP 和 NLU 任务,但这些通常与搜索不太相关。
情绪分析等任务在某些情况下可能很有用,但搜索不是其中之一。
您可以想象使用翻译来搜索多语言语料库,但它在实践中很少发生,而且也很少需要。
问答是一项 NLU 任务,越来越多地应用于搜索,尤其是期望自然语言搜索的搜索引擎。
再一次,您可以在主要的网络搜索引擎上看到这一点。
Google、Bing 和 Kagi 都会立即回答“英国女王多大了?”这个问题。无需点击任何结果。
一些搜索引擎技术已经探索为更有限的搜索索引实施问答,但在帮助台或长的、面向行动的内容之外,使用是有限的。
很少有搜索者会去在线服装店向搜索栏提问。
总结是一个对搜索更有用的 NLU 任务。
就像使用 NER 进行文档标记一样,自动摘要可以丰富文档。摘要可用于将文档与查询进行匹配,或更好地显示搜索结果。
这种更好的显示可以帮助搜索者确信他们已经获得了良好的结果,并让他们更快地找到正确的答案。
即使包括使用图像和音频的较新的搜索技术,绝大多数搜索都是通过文本进行的。要获得正确的结果,确保搜索正在处理并理解查询和文档非常重要。
语义搜索为搜索引擎带来智能,自然语言处理和理解是重要组成部分。
NLP 和 NLU 任务(如标记化、规范化、标记、错字容错等)有助于确保搜索者不需要成为搜索专家。
相反,他们可以“自然地”快速地从需求转变为解决方案。