(伦敦是英格兰的首都同时也是英国人口最大的城市,是大不列颠东南部的泰晤士河流域两千年来的主要人类定居点,由罗马人建立,取名为伦蒂尼恩 (Londinium)。
这一段话包含了一些有用的事实。如果一台电脑能阅读这篇文章,理解到伦敦是一座城市,伦敦位于英国,伦敦由罗马人定居,那就太好了。但是为了达到这个目的,我们首先必须教会计算机最基本的书面语言概念,然后基于此再逐步进行完善。
步骤 1:句子分割
流水线的第一步是把文本拆分成单独的句子,像这样:
1.「伦敦是英格兰的首都同时也是英国人口最多的城市。」
2.「位于大不列颠岛东南部的泰晤士河流域的伦敦是两千年以来的主要人类定居点。」
3.「由罗马人建立,取名为伦蒂尼恩 (Londinium)。」
我们可以假设英语中的每个句子都表达了一个独立的思想或想法。编写一个程序来理解一个句子比理解整个段落要容易得多。
编码一个句子分割模型可以很简单地在任何看到标点符号的时候拆分句子。但是,现代 NLP 流水线通常使用更为复杂的技术,以应对那些没有被格式化干净的文件。
步骤 2:词汇标记化
现在我们已经把文档分割成句子,我们可以一次处理一个。让我们从文档中的第一句话开始:
「London is the capital and most populous city of England and the United Kingdom.」
我们的下一步是把这个句子分成不同的单词或标记,这叫做标记化,下面是标记化后的结果:
「London」,「is」,「the」,「capital」,「and」,「most」,「populous」,「city」,「of」,「England」,「and」,「the」,「United」,「Kingdom」,「.」
英语中的标记化是很容易做到的。只要它们之间有空格,我们就把它们分开。我们也将标点符号当作单独的记号来对待,因为标点也是有意义的。
步骤 3:预测每个标记的词性
接下来,我们来看看每一个标记,并尝试猜测它的词类:名词,动词,形容词等等。知道每个单词在句子中的作用将帮助我们弄清楚句子的意思。
我们可以把每个单词(和它周围的一些额外的单词用于上下文)输入预先训练的词性分类模型:
词性模型最初是通过给它提供数以百万计的英语句子来训练的,每一个单词的词性都已经标注出来,并让它学会复制这种行为。
需要注意的是,这个模型完全是基于统计数据的,它并没有真正理解单词的意思(如人类所思考的一样)。它只知道如何根据相似的句子和单词来猜测词性。
在处理完整个句子之后,我们将得到这样的结果:
有了这些信息,我们就可以开始获取一些非常基本的意思了。例如,我们可以看到句子中的名词包括「伦敦」和「首都」,所以这个句子很可能说的的是关于伦敦。
步骤 4:文本词形还原
在英语(和大多数语言)中,单词以不同的形式出现。看这两个句子:
I had apony.
I had twoponies.
两个句子都是在讨论一个名词 - 小马(pony),但它们分别使用了不同的词形变化 (一个单数形式,一个复数形式)。当在计算机中处理文本时,了解每个单词的基本形式是有帮助的,这样你才知道这两个句子都在讨论同一个概念。否则,对计算机来说字串「pony」和「ponies」看起来就像两个完全不同的词汇。
在NLP 中,我们把这个过程称为词形还原——找出句子中每个单词的最基本的形式或词条。
同样也适用于动词。我们也可以通过找到它们的词根,通过词形还原来将动词转换成非结合格式。所以「I had two ponies.」变成「I [have] two [pony].」
词形还原通常是通过基于词性的词条形式的查找表来完成的,并且可能通过一些自定义规则来处理一些你从未见过的单词。
下面是词形还原加上动词的词根形式后,我们的句子变成如下:
我们唯一的改变是把「is」变成「be」。
步骤 5:识别停止词
接下来,我们要考虑句子中每个词的重要性。英语有很多填充词,它们经常出现,如「and」、「the」和「a」。当对文本进行统计时,这些词引入了大量的噪声,因为它们比其他词更频繁地出现。一些 NLP 流水线将它们标记为「停止词」,也就是说,在进行任何统计分析之前,这可能是你想要过滤掉的单词。
下面是我们将停止词变成灰色后的句子:
停止词通常通过检查已知的停止词的硬编码列表来识别。但是没有适用于所有应用程序的停止词的标准列表。要忽略的单词列表可以根据应用程序而变化。
例如,如果你正在建造一个摇滚乐队搜索引擎,你要确保你不忽略「The」这个词。因为这个词出现在很多乐队的名字中,还有一个著名的 1980 摇滚乐队叫做「The The」!
步骤 6a:依赖解析
下一步是弄清楚我们句子中的所有单词是如何相互关联的,这叫做依赖解析。
我们的目标是构建一棵树,它给句子中的每个单词分配一个单一的父词。树的根结点是句子中的主要动词。下面是我们的句子的解析树一开始的样子:
但我们可以更进一步。除了识别每个单词的父词外,我们还可以预测两个词之间存在的关系类型:
这棵解析树告诉我们,句子的主语是名词「London」,它与「capital」有「be」关系。我们终于知道了一些有用的东西——伦敦是一个首都!如果我们遵循完整的解析树的句子(除上方所示),我们甚至会发现,伦敦是英国的首都。
就像我们先前使用机器学习模型预测词性一样,依赖解析也可以通过将单词输入机器学习模型并输出结果来工作。但是解析单词的依赖项是一项特别复杂的任务,需要一篇完整的文章来详细说明。如果你想知道它是如何工作的,一个很好的开始阅读的地方是 Matthew Honnibal 的优秀文章「Parsing English in 500 Lines of Python」。
但是,尽管作者在 2015 的一篇文章中说这种方法在现在是标准的,但它实际上已经过时了,甚至不再被作者使用。在2016,谷歌发布了一个新的依赖性分析器,称为 Parsey McParseface,它使用了一种新的深度学习方法并超越了以前的基准,它迅速地遍及整个行业。一年后,他们发布了一种新的叫做 ParseySaurus 的模型,它改进了更多的东西。换句话说,解析技术仍然是一个活跃的研究领域,在不断地变化和改进。
同样需要记住的是,很多英语句子都是模棱两可的,难以解析的。在这种情况下,模型将根据该句子的解析版本进行猜测,但它并不完美,有时该模型将导致令人尴尬的错误。但随着时间的推移,我们的 NLP 模型将继续以更好的方式解析文本。
步骤 6b:寻找名词短语
到目前为止,我们把句子中的每个词都看作是独立的实体。但是有时候把代表一个想法或事物的单词组合在一起更有意义。我们可以使用依赖解析树中的相关信息自动将所有讨论同一事物的单词组合在一起。
例如:
我们可以将名词短语组合以产生下方的形式:
我们是否做这一步取决于我们的最终目标。如果我们不需要更多的细节来描述哪些词是形容词,而是想更多地关注提取完整的想法,那么这是一种快速而简单的方法。
步骤 7:命名实体识别(NER)
现在我们已经完成所有困难的工作,终于可以超越小学语法,开始真正地提取想法。
在我们的句子中,我们有下列名词:
这些名词中有一些是真实存在的。例如,「London 伦敦」、「England 英格兰」和「United Kingdom 英国」代表地图上的物理位置。很高兴能检测到这一点!利用这些信息,我们可以使用 NLP 自动提取到文档中提到的真实世界地名的列表。