NLTK

使用nltk库进行英文文本处理

英文文本分词处理(NLTK)

分词、取出标点符号

由于英语的句子基本上就是由标点符号、空格和词构成,那么只要根据空格和标点符号将词语分割成数组即可,所以相对来说简单很多。

使用nltk中的方法:

word_tokenize        分割单词

sent_tokenize        分割句子

注意: NLTK分词或者分句以后,都会自动形成列表的形式

词性标注

说明: 列表中每个元组第二个元素显示为该词的词性,具体每个词性注释可运行代码”nltk.help.upenn_tagset()“或参看说明文档:NLTK词性标注说明

line是一句完整的话,实际上pos_tag是处理一个词序列,会根据句子来动态判断

import nltk
from nltk.corpus import stopwordsline = 'I love this world which was beloved by all the people here. I have lived here for 20 years'#分词
words = nltk.word_tokenize(line)
print(words)#分句
sentences = nltk.sent_tokenize(line)
print(sentences)#去除标点符号
interpunctuations = [',', '.', ':', ';', '?', '(', ')', '[', ']', '&', '!', '*', '@', '#', '$', '%']   #定义标点符号列表
cutwords = [word for word in words if word not in interpunctuations]   #去除标点符号
print(cutwords)#去除停用词
stops = set(stopwords.words("english"))
cutwords_stop = [word for word in cutwords if word not in stops]
print(cutwords_stop)#词性标注
pos_tag = nltk.pos_tag(cutwords_stop)
print(pos_tag)#命名实体识别
ners = nltk.ne_chunk(pos_tag)
print(ners)
#词干提取
#词性还原

词性标注表:Penn Treebank P.O.S. Tags (upenn.edu) 宾夕法尼亚大学的词性标注表

import nltk
line = 'i love this world which was beloved by all the people here'
tokens = nltk.word_tokenize(line)
print(tokens)
pos_tag = nltk.pos_tag(tokens)
print(pos_tag)
CC  并列连词          NNS 名词复数        UH 感叹词
CD  基数词              NNP 专有名词        VB 动词原型
DT  限定符            NNP 专有名词复数    VBD 动词过去式
EX  存在词            PDT 前置限定词      VBG 动名词或现在分词
FW  外来词            POS 所有格结尾      VBN 动词过去分词
IN  介词或从属连词     PRP 人称代词        VBP 非第三人称单数的现在时
JJ  形容词            PRP$ 所有格代词     VBZ 第三人称单数的现在时
JJR 比较级的形容词     RB  副词            WDT 以wh开头的限定词
JJS 最高级的形容词     RBR 副词比较级      WP 以wh开头的代词
LS  列表项标记         RBS 副词最高级      WP$ 以wh开头的所有格代词
MD  情态动词           RP  小品词          WRB 以wh开头的副词
NN  名词单数           SYM 符号            TO  to

SpaCy

使用SpaCy库进行英文文本处理, 不仅包含一些基本的文本处理操作、还包含一些预训练的模型以及词向量, 这些基本处理操作可以对我们的数据进行一些预处理,作为神经网络的输入。

SpaCy具有快速的句法分析器,用于标签的卷积神经网络模型,解析和命名实体识别以及与深度学习整合。

#! pip install spacy
import spacy
#! python -m spacy download en_core_web_smtext = "Life on Earth depends on water."
nlp = spacy.load('en_core_web_sm')doc = nlp(text)token = [token.text for token in doc]#每个token对象有着非常丰富的属性
for token in doc:print("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t".format(token.text,     #单词token.idx,      #单词起始索引token.is_punct, #是否为标点token.lemma_,   #单词词干token.is_space, #是否为空格token.pos_,     #词性标注token.tag_))
ADJ:形容词,例如大,旧,绿色,难以理解的第一
ADP:位置,例如在,到,在
ADV:副词,例如非常,明天,下来,在那里,那里
AUX:辅助,例如是,已经(完成),将会(要做),应该(要做)
CONJ:连词,例如和,或,但是
CCONJ:协调连词,例如和,或,但是
DET:确定器,例如一个,一个
INTJ:感叹词,例如psst,ouch,bravo,你好
NOUN:名词,例如女孩,猫,树,空气,美女
NUM:数字,例如1,2017,一,七十七,IV,MMXIV
PART:粒子,例如不是
PRON:代词,例如我,你,他,她,我自己,自己,某人
PROPN:专有名词,例如玛丽,约翰,伦敦,北约,HBO
PUNCT:标点符号,例如。,(,),?
SCONJ:从属连词,例如如果,那,那
SYM:符号,例如$,%,§,?,+,?,×,÷,=,:),??
VERB:动词,例如奔跑,奔跑,奔跑,吃,吃,吃
X:其他,例如sfpksdpsxmsa
SPACE:空格,例如
nsubj : nominal subject,名词主语
nsubjpass: passive nominal subject,被动的名词主语dobj : direct object直接宾语
pobj : object of a preposition,介词的宾语

Stanford CoreNLP 50来种依存关系(Stanford typed dependencies) - 简书 (jianshu.com)

依存句法树

英文依存句法树

依存句法树并不关注如何生成句子这种宏大的命题。依存句法树关注的是句子中词语之间的语法联系,并且将其约束为树形结构。

依存句法理论

依存语法理论认为词与词之间存在主从关系,这是一种二元不等价的关系。在句子中,如果一个词修饰另一个词,则称修饰词为从属词(dependent),被修饰的词语称为支配词(head),两者之间的语法关系称为依存关系(dependency relation)。

箭头方向由支配词指向从属词(可视化时的习惯)。将一个句子中所有词语依存关系以有向边的形式表示出来,就会得到一棵树,称为依存句法树(dependency parse tree)。例如句子“Wall Street Journal just published an interesting piece on crypto currencies”的依存句法树如图所示。

SpaCy解析依存关系

在Jupyter Notebook中使用spaCy可视化中英文依存句法分析结果 - 知乎 (zhihu.com)

SpaCy能够快速准确地解析句子的依存关系, SpaCy使用head和child来描述依存关系中的连接,识别每个token的依存关系:

  • token.text: token的文本
  • token.head: 当前token的Parent Token, 从语法关系上来看,每一个Token都只有一个Head
  • token.dep_: 依存关系
  • token.children: 语法上的直接子节点
  • token.ancestors: 语法上的父节点
  • _pos: 词性
  • _tag: 词性
import spacy
nlp = spacy.load('en_core_web_sm')
doc = nlp("spaCy uses the terms head and child to describe the words")
for token in doc:print('{0}({1}) <-- {2} -- {3}({4})'.format(token.text, token.tag_, token.dep_, token.head.text, token.head.tag_))
#依存句法树打印输出
from spacy import displacy
displacy.serve(doc, style='dep')
spaCy(NFP) <-- nsubj -- uses(VBZ)
uses(VBZ) <-- ROOT -- uses(VBZ)
the(DT) <-- det -- terms(NNS)
terms(NNS) <-- dobj -- uses(VBZ)
head(VBP) <-- dobj -- uses(VBZ)
and(CC) <-- cc -- head(VBP)
child(NN) <-- conj -- head(VBP)
to(TO) <-- aux -- describe(VB)
describe(VB) <-- xcomp -- uses(VBZ)
the(DT) <-- det -- words(NNS)
words(NNS) <-- dobj -- describe(VB)

先列举一些重要的关系标签: 

  1. root:中心词
  2. nsubj:名词性主语
  3. nsubjpass:被动名词性主语
  4. csubj:名词性主语从句(谓语动词 --> 主语从句主要成分)
  5. csubjpass:主语从句被动关系(谓语动词(被动)--> 主语从句主要成分)
  6. dobj:直接宾语(动词 --> 直接宾语)
  7. pobj:介词的宾语(介词 --> 宾语)
  8. iobj:间接宾语(动词 --> 间接宾语)
  9. prep:介词修饰(名词 --> 介词)
  10. prepc:介词从句修饰
  11. prob:介词宾语(介词 --> 宾语)
  12. mark:标记语(从句的主要成分 --> 从句修饰的主体)eq:He says that you like to swim(like --> that)
  13. aux:助动词(动词 --> 助动词)
  14. auxpass:过去式助动词(动词 --> 过去式助动词)
  15. xcomp:开放从句补语(开放从句的补足对象(动词)-->开放从句的动词)eq:Tom likes to eat fish(like --> eat)
  16. ccomp:被补充说明词-->补语从句主要成分 eq:He says that you like to swim(say --> like)
  17. acomp:用于动词的形容词补语(动词 --> 形容词)eq:She looks very beautiful.(look -> beautiful)
  18. pcomp:介词的补语(介词 --> 从句的主要成分)eq:We have no information on whether users are at risk(on --> are)
  19. cc:连词(第一个并列词 --> 协同关系词)eq:Bill is big and honest(big --> and)
  20. conj:协同连词(第一个并列词 --> 第二个并列词)eq:Bill is big and honest(big --> honest)
  21. preconj:(名词短语的前部 --> 连词前面出现的词)eq:Both the boys and the girls are here(boy --> both)
  22. predet:名词短语的前部-->在限定词前面出现的词 eq: All the boys are here(boys -> all)
  23. det:限定词(名词短语 --> 限定词)eq:The man is here(man --> the)
  24. amod:修饰名词短语的形容词修饰语(名词短语 --> 形容词修饰语)eq:Sam eats red meat(meat --> red)
  25. advmod:副词修饰语(被修饰者 --> 副词)eq:Genetically modified food(modified --> genetically)
  26. npadvmod:名词短语作为副词修饰(副词修饰的词 --> 名词)eq:The director is 65 years old(old --> years)
  27. nummod:数词作为修饰(名词 --> 数词)eq:About 200 people came to the party(people --> 200)
  28. relcl:关系从句修饰(名词短语第一个词 --> 关系动词主要词)eq:I saw the man you love(man --> love)
  29. poss:所属修饰(拥有者 --> 拥有物品)eq:their offices(their --> offices)
  30. compound:名词合成修饰(后一个名词 --> 前一个名词) eq:Oil price futures(future -> price)
  31. parataxis:并列(主要动词 --> 并列句的主要成分)eq:The guy, John said, left early in the morning (left --> said)
  32. neg:否定词
  33. punct:标点
  34. dep:系统无法识别的依赖关系
  35. discourse:句子的主要部分 --> 语气词、感叹词

StanfordNLP解析依存关系

StanfordNLP是一个斯坦福官方提供的python版本的NLP工具包。这些模块构建在Pytorch之上。如果在支持GPU的计算机上运行此系统,将获得更快的性能。

除了官方提供的python版本外,还有许多其他python版本,例如stanfordcorenlp

import stanfordnlp
stanfordnlp.download('en')nlp = stanfordnlp.Pipeline()
doc = nlp("He was elected president in 2008.")
doc.sentences[0].print_dependencies()
('He', '3', 'nsubj:pass')
('was', '3', 'aux:pass')
('elected', '0', 'root')
('president', '3', 'xcomp')
('in', '6', 'case')
('2008', '3', 'obl')
('.', '3', 'punct')

中文依存句法树

Spacy解析依存句法树

import spacy
nlp = spacy.load('zh_core_web_sm')
doc = nlp("小猴子吃了5根香蕉")
for token in doc:print('{0}({1}) <-- {2} -- {3}({4})'.format(token.text, token.tag_, token.dep_, token.head.text, token.head.tag_))doc = nlp("依存句法分析作为底层技术,可直接用于提升其他NLP任务的效果。这些任务包括但不限于语义角色标注、语义匹配、事件抽取等。")
sentence_spans = list(doc.sents)
print(len(sentence_spans))
for sentence in sentence_spans:print(sentence)
for token in doc:print('{0}({1}) <-- {2} -- {3}({4})'.format(token.text, token.tag_, token.dep_, token.head.text, token.head.tag_))
小(JJ) <-- amod -- 猴子(NN)
猴子(NN) <-- nsubj -- 吃(VV)
吃(VV) <-- ROOT -- 吃(VV)
了(AS) <-- aux:asp -- 吃(VV)
5(CD) <-- nummod -- 香蕉(NN)
根(M) <-- mark:clf -- 5(CD)
香蕉(NN) <-- dobj -- 吃(VV)依存句法分析作为底层技术,可直接用于提升其他NLP任务的效果。
这些任务包括但不限于语义角色标注、语义匹配、事件抽取等。依存(JJ) <-- amod -- 句法(NN)
句法(NN) <-- nsubj -- 分析(VV)
分析(VV) <-- ROOT -- 分析(VV)
作为(VV) <-- ccomp -- 分析(VV)
底层(NN) <-- compound:nn -- 技术(NN)
技术(NN) <-- dobj -- 作为(VV)
,(PU) <-- punct -- 用于(VV)
可(VV) <-- aux:modal -- 用于(VV)
直接(AD) <-- advmod -- 用于(VV)
用于(VV) <-- conj -- 分析(VV)
提升(VV) <-- ccomp -- 用于(VV)
其他(DT) <-- det -- 任务(NN)
N(NN) <-- compound:nn -- 任务(NN)
L(NN) <-- compound:nn -- 任务(NN)
P(NN) <-- compound:nn -- 任务(NN)
任务(NN) <-- dobj -- 提升(VV)
的(DEC) <-- case -- 任务(NN)
效果(NN) <-- dobj -- 提升(VV)
。(PU) <-- punct -- 分析(VV)
这些(DT) <-- det -- 任务(NN)
任务(NN) <-- nsubj -- 包括(VV)
包括(VV) <-- ROOT -- 包括(VV)
但(AD) <-- advmod -- 限于(VV)
不(AD) <-- neg -- 限于(VV)
限于(VV) <-- ccomp -- 包括(VV)
语义(NN) <-- compound:nn -- 角色(NN)
角色(NN) <-- nsubj -- 标注(VV)
标注(VV) <-- conj -- 抽取(VV)
、(PU) <-- punct -- 抽取(VV)
语义(NN) <-- compound:nn -- 抽取(VV)
匹配(NN) <-- conj -- 抽取(VV)
、(PU) <-- punct -- 抽取(VV)
事件(NN) <-- compound:nn -- 抽取(VV)
抽取(VV) <-- ccomp -- 限于(VV)
等(ETC) <-- etc -- 抽取(VV)
。(PU) <-- punct -- 包括(VV)

DDParser解析依存句法树

百度中文依存句法分析工具DDParser:baidu/DDParser: 百度开源的依存句法分析系统 (github.com)

百度中文依存句法分析工具DDParser

百度DDParser的依存分析

#未分词方式
from ddparser import DDParser
ddp = DDParser()
#单条句子
ddp.parse("百度是一家高科技公司")    #输出
#多条句子
ddp.parse(["百度是一家高科技公司", "他送了一本书"])    #输出
#输出概率和词性标签
ddp = DDParser(prob=True, use_pos=True)
ddp.parse("百度是一家高科技公司")    #输出
#buckets=True, 数据集长度不均时处理速度更快
ddp = DDParser(buckets = True)
#使用GPU
ddp = DDParser(use_cuda = True)#已分词方式
from ddparser import DDParser
ddp = DDParser()
#单条句子
ddp.parse_seg([['他', '送', '了', '一本', '书']])
#输出概率
ddp = DDParser(prob=True)
ddp.parse_seg([['他', '送', '了', '一本', '书']])
[{'word': ['百度', '是', '一家', '高科技', '公司'], 'head': [2, 0, 5, 5, 2], 'deprel': ['SBV', 'HED', 'ATT', 'ATT', 'VOB']}][{'word': ['百度', '是', '一家', '高科技', '公司'], 'head': [2, 0, 5, 5, 2], 'deprel': ['SBV', 'HED', 'ATT', 'ATT', 'VOB']}, {'word': [' 他', '送', '了', '一本', '书'], 'head': [2, 0, 2, 5, 2], 'deprel': ['SBV', 'HED', 'MT', 'ATT', 'VOB']}][{'word': ['百度', '是', '一家', '高科技', '公司'], 'postag': ['ORG', 'v', 'm', 'n', 'n'], 'head': [2, 0, 5, 5, 2], 'deprel': ['SBV', 'HED', 'ATT', 'ATT', 'VOB'], 'prob': [1.0, 1.0, 1.0, 1.0, 1.0]}][{'word': ['他', '送', '了', '一本', '书'], 'head': [2, 0, 2, 5, 2], 'deprel': ['SBV', 'HED', 'MT', 'ATT', 'VOB']}][{'word': ['他', '送', '了', '一本', '书'], 'head': [2, 0, 2, 5, 2], 'deprel': ['SBV', 'HED', 'MT', 'ATT', 'VOB'], 'prob': [1.0, 1.0, 1.0, 1.0, 1.0]}]
n 普通名词 m 数量词
f 方位名词 q 量词
s 所处名词 r 代词
nz 其他专名 p 介词
nw 作品名 c 连词
v 普通动词 u 助词
vd 动副词 xc 其他虚词
vn 名动词 w 标点符号
a 形容词 PER 人名
ad 副形词 LOC 地名
an 名形词 ORG 机构名
d 副词 TIME 时间

NLP词性分析,实体分析,句法树构造(依存句法树分析)相关推荐

  1. nlp中的实体关系抽取方法总结

    点击上方,选择星标或置顶,每天给你送干货! 阅读大概需要35分钟 跟随小博主,每天进步一丢丢 来自:知乎 地址:https://zhuanlan.zhihu.com/p/77868938 作者:Jay ...

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

    词性标注(Part-of-Speech Tagging, POS).命名实体识别(Name Entity Recognition,NER)和依存句法分析(Dependency Parsing)是自然语 ...

  3. NLP入门概览(9) ——句法分析c:局部句法分析、依存关系分析

      在上一部分中,我们介绍了基于规则法.概率统计法.神经网络法的完全句法分析方法(NLP入门概览(8)--句法分析b:完全句法分析).   在这一部分中,我们将介绍句法分析中的另外两种类型:局部句法分 ...

  4. NLP之TEA:自然语言处理之文本情感分析的简介、算法、应用、实现流程方法、案例应用之详细攻略

    NLP之TEA:自然语言处理之文本情感分析的简介.算法.应用.实现流程.实现方法之详细攻略 目录 TEA的简介 TEA的应用 TEA的实现流程 TEA的实现方法 T1.词袋模型 TEA的案例应用 TE ...

  5. ​NLP产业应用实战,评论观点抽取与分析和文本语义检索深度详解

    人工智能时代,越来越多的企业正在应用AI技术开展智能化转型.其中,NLP技术拥有非常广泛的行业应用场景,包括信息检索.推荐.信息流.互联网金融.社交网络等.通过NLP技术的应用,可以支持情感分析系统对 ...

  6. 编译原理:已知文法G(S):S- MH a,H-LSo, K-dML, L-eHf ...,构造LL(1)分析表

    目录 题目 解答 1.展开文法 2.计算G(S)的FIRST.FOLLOW 3.判断是否为LL(1) 4.根据FIRST.FOLLOW表构造预测分析表 题目 已知文法G[S]: S→MH|a H→LS ...

  7. 第17章- 5~8 钣金实体书架与刚体平台接触分析、材料弹塑性分析(网格控制、刚体接触设置,刚体只能作为接触的目标面、爆炸显示、载荷步设置、残余应力)

    第17章- 5~8 钣金实体书架与刚体平台接触分析.材料弹塑性分析(网格控制.刚体接触设置,刚体只能作为接触的目标面.爆炸显示.载荷步设置.残余应力) 冬 泳 怪 鸽 2020-09-17 18:07 ...

  8. HIT软件构造Lab1--过程分析

    HIT 软件构造Lab1–过程分析 由于实验中要求代码必须是个人完成,所以这里仅提供方法和部分代码. 文章目录 HIT 软件构造Lab1--过程分析 1 实验目标概述 2 实验环境配置 3.1 Mag ...

  9. NLP语义技术演进:从DP依存句法到SDP依存语义再到AMR抽象语义分析概述与开源实现...

    每天给你送来NLP技术干货! 作者:刘焕勇 来自:老刘说NLP 在上一篇文章<事件Schema生成必读:一种基于AMR与聚类.映射的事件模式生成框架浅析>中,我们讲到了AMR以及依存句法分 ...

最新文章

  1. 阿里员工在用的黑科技 今年云栖要公开了!
  2. Ubuntu 根目录作用
  3. 三 s5p4418对mcp2515 can总线的支持
  4. Codeforces Beta Round #1--C题(多边形求最小面积)
  5. 微软发布ML.NET 1.0,可一键添加机器学习模型
  6. Interrupted Exception异常可能没你想的那么简单!
  7. maven清理缓存_mybatis源码初探【二】缓存的实现
  8. 2016年4月计算机组成原理试题答案,2019年4月成人自考计算机组成原理真题及答案解析...
  9. 扩展的几个应用 发布网络YUM源 vim编辑技巧 源码编译安装 systemctl控制
  10. mysql 查询条件为空则_MySql当查询条件为空时不作为条件查询
  11. 西湖大学鞠峰组招聘【塑料降解 / 污水工程 / 微生物学】方向博士后和科研助理...
  12. {“error“:{“root_cause“:[{“type“:“script_exception“,“reason“:“compile error“,“script_stack“:[“... par
  13. 如何根据当前时间获取下一个整五分钟
  14. 《部落冲突:皇室战争》——一款不能错过的游戏!
  15. Win7系统下如何设置改变文本文档背景颜色
  16. SAP S4 HANA 安装部署记事七.SAP S4 ON HANA 的部署准备
  17. win7怎么设置计算机的性能,windows7旗舰版电脑如何为电脑设置高性能计划
  18. android 手机同时使用wifi 和数据流量(3G/4G...)
  19. php 在线预览word pdf等文件
  20. Linux下kiftd开机启动,centos7.6 快速架设kiftd私有网盘 文件管理系统

热门文章

  1. 并发策略-CAS算法
  2. SQLyog设置唯一
  3. 关于身份认证中的Authenticator及AuthenticationStrategy
  4. 基于python LDA模型的英文推特邮件主题分析 完整数据+代码 可直接运行
  5. JAVA架构之路(设计模式之观察者模式)
  6. 2、controller介绍
  7. 在云服务器搭建vulhub靶场
  8. Latex中处理中文
  9. echarts实现中国地图各省背景根据数值大小变化的方法
  10. java字符串反转reverse();