词性标注(Part-of-Speech Tagging, POS)、命名实体识别(Name Entity Recognition,NER)和依存句法分析(Dependency Parsing)是自然语言处理中常用的基本任务,本文基于SpaCy python库,通过一个具体的代码实践任务,详细解释这三种NLP任务具体是什么,以及在实践中三个任务相互之间的关系。

介绍

说到数据科学时,我们经常想到的是数字的统计分析。但是,越来越多的情况下,社区会生成大量可以量化和分析的非结构化文本数据。比如,社交网络评论、产品评论、电子邮件、面试记录。

为了分析文本,数据科学家经常使用自然语言处理( NLP )技术。在这篇博客文章中,我们将讲解3个常见的NLP任务,看看它们如何一起用于分析文本。我们将讨论的三项任务是:

1、词性标注——这是什么类型的词?

2、依存句法分析——这个词和这个句子中的其他词有什么关系?

3、命名实体识别——这个词是专有名词吗?

我们将基于spaCy python库,将三种NLP任务综合放在一起,分析它们是如何协同工作的。在这儿,我们将使用这些结构化的数据进行一些有趣的可视化。

这种方法可以应用于任何问题,在这些问题拥有大量的文本数据,我们需要了解主要实体是谁,它们出现在文档中的位置,以及它们在做什么。例如,DocumentCloud在其“View Entities”分析选项中使用了与此类似的方法。

Token(符号)&词性标注

从文本中提取含义(meaning)的一种方法是分析单个单词。将文本分解成单词的过程称为tokenization——产生的单词称为token(tokens)。标点符号也是tokens。句子中的每一个token都有几个我们可以用来分析的属性。比如说一个词的词性:人、地方或事物是名词;动作或事件是动词;描述名词的词是形容词。使用这些属性,通过通过简单的计算最常见的名词、动词和形容词来创建一段文本的摘要。

使用spaCy,我们可以tokenize一段文本,并访问每个token(token)的词性属性。作为一个示例应用程序,一下代码给出了一个实例,我们先对一段话进行标签化,然后计算其中最常见的名词。我们还将对这些token进行归类,定义一个词为根节点,方便我们对其他的词进行标准化。

依存句法分析

单词之间也是有关系的,有几种类型的关系。例如,名词可以成为句子的主语,表示它执行了一个动作(一个动词),如“吉尔笑了”。名词也可以是句子的宾语,表示被句子的主语所作用,就像这句话中的约翰一样:”吉尔嘲笑约翰。"

依存句法分析是理解句子中单词之间关系的一种方法。虽然吉尔和约翰都是句子“吉尔嘲笑约翰”中的名词,但吉尔是笑的主体,约翰是被嘲笑的对象。依存关系是一种更细粒度的属性,可以通过句子中的关系来理解单词的含义。

这些词之间的关系会变得复杂,这取决于句子的结构。依存句法分析的结果是以动词为根的树形数据结构。

让我们来看一下“The quick brown fox jumps over the lazy dog” 的依存关系分析。

依存关系也是token属性,spaCy有一个很好的API,可以访问不同的token属性。下面我们将打印出每个token的文本、其依存关系以及其parent(头)token的文本。

出于分析的目的,我们关心任何具有nobj关系的token,表明它们是句子中的对象。在例句中,这意味着我们想要捕捉“狐狸”这个词。

命名实体识别

最后是命名实体识别。命名实体是句子的专有名词。计算机已经非常擅长于判断在句子中是否存在实体,以及区分它们是什么类型的实体。

spaCy可以处理document level的命名实体识别,因为一个实体的名称可以跨越多个token。使用IOB方案将分别表示单个token实体的一部分,分别表示token实体的开始、内部和外部。

在下面的代码中,我们将打印初文档中所有命名实体。然后,我们将打印每个token、其IOB注释、其实体类型(如果它是实体的一部分)。我们将使用的例句是“Jill laughed at John Johnson."

实例解析:NLPing圣经

上面提到的每种方法本身都很棒,但是当我们将这些方法结合起来提取遵循语言模式的信息时,自然语言处理的真正力量就显示出来了。我们可以使用词性标注、依存句法分析和命名实体识别来理解大量文本中的所有参与者(actors)及其行为(actions)。圣经是一个很好的例子,因为它很长且具有丰富的角色。

如下图所示,我们正在导入的数据包含每个圣经章节一个对象。经文被用作圣经部分的参考资料,通常包含一句或多句经文。我们将仔细阅读每一节,提取主题,确定它是否是一个人,并抽出这个人所做的动作。

首先,让我们将圣经以JSON格式从GitHub存储库中载入。然后,我们将抽出每一节中的文本,通过spaCy进行依存解析和tagging,并将结果存入文档。

我们用3分钟左右的时间将JSON中的文本解析成verse_docs,大约每秒160节。作为参考,以下是bible_JSON的前3行:

使用token属性

为了提取actors和actions,我们将迭代一首诗中的所有token,并考虑3个因素:

1. token是句子的主语吗(它是依存关系nsubj吗?) 。

2. 是一个动词token的parent吗?(这通常应该是真的,但是有时POS标记器和依存解析之间会有冲突,所以必须小心处理。另外,可能还存在其他一些奇怪的边缘案例(edge cases)。

3. token是一个人名实体吗?我们不想提取任何非人的名词。(为了简单起见,我们只提取名字)

如果我们的token满足上述三个条件,我们将收集以下属性:

1. 名词/实体token。

2. 从名词到动词之间的短语(span/phrase)。

3. 动词。

4. 标准英文文本中动词出现的概率(在这里使用使用这些记录是因为这些概率通常都很小)。

5. 诗号(verse number)。

分析

我们已经抽取出了一份包含所有actor及其actions的列表。为了加快分析,需要做两件事:

1、找出每个人最常见的action(动词)。

2、找出每个人最独特的action。它们往往是英语文本中出现概率最低的动词。

让我们看看按动词计数和最常见动词排列的top-15名actor。

看起来圣经里的很多人都说过话,除了Solomon之外,他做了很多事情。

从动词出现的概率来看,最独特的动词是什么呢?(先删除重复词,这样每个词都是独一无二的)

看来我们似乎有一些有趣的新单词要学!我最喜欢的是discomfited和ravin。

可视化

接下来让我们可视化我们的结果。选择行动最多的前50个名字,并在画出这些actions在整篇文章出现过的诗句。我们也将在圣经的每本书开始处画垂直线做标记。名字按首次出现的顺序排序。

我们可以看一下在圣经中的那些部分,这些人物最活跃。

我们将添加一些分隔符来区分圣经的不同章节。我本人不是圣经学者,所以我使用了如下分隔符:

旧约:

摩西五经,或法律书籍:Genesis, Exodus, Leviticus, Numbers, and Deuteronomy。

旧约历史书:oshua, Judges, Ruth, 1 Samuel, 2 Samuel, 1 Kings, 2 Kings, 1 Chronicles, 2 Chronicles, Ezra, Nehemiah, and Esther。

智慧文学:Job, Psalms, Proverbs, Ecclesiastes, and Song of Solomon。

先知: Isaiah, Jeremiah, Lamentations, Ezekiel, Daniel, Hosea, Joel, Amos, Obadiah, Jonah, Micah, Nahum, Habakkuk, Zephaniah, Haggai, Zechariah, 和Malachi。

新约:

福音书:马修、马克、卢克和约翰。

新约历史书:Acts

书信: Romans, 1 Corinthians, 2 Corinthians, Galatians, Ephesians, Philippians, Colossians, 1 Thessalonians, 2 Thessalonians, 1 Timothy, 2 Timothy, Titus, Philemon, Hebrews, James, 1 Peter, 2 Peter, 1 John, 2 John, 3 John, and Jude.。

预言/启示文学:启示

此外,我们将用红色的指示线将旧约和新约分开。

出现在圣经里面的Actions,按照它们第一次出现的位置排序。

可视化分析

在圣经的开头,创世纪里,神被多次提到。

上帝不再被用作新约全书中的实体。

我们在使徒行传中第一次看到保罗。(福音书之后的第一本书)

圣经中的智慧和诗歌部分没有太多实体。

耶稣的一生在福音书中被详细记载。

彼拉多出现在每一部福音书的末尾。

这种方法的问题

实体识别无法区分同名的两个不同的人。比如:King Saul(旧约),Paul(使徒)被称为Saul,直到Acts书的中间部分。

有些名词不是实际的实体。

一些名词可以用更多的上下文和全名。(彼拉多)

下一步

一如既往,有一些方法可以扩展和改进这一分析。写这篇文章时,我想到了几个:

1 .使用依存关系查找实体之间的关系,并通过网络分析方法理解字符。

2. 改进实体提取方法以捕获单个名称以外的实体。

3. 对非个人实体及其语言关系进行分析——圣经中提到了哪些位置?

总结:

我们只需要使用文本中的token级属性就可以做一些有趣的分析。在这篇博客文章中,我们介绍了三个关键的NLP工具:

词性标注——这是什么类型的词?

依存句法分析——这个词和这个句子中的其他词有什么关系?

命名实体识别——这个词是专有名词吗?

我们一起运用这三种工具来发现圣经中的主要角色是谁,以及他们采取了什么行动。对这些actor和及他么的动作进行了可视化,以了解每个actor的主要action在哪里。

神圣的NLP!一文理解词性标注、依存分析和命名实体识别任务相关推荐

  1. NLP实战:面向中文电子病历的命名实体识别

    一.前言 本篇文章是关于NLP中的中文命名实体识别(Named Entity Recognition,NER)的实战项目,该项目利用了大型预训练语言模型BERT和BiLSTM神经网络结构来进行NER任 ...

  2. 2.3.NLTK工具包安装、分词、Text对象、停用词、过滤掉停用词、词性标注、分块、命名实体识别、数据清洗实例、参考文章

    2.3.NLTK工具包安装 2.3.1.分词 2.3.2.Text对象 2.3.3.停用词 2.3.4.过滤掉停用词 2.3.5.词性标注 2.3.6.分块 2.3.7.命名实体识别 2.3.8.数据 ...

  3. NLP入门(八)使用CRF++实现命名实体识别(NER)

    CRF与NER简介   CRF,英文全称为conditional random field, 中文名为条件随机场,是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机 ...

  4. 一文详解深度学习在命名实体识别(NER)中的应用

    近几年来,基于神经网络的深度学习方法在计算机视觉.语音识别等领域取得了巨大成功,另外在自然语言处理领域也取得了不少进展.在NLP的关键性基础任务-命名实体识别(Named Entity Recogni ...

  5. 中文处理工具fastHan 2.0:支持中文分词、词性标注、命名实体识别、依存语法分析、中文AMR的强有力工具

    fastHan 简介 fastHan是基于fastNLP与pytorch实现的中文自然语言处理工具,像spacy一样调用方便. 其内核为基于BERT的联合模型,其在15个语料库中进行训练,可处理中文分 ...

  6. 自然语言处理(NLP)之pyltp的介绍与使用(中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注)

    pyltp的简介   语言技术平台(LTP)经过哈工大社会计算与信息检索研究中心 11 年的持续研发和推广, 是国内外最具影响力的中文处理基础平台.它提供的功能包括中文分词.词性标注.命名实体识别.依 ...

  7. NLP_learning 中文基本任务与处理(分词、停用词、词性标注、语句依存分析、关键词抽取、命名实体识别)介绍、jieba工具库

    文章目录 1.分词 2.停用词和N-gram 停用词 N-gram 3. 更多任务(词性标注.依赖分析.NER.关键词抽取) 词性标注 句法依存分析 命名实体识别 关键词抽取 4. jieba工具库使 ...

  8. 自然语言处理NLP之分词、词性标注(POS)、组块分析(Chunking)、命名实体识别(Named Entity Recognition,简称NER)

    自然语言处理NLP之分词.词性标注(POS).组块分析(Chunking).命名实体识别(Named Entity Recognition,简称NER) 目录

  9. 【NLP】一文了解命名实体识别

    导读:从1991年开始,命名实体识别逐渐开始走进人们的视野,在各评测会议的推动下,命名实体识别技术得到了极大地发展,从最初的基于规则和字典的方法,到现在热门的注意力机制.图神经网络等方法,命名实体识别 ...

最新文章

  1. java i o不会的地方_Java I/O 好复杂,傻傻分不清楚,别担心,我们有线索了。。。...
  2. Java多线程编写简易飞机大战(一)
  3. KVM虚拟化实践(一)
  4. 无法打开文件“opencv_world410d.obj”
  5. 查看linux安装redis的位置,linux查看是否安装redis
  6. js plugin--headroom
  7. 数据结构---关键路径
  8. HDU 6755 Fibonacci Sum(二次剩余 + 二项式展开)
  9. Oracle入门(五D)之如何设置show parameter显示隐含参数
  10. JSF基于事件的沟通:过时的方法
  11. php mysqli报错,php安装扩展mysqli的实现步骤及报错解决办法
  12. ajax ssm 页面跳转_Shiro 教程,Ajax请求拦截跳转页面方案
  13. java 铁路管理信息系统_基于Java铁路售票系统的设计与实现(含录像)(SqlServer)
  14. SpringBoot微信点餐系统—1、数据库设计
  15. 通过VNC远程连接ubuntu桌面(多种客户端连接方式)
  16. 闲人闲谈PS之十五——合同、项目、WBS的关系
  17. php 图片木马检测
  18. 程序员老了怎么办?做什么好?
  19. 高通终端修改nv值后,不重启终端即生效
  20. 日更100天(42)每天进步一点点

热门文章

  1. 什么是抽象类?抽象类的作用_揭秘!Java 泛型背后到底是什么?
  2. mysql 如何删除重复的行_如何从mysql中的表中删除重复的行
  3. 操作篇 了解学习NAT实验(关于静态NAT、动态NAT、EasyIP、端口映射的配置方法))
  4. 传统公司部署OpenStack(t版)简易介绍(二)——Keystone组件部署
  5. python笔记之 inputprintformat函数
  6. NRF24L01跳频抗信道干扰功能探讨
  7. java+spring+mysql配置_JAVA后台搭建(springboot+mybatis+mysql)项目搭建
  8. 作业调度问题java代码_Tabu Search求解作业车间调度问题(Job Shop Scheduling)-附Java代码...
  9. linux realvnc教程,Linux下RealVNC Enterprise 的安装和使用
  10. 服务器远程重新做系统吗,服务器远程做系统安装系统