蓝狮平台_蓝狮注册登录云技术中心

计算机如何理解我们的语言?NLP is fun

image.png


我们从日常每天都会用到的推荐系统到现在研究火热的开放性聊天、对话机器人,越来越多的产品与应用的背后都需要自然语言处理(NLP)和知识图谱的技术。也有越来越多的学者与工作人员投身于 NLP 领域的研究。为什么要研究NLP呢?如果计算机想要更好的理解人类的语言,拥有更好的人机交互体验,都离不开 NLP。那么,计算机到底是如何理解人类语言的?接下来让我们跟着作者 Adam Geitgey ,和他一起体会自然语言处理技术里那些有意思的事情。


计算机非常擅长处理像电子表格、数据库这样的结构化数据。但是,蓝狮登录破石应用人与人之间是用语言来交流的,而不是用表格。这对计算机来说就很倒霉了。





然而不幸的是,我们并不是生活在所有数据都是结构化的历史交替版本中


这个世界上的许多信息都是非结构化的,如英语,或者其他人类语言写成的原文。那么,如何让计算机理解这种非结构化文本并从中提取数据呢?




自然语言处理(Natural Language Processing,NLP)是人工智能的子领域之一,其重点是使计算机能够理解和处理人类语言。在本文中,我们将知晓NLP是如何工作的,并学习如何使用Python编写能够从原始文本提取信息的程序。(注:作者在文中选择的语言对象是英语)


计算机能够理解语言吗?


自从计算机问世以来,为了能够开发出可以理解语言的程序,程序员们一直在努力。为什么一定要这么做呢?理由很简单:人类运用语言已经有千年的历史,如果计算机能够读懂这些,对人们将会非常有帮助。


计算机虽然还不能像人类那样真正地理解语言,但是它们现在已经可以做很多事情了。在某些领域中,可以用NLP来做的那些事情,已经能够让人感到很神奇了。如果将NLP技术应用到你自己的项目,也许可以节省很多时间。


好消息是,NLP的最近进展可以通过开源Python库(如spaCy、textcy 和 neuralcoref)轻松访问。只需简单几行Python代码就能完事儿,这一点就很让人惊叹。


难点:从文本中提取意义


阅读和理解英语的过程是非常复杂的,尤其是考虑到是否有遵循逻辑和一致的规则。蓝狮怎么注册?例如,下面这个新闻标题是什么意思?


“Environmental regulators grill business owner over illegal coal fires.”


这新闻标题,究竟想表达什么意思呢?监管机构是否就非法燃煤的问题对企业主进行了质询?还是监管者把非法燃煤的企业主拿来烧烤了?你看,如果用计算机来解析英语的话,事情就会变得异常复杂。


在机器学习中,做任何一件复杂的事情通常意味着需要构建一个工作流。这个想法就是将你的问题分解成很小的部分,然后使用机器学习来分别解决每一个部分。然后,将几个相互作用的机器学习模型链接在一起,你就得以能够完成非常复杂的事情。


这就是我们将用在NLP的策略。我们将把理解英语的过程分解成小块,看看每个部分是如何工作的。


一步一步构建NLP工作流


我们来看一下取自维基百科上的一段文字:


London is the capital and most populous city of England and the United Kingdom. Standing on the River Thames in the south east of the island of Great Britain, London has been a major settlement for two millennia. It was founded by the Romans, who named it Londinium.


(来源维基百科词条 London)


这一段包含了几个有用的事实。如果计算机能够读懂这段文字,并理解London(伦敦)是一座城市,位于England(英格兰),由Romans(罗马人)建立的地方,那就太好了。但是要实现这一目标,就必须教会计算机学习书面语言的最基本的概念,然后再继续前进。


▌第一步:句子切分(Sentence Segmentation)


工作的第一步,是将文本切分成单独的句子。我们得到的是:


1.“London is the capital and most populous city of England and the United Kingdom.”


2.“Standing on the River Thames in the south east of the island of Great Britain, London has been a major settlement for two millennia.”


3.“It was founded by the Romans, who named it Londinium.”


我们可以假设,英语中每个句子都表达了一种独立的意思或者想法。编写程序来理解单个句子,可比理解整个段落要容易多了。


为句子切分模型编码就像你看到标点符号时对句子进行断句一样,都不是难事。但是,现代的NLP工作流通常会使用更为复杂的技术,就算文档格式不是很干净利落,也能正常工作。


▌第二步:单词标记(Word Tokenization)


现在我们已经将文本切分成了句子,这样就可以做到一次处理一个句子。就从这段文本的第一条句子开始吧:


“London is the capital and most populous city of England and the United Kingdom.”


NLP工作流中的下一步就是将这个句子切分成单独的单词或标记。这就是所谓的“标记”(Tokenization)。以下是单词标记的结果:


“London”, “is”, “ the”, “capital”, “and”, “most”, “populous”, “city”, “of”, “England”, “and”, “the”, “United”, “Kingdom”, “.”


标在英语中很容易做到。只要单词之间有空格,我们就可以将它们分开。我们还将标点符号视为单独的标记,因为标点符号也有意义。


▌第三步:预测每个标记的词性


接下来,我们将查看每个标记并试着猜测它的词性:名词、动词还是形容词等等。只要知道每个单词在句子中的作用,我们就可以开始理解这个句子在表达什么。


我们可以通过将每个单词(以及周围的一些额外单词)输入到预训练的词性分类模型来实现,如下图所示:





需要记住一点:这种模型完全基于统计数据,实际上它并不能像人类那样理解单词的含义。它只知道如何根据以前所见过的类似句子和单词来猜测词性。


在处理完整个句子后,我们会得到这样的结果,如下图所示:






有了这些信息之后,我们就可以开始收集一些非常基本的含义。比如,我们看到这个句子中的名词包括“London”和“capital”,所以可以认为这个句子可能是在说 London。



▌第四步:文本词形还原(Text Lemmatization)



在英语(以及大多数语言)中,单词是以不同的形式出现的。看看下面这两个句子:



1.I had a pony.


2.I had two ponies.



这两个句子都有名词“pony”,但是它们的词性不同。当计算机处理文本时,了解每个单词的基本形式是很有帮助的,唯有如此你才能知道这两个句子是在讨论同一个概念。否则,字符串“pony”和“ponies”在计算机看来就是两个完全不同的单词。



在NLP中,我们将发现这一过程叫“词形还原”(Lemmatization),就是找出句子中每个单词的最基本的形式或引理。



这同样也适用于动词。我们还可以通过找到动词的词根,以非共轭形式(unconjugated form)来引申动词。所以,“I had two ponies”就变成了“I [have] two [pony].”



词形还原通常是通过查找单词生成表格来完成的,也可能有一些自定义规则来处理你以前从未见过的单词。



下面是句子词形还原之后添加动词的词根形式之后的样子:






我们所做的唯一改变就是将“is”变成“be”。



▌第五步:识别停止词(Identifying Stop Words)



接下来,我们要考虑句子中每个单词的重要性。英语中有很多填充词,经常出现“and”、“the”和“a”。当对文本进行统计时,这些填充词会带来很多噪音,因为它们比其他词出现得更频繁。一些NLP工作流会将它们标记为停止词(stop words),即在进行任何统计分析之前可能想要过滤掉的单词。



这个句子使用停用词变灰之后看上去像下面的样子:






我们是通过检查已知停止词的编码列表来识别停止词的。但是,并没有一个适合所有应用的标准停止词列表。因此,要忽略的单词列表可能因应用而异。


例如,如果你要构建摇滚乐队的搜索引擎,你要确保不会忽略“The”这个单词。因为“The”这个单词不仅仅出现在很多乐队的名字中,上世纪80年代还有一支著名的摇滚乐队就叫“The The”!


▌第六步:依存句法分析(Dependency Parsing)


下一步就是弄清楚句子中所有单词是如何相互关联的,这称为依存句法分析(Dependency Parsing)。


我们的目标就是构建一棵依存树,为句子中每个单词分配一个母词(parent word)。这棵树的根就是句子中的主动词(main verb)。这个句子的解析树的开头看上去如下图所示:





但我们还可以更进一步。除了识别每个单词的母词之外,我们还可以预测这两个单词之间存在的关系类型:






这棵解析树向我们展示了这个句子的主语是名词“London”,它与单词“capital”有“be”的关系。这样,我们终于知道了一些有用的信息:London是一个capital(首都)!如果我们按照完整的解析树来解析这个句子(超出所示内容),我们甚至会发现:London是英国的首都。



就像我们之前使用机器学习模型预测词性一样,依存语法分析也可以通过将单词输入到机器学习模型中并输出结果来实现。但是,解析单词的依存关系是一项特别复杂的任务,需要另起一篇文章来详细解释。如果你好奇它是如何工作的,可以去参阅Matthew Honnibal写的一篇优秀文章《Parsing English in 500 Lines of Python》,我们在文末附上了阅读链接。



要注意的是:尽管这篇文章的作者在 2015 年声称,这种方法现在已成为标准。但是实际上,它已经过时了,甚至连作者都不再使用这个方法了。2016年,Google 发布了一个新的依存句法分析器,名为 Parsey McParseface,它使用了一种新的深度学习方法,迅速在整个行业流行开来,其性能超过了以前的基准测试。一年后,他们发布了一种叫做 ParseySaurus 的新模型,实现了进一步的改进。换句话说,句法分析技术仍然是一个活跃的研究领域,还在不断变化和改进。


此外,英语中有很多句子是模棱两可的,很难分析。在这些情况下,模型会根据句子的分析版本进行猜测,但是并不完美,有时候模型会出现令人尴尬的错误。但随着时间的推移,我们的NLP模型将继续以合理的方式更好地分析文本。


▌第六b步:查找名词短语


到目前为止,我们把句子中的每个单词都视为一个独立的实体。但有时候将表示一个想法或事物的单词放在一起更有意义。我们可以用依存句法解析树中的信息,自动将所有讨论同一事物的单词分组在一起。


例如,下面这个形式:







我们可以对名词短语进行分组来生成如下图所示:







是否采取这一步骤,要取决于我们的最终目标。但是,如果我们不需要关心哪些单词的额外细节,而是更关心提取完整的意思,那么这通常是简化句子的快速而简单的方法。



▌第七步:命名实体识别(NER)



既然我们已经完成了所有这些艰苦的工作,我们终于可以越过初级语法,开始真正地提取句子的意思。