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

NLTK

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

英文文本分词处理(NLTK)

分词、取出标点符号

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

使用nltk中的方法:

word_tokenize 分割单词

sent_tokenize 分割句子

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

词性标注

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

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

import nltk
from nltk.corpus import stopwords

line = '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_sm

text = "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)。

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

箭头方向由支配词指向从属词(可视化时的习惯)。将一个句子中所有词语依存关系以有向边的形式表示出来,就会得到一棵树,称为 依存句法树(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" )< code></-->
spaCy(NFP) <-- nsubj -- uses(vbz) <-- root the(dt) det terms(nns) dobj head(vbp) and(cc) cc child(nn) conj to(to) aux describe(vb) xcomp words(nns) describe(vb)< code></-->

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

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

  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("&#x5C0F;&#x7334;&#x5B50;&#x5403;&#x4E86;5&#x6839;&#x9999;&#x8549;")
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("&#x4F9D;&#x5B58;&#x53E5;&#x6CD5;&#x5206;&#x6790;&#x4F5C;&#x4E3A;&#x5E95;&#x5C42;&#x6280;&#x672F;&#xFF0C;&#x53EF;&#x76F4;&#x63A5;&#x7528;&#x4E8E;&#x63D0;&#x5347;&#x5176;&#x4ED6;NLP&#x4EFB;&#x52A1;&#x7684;&#x6548;&#x679C;&#x3002;&#x8FD9;&#x4E9B;&#x4EFB;&#x52A1;&#x5305;&#x62EC;&#x4F46;&#x4E0D;&#x9650;&#x4E8E;&#x8BED;&#x4E49;&#x89D2;&#x8272;&#x6807;&#x6CE8;&#x3001;&#x8BED;&#x4E49;&#x5339;&#x914D;&#x3001;&#x4E8B;&#x4EF6;&#x62BD;&#x53D6;&#x7B49;&#x3002;")" sentence_spans="list(doc.sents)" print(len(sentence_spans)) for sentence in sentence_spans: print(sentence) token doc: print('{0}({1}) <-- token.head.tag_))< code></-->
&#x5C0F;(JJ) <-- amod -- 猴子(nn) <-- nsubj 吃(vv) root 了(as) aux:asp 5(cd) nummod 香蕉(nn) 根(m) mark:clf dobj 依存句法分析作为底层技术,可直接用于提升其他nlp任务的效果。 这些任务包括但不限于语义角色标注、语义匹配、事件抽取等。 依存(jj) 句法(nn) 分析(vv) 作为(vv) ccomp 底层(nn) compound:nn 技术(nn) ,(pu) punct 用于(vv) 可(vv) aux:modal 直接(ad) advmod conj 提升(vv) 其他(dt) det 任务(nn) n(nn) l(nn) p(nn) 的(dec) case 效果(nn) 。(pu) 这些(dt) 包括(vv) 但(ad) 限于(vv) 不(ad) neg 语义(nn) 角色(nn) 标注(vv) 抽取(vv) 、(pu) 匹配(nn) 事件(nn) 等(etc) etc 包括(vv)< code></-->

DDParser解析依存句法树

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

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

百度DDParser的依存分析

#&#x672A;&#x5206;&#x8BCD;&#x65B9;&#x5F0F;
from ddparser import DDParser
ddp = DDParser()
#&#x5355;&#x6761;&#x53E5;&#x5B50;
ddp.parse("&#x767E;&#x5EA6;&#x662F;&#x4E00;&#x5BB6;&#x9AD8;&#x79D1;&#x6280;&#x516C;&#x53F8;")    #&#x8F93;&#x51FA;
#&#x591A;&#x6761;&#x53E5;&#x5B50;
ddp.parse(["&#x767E;&#x5EA6;&#x662F;&#x4E00;&#x5BB6;&#x9AD8;&#x79D1;&#x6280;&#x516C;&#x53F8;", "&#x4ED6;&#x9001;&#x4E86;&#x4E00;&#x672C;&#x4E66;"])    #&#x8F93;&#x51FA;
#&#x8F93;&#x51FA;&#x6982;&#x7387;&#x548C;&#x8BCD;&#x6027;&#x6807;&#x7B7E;
ddp = DDParser(prob=True, use_pos=True)
ddp.parse("&#x767E;&#x5EA6;&#x662F;&#x4E00;&#x5BB6;&#x9AD8;&#x79D1;&#x6280;&#x516C;&#x53F8;")    #&#x8F93;&#x51FA;
#buckets=True, &#x6570;&#x636E;&#x96C6;&#x957F;&#x5EA6;&#x4E0D;&#x5747;&#x65F6;&#x5904;&#x7406;&#x901F;&#x5EA6;&#x66F4;&#x5FEB;
ddp = DDParser(buckets = True)
#&#x4F7F;&#x7528;GPU
ddp = DDParser(use_cuda = True)

#&#x5DF2;&#x5206;&#x8BCD;&#x65B9;&#x5F0F;
from ddparser import DDParser
ddp = DDParser()
#&#x5355;&#x6761;&#x53E5;&#x5B50;
ddp.parse_seg([['&#x4ED6;', '&#x9001;', '&#x4E86;', '&#x4E00;&#x672C;', '&#x4E66;']])
#&#x8F93;&#x51FA;&#x6982;&#x7387;
ddp = DDParser(prob=True)
ddp.parse_seg([['&#x4ED6;', '&#x9001;', '&#x4E86;', '&#x4E00;&#x672C;', '&#x4E66;']])
[{'word': ['&#x767E;&#x5EA6;', '&#x662F;', '&#x4E00;&#x5BB6;', '&#x9AD8;&#x79D1;&#x6280;', '&#x516C;&#x53F8;'], 'head': [2, 0, 5, 5, 2], 'deprel': ['SBV', 'HED', 'ATT', 'ATT', 'VOB']}]

[{'word': ['&#x767E;&#x5EA6;', '&#x662F;', '&#x4E00;&#x5BB6;', '&#x9AD8;&#x79D1;&#x6280;', '&#x516C;&#x53F8;'], 'head': [2, 0, 5, 5, 2], 'deprel': ['SBV', 'HED', 'ATT', 'ATT', 'VOB']}, {'word': [' &#x4ED6;', '&#x9001;', '&#x4E86;', '&#x4E00;&#x672C;', '&#x4E66;'], 'head': [2, 0, 2, 5, 2], 'deprel': ['SBV', 'HED', 'MT', 'ATT', 'VOB']}]

[{'word': ['&#x767E;&#x5EA6;', '&#x662F;', '&#x4E00;&#x5BB6;', '&#x9AD8;&#x79D1;&#x6280;', '&#x516C;&#x53F8;'], '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': ['&#x4ED6;', '&#x9001;', '&#x4E86;', '&#x4E00;&#x672C;', '&#x4E66;'], 'head': [2, 0, 2, 5, 2], 'deprel': ['SBV', 'HED', 'MT', 'ATT', 'VOB']}]

[{'word': ['&#x4ED6;', '&#x9001;', '&#x4E86;', '&#x4E00;&#x672C;', '&#x4E66;'], '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词性分析,实体分析,句法树构造(依存句法树分析)

Original: https://blog.csdn.net/jiangchao98/article/details/119119347
Author: jiangchao98
Title: NLP词性分析,实体分析,句法树构造(依存句法树分析)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/531987/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球