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