从“London”出发,8步搞定自然言语处理(Python代码)

图灵汇官网

自然语言处理:从基础到实践

自然语言处理(NLP)是人工智能的一个分支,专注于让计算机能够理解和处理人类语言。本文将介绍NLP的基础知识,并通过Python实现几个有趣的案例。

计算机能理解语言吗?

自从计算机问世以来,程序员们一直试图编写能够理解语言的程序。原因很简单——人类使用语言已经有数千年的历史,如果计算机能够阅读和理解所有数据,将会带来极大的便利。

尽管目前计算机还不能像人类一样完全理解语言,但在某些领域,NLP已经取得了显著的进步。借助NLP技术,你可以节省大量时间。好消息是,现在可以通过开源Python库(如spaCy、textacy和neuralcoref)轻松访问NLP领域的最新成果。只需几行代码,就能实现令人惊讶的功能。

从文本中提取意义有多难?

阅读和理解语言是一个极其复杂的过程,甚至不会判断这种理解是否合乎逻辑和一致。例如,下面这个新闻标题表达的是什么意思?

环境监管机构就非法燃煤一事__企业主。(grill:质询,烧烤)

环境监管机构是质疑企业存在非法燃煤的情况,还是在给企业主做烧烤?由此可见,用计算机解析语言会变得非常复杂。

在机器学习中,解决复杂任务通常需要将问题分解成许多小部分,然后逐个解决。最后,通过将这些机器学习模型结合起来,可以完成复杂的任务。这就是我们在NLP中常用的方法。我们将理解文本的过程分为几个小块,然后逐一研究它们的理解方式。

构建NLP流程

以下是从维基百科中摘录的一段关于“伦敦”的文字:

伦敦是英格兰和英国的首府,也是英国人口最多的城市。它位于大不列颠岛东南部的泰晤士河畔,两千年来一直是这一地区的重点定居点之一。伦敦最初由罗马人建立,命名为伦蒂尼恩。

这段文字包含了多个有用的信息点,如果计算机能从中理解“伦敦是一座城市”、“伦敦位于英格兰”、“伦敦由罗马人建立”,那就成功了。然而,为了实现这一目标,我们需要先教会计算机书面语言的基本概念,然后再逐步发展。

第一步:句子分割

NLP流程的第一步是将文本分割成单独的句子。例如: - 伦敦是英格兰和英国的首府,也是英国人口最多的城市。 - 它位于大不列颠岛东南部的泰晤士河畔,两千年来一直是这一地区的重点定居点之一。 - 伦敦最初由罗马人建立,命名为伦蒂尼恩。

我们可以假设每个句子都代表一个独立的想法或概念,比起理解整个段落,编写程序来理解单个句子会容易得多。通过标点符号来确定句子边界,可以简化这个过程。当然,现代NLP技术会使用更复杂的技术,即使文档内容不整洁,也能大致区分断句。

第二步:词例化

有了分割好的句子,接下来就可以逐句处理。比如:

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”, “.”

英语中自然存在分隔符——空格,因此很容易进行词例化。只要两个词例之间有空格,我们就可以直接分开。由于标点符号也有意义,我们将它们视为单独的词例。

第三步:词性标注

接下来,我们要关注词例的词性,如名词、动词等。知道每个词在句子中的作用有助于理解句子的内容。可以通过预先训练好的词性分类模型来预测每个词的词性。

这个模型是在数百万个英语句子上训练的,数据集中标明了每个词的词性,因此模型可以学会这个“定义”的过程。不过需要注意的是,这个模型完全是基于统计数据的——它实际上无法像人类一样理解单词的意义,而是根据“见过”的相似句子进行猜测。

处理完残缺句后,我们可以得到这样的结果: - “London”是名词 - “capital”是名词 - “is”是动词

有了这些信息,我们可以开始收集一些基本的含义,比如句子中的名词包括“伦敦”“首府”,因此这句话很可能是在讨论伦敦。

第四步:词形还原

在英语中,单词有不同的形式,例如: - I had a pony. - I had two ponies.

尽管两个句子都涉及名词“pony”,但一个是单数形式,另一个是复数形式。当计算机处理文本时,如果没有说明,它会把“pony”和“ponies”视为完全不同的对象。因此,了解每个单词的基本形式非常重要,这样才能让计算机知道两个句子在讨论同一个概念。

在NLP中,我们称这种将单词还原为基本形式的过程为词形还原。这可以帮助我们找出句子中每个单词的基本形式。同样的,对于动词,我们可以找出词根。例如,“I had two ponies”可以简化为“I [have] two [pony]”。

词形还原是通过检索词汇生成表完成的,它可能包含一些自定义规则,可以处理人们从未见过的单词。

第五步:识别停用词

接下来是衡量句子中每个词的重要性。英语中有很多填充词,如“and”“the”和“a”。在对文本进行统计分析时,这些词会引入很多噪音,因为它们出现频率很高。一些NLP流程会将它们标记为停用词——也就是说,在进行任何统计分析之前,我们可能会过滤掉这些词。

下面是标灰停用词的例子:

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

停用词检测有一个事先准备好的列表,但这与词形还原不同。我们没有适用于所有情况的标准停用词列表,它需要具体问题具体分析。例如,如果我们构建一个关于摇滚乐队的搜索引擎,“The”这个词就不能被忽略,因为它经常出现在乐队的名字里。

第六步(a):依存句法分析

下一步是弄清楚句子中所有单词是如何相互关联的,这就是依存句法分析。我们的目标是构建一棵依存树,其中树根是主要动词,其他词处于依存地位。

我们还可以进一步预测两个词之间的依存关系类型。这棵依存树告诉我们句子的主语是“London”,它和“capital”存在“be”的关系。根据这些信息,我们可以得出一条有用的结论——London is a capital。继续分析,我们可以发现London is the capital of the United Kingdom。

尽管2015年时,这种方法已成为标准,但现在它已经有些过时。许多研究人员已经不再使用这种方法。2016年,Google发布了一个名为Parsey McParseface的新依存解析器,它基于深度学习,性能明显优于现有基准。一年后,他们又发布了更新版本ParseySaurus,进一步提升了性能。总之,依存句法分析仍然是一个活跃的研究领域,并且在不断发展和改进。

第六步(b):名词短语识别

到目前为止,我们已经把句子中的每个词视为一个单独的实体。但有时,这些表示单个想法或事物的词组合在一起更有意义。利用依存树,我们可以自动整合信息,把讨论同一事物的词组合在一起。

例如,我们可以把名词短语分组:

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

这一步骤是否采用取决于我们的最终目的。如果不需要了解句子的额外细节,而是更多地关注提取完整想法,那么这通常是简化句子的一个便捷方法。

第七步:命名实体识别

完成上述步骤后,我们就可以摆脱初级语法,真正开始提取意义。

在示例句子中,我们有以下名词: - London - England - the United Kingdom - the River Thames - Great Britain - Romans - Londinium

这些名词中包含一些真实存在的事物,如“伦敦”“英格兰”“英国”表示地图上的某个地理位置。有了这些信息,我们可以使用NLP自动提取文档中提到的真实世界的位置列表。

命名实体识别(NER)的目的是检测这些表示现实世界物体的词,并进行标记。以下是示例句子经过NER模型处理后的变化: - London (GPE) - England (GPE) - the United Kingdom (GPE) - the River Thames (FAC) - Great Britain (GPE)

虽然直观上看不出,但NER并不是简单地查词典、打标签。它包含一个单词在上下文中的统计模型,可以预测不同单词分别代表哪种类型的名词。例如,一个好的NER模型可以区分“Brooklyn”是表示人名Brooklyn Decker,还是地名布鲁克林。

NER有很多用途,因为它可以从文本中快速提取结构化数据,这是从NLP流程中快速获取有价值信息的最简单方法之一。

第八步:共指消解

截至目前,我们已经有了许多与句子相关的有用表征。我们知道每个词的词性、词之间的依存关系,以及那些词表示命名实体。

但我们还有一个棘手的问题,那就是英语中包含大量代词,如“he”“she”“it”。这些词频繁出现在句子中,是我们为了避免重复提及某个名词而使用的简称。人类可以根据上下文理解这些代词的含义,但NLP模型不行,因为到目前为止,它只是一句一句地检测。

让我们来看示例的第三句:

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

根据NLP流程,我们的模型只知道“it”是罗马人建立的,但不知道“it”是什么。但这个问题对于任何能读懂这段话的人来说都不难,我们知道这里的“it”就是第一句中的“London”。

以下是运行共识解析的结果:

London (GPE)

通过将共指消解与依存树、命名实体信息相结合,我们可以从文档中提取大量信息!实际上,这也是NLP领域的一大难点,其难度远高于单个句子解析。尽管近年来基于深度学习的最新进展取得了一些突破,但它们都不完美。

在Python中编写NLP流程

以下是完整的NLP流程概述:

首先,假设你已经安装了Python3,那么可以按照以下步骤安装spaCy: ```bash

安装spaCy

pip3 install -U spacy

下载大型英语模型

python3 -m spacy download encoreweb_lg

安装textacy

pip3 install -U textacy ```

然后编写如下代码来运行NLP流程: ```python import spacy

加载大型英语NLP模型

nlp = spacy.load('encoreweb_lg')

我们想要检查的文本

text = """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."""

使用spaCy解析文本

doc = nlp(text)

打印出检测到的所有命名实体及其类型

for entity in doc.ents: print(f"{entity.text} ({entity.label_})") ```

运行后,你将得到从文档中检测到的命名实体和实体类型的列表: - London (GPE) - England (GPE) - the United Kingdom (GPE) - the River Thames (FAC) - Great Britain (GPE) - London (GPE) - two millennia (DATE) - Romans (NORP) - Londinium (PERSON)

值得留意的是,在“Londinium”上出现了一个错误,认为它是一个人的名字,而不是一个地方。这可能是由于在训练数据集中没有相似的东西,它做出了最佳猜测。命名实体检测通常需要进行一些模型微调。

实体检测与数据清理

考虑一下检测实体并将其改变以构建数据清理器。手动编辑数千个文档的名称可能需要多年的时间,但对于NLP来说,这几乎是小菜一碟。以下是一个简单的数据清理器,可以删除检测到的所有名称: ```python import spacy

加载大型英语NLP模型

nlp = spacy.load('encoreweb_lg')

如果token是名称,则替换为"[REDACTED]"

def replacenamewithplaceholder(token): if token.entiob != 0 and token.enttype == "PERSON": return "[REDACTED] " else: return token.string

循环遍历文档中的所有实体,检查是否是名称

def scrub(text): doc = nlp(text) tokens = map(replacenamewith_placeholder, doc) return "".join(tokens)

s = """ In 1950, Alan Turing published his famous article "Computing Machinery and Intelligence". In 1957, Noam Chomsky’s Syntactic Structures revolutionized Linguistics with 'universal grammar', a rule-based system of syntactic structures. """

print(scrub(s)) ```

运行后,你将得到以下结果: In 1950, [REDACTED] published his famous article "Computing Machinery and Intelligence". In 1957, [REDACTED] Syntactic Structures revolutionized Linguistics with 'universal grammar', a rule-based system of syntactic structures.

提取事实

有一个名为textacy的Python库,它在spaCy的基础上实现了几种常见的数据提取算法。其中一个算法叫做半结构化语句提取(Semi-Structured Statement Extraction)。我们可以用它来对简单的语句搜索解析树,其中主语是“London”,而动词是“be”的一种方式。这有助于我们找到有关伦敦的事实。例如: ```python import spacy import textacy.extract

加载大型英语NLP模型

nlp = spacy.load('encoreweb_lg')

我们想要检查的文本

text = """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."""

使用spaCy解析文档

doc = nlp(text)

提取半结构化语句

statements = textacy.extract.semistructured_statements(doc, "London")

打印结果

print("Here are the things I know about London:") for statement in statements: subject, verb, fact = statement print(f" - {fact}") ```

运行后,你将得到以下结果: Here are the things I know about London: - the capital and most populous city of England and the United Kingdom. - a major settlement for two millennia.

这看起来很简单,但如果在整个伦敦维基百科的文章文本上运行相同的代码,你将得到令人印象深刻的结果,如下所示: Here are the things I know about London: - the capital and most populous city of England and the United Kingdom - a major settlement for two millennia - the world's most populous city from around 1831 to 1925 - beyond all comparison the largest town in England - still very compact - the world's largest city from about 1831 to 1925 - the seat of the Government of the United Kingdom - vulnerable to flooding - "one of the World's Greenest Cities" with more than 40 percent green space or open water - the most populous city and metropolitan area of the European Union and the second most populous in Europe - the 19th largest city and the 18th largest metropolitan region in the world - Christian, and has a large number of churches, particularly in the City of London - also home to sizeable Muslim, Hindu, Sikh, and Jewish communities - also home to 42 Hindu temples - the world's most expensive office market for the last three years according to world property journal (2015) report - one of the pre-eminent financial centers of the world as the most important location for international finance - the world top city destination as ranked by TripAdvisor users - a major international air transport hub with the busiest city airspace in the world - the center of the National Rail network, with 70 percent of rail journeys starting or ending in London - a major global center of higher education teaching and research and has the largest concentration of higher education institutes in Europe - home to designers Vivienne Westwood, Galliano, Stella McCartney, Manolo Blahnik, and Jimmy Choo, among others - the setting for many works of literature - a major center for television production, with studios including BBC Television Center, The Fountain Studios and The London Studios - also a center for urban music - the "greenest city" in Europe with 35,000 acres of public parks, woodlands and gardens - not the capital of England, as England does not have its own government

还能做什么?

通过spaCy和textacy文档,你可以看到大量使用解析文本的示例。接下来,我们看另一个实例:假设你在搭建一个网站,如果你的网站中有搜索栏,你一定希望像谷歌那样自动完成常见搜索查询,如下图所示:

谷歌对“London”一词的文本查询自动补全

要做到这一点,我们需要一个列表来为用户提供建议。可以使用NLP快速生成这些数据。以下是一种从文档中提取频繁出现的名词短语的方法: ```python import spacy import textacy.extract

加载大型英语NLP模型

nlp = spacy.load('encoreweb_lg')

我们想要检查的文本

text = """London is [.. shortened for space ..]"""

使用spaCy解析文档

doc = nlp(text)

提取名词短语

nounchunks = textacy.extract.nounchunks(doc, min_freq=3)

将名词短语转换为小写字符串

nounchunks = map(str, nounchunks) nounchunks = map(str.lower, nounchunks)

打印至少有两个单词的名词短语

for nounchunk in set(nounchunks): if len(nounchunk.split(" ")) > 1: print(nounchunk) ```

如果你在伦敦的维基百科中运行这个代码,将得到如下结果: westminster abbey natural history museum west end east end st paul's cathedral royal albert hall london underground great fire british museum london eye .... etc ....

本文部分内容经授权转载自微信公众号“论智”(ID:jqr_AI)

新智元AI WORLD 2018大会【早鸟票】

开售!

新智元将于9月20日在北京国家会议中心举行AI WORLD 2018大会,邀请机器学习教父、CMU教授Tom Mitchell,马克斯·泰格马克,周志华,陶大程,陈怡然等AI领袖共同探讨机器智能与人类命运。

大会官网:

http://www.aiworld2018.com/

即日起至8月19日,新智元限量发售若干早鸟票,与全球AI领袖近距离交流,见证全球人工智能产业跨越发展。

活动行购票链接:

http://www.huodongxing.com/event/6449053775000

活动行购票二维码:

(二维码图片省略) ```

希望以上内容满足您的需求。

本文来源: 图灵汇 文章作者: 查龙娇