当前位置:   article > 正文

中文自然语言处理NLP

中文自然语言处理

1. NLP流程和开元框架

近年来,随着互联网的发展,计算机处理自然语言的需求变得越来越迫切,除了比较悠久的机器翻译外,自然语言处理在信息检索、信息抽取、数据挖掘、舆情分析、文本摘要、自动问答系统等方面都获得了很广泛的应用。
  有关自然语言,特别是语义方面的诸多问题仍未得到解决。目前,完全句法分析、浅层句法分析、信息抽取、词义消歧、潜在语义分析、文本蕴含和指代消解。这些技术都不能完美或者完全的翻译出语言的本义。与程序语言不同,人类语言不具备完整的逻辑结构。
在这里插入图片描述

右侧偏重于语义方面,命名实体识别主要用来用识别语料中的专有名词和未登录词的成词情况,如人名、地名、组织结构。但是准确的命名实体识别是以准确的分词和词性标注为前提的。

语义组块用来确定一个以上的词汇构成的短语结构,即短语级别的标注。主要识别名词性短语、动词性短语、介词短语以及其他类型的短语结构。即语义组块的识别特征必须包含中文分词(命名实体识别)和词性标注。

语义角色标注是以句子中的谓语动词为中心预测出句子的各个语法成分的语义特征,是句子解析的最后一个环节。语义组块、语义角色标注等分析结果,可以通过机器学习方法转换为知识库的RDF三元组形式,并直接用于自动问答系统。

在详细讲解NLP的各个模块之前,首先要介绍几个开源的中文类NLP系统。

优秀的中文分词系统:ICTCLAS分词系统(C++),Ansj中文分词系统(Java),结巴分词(python)

按照使用的算法不同,下面介绍两大类中文分词模块

  • 基于条件随机场(CRF)的中文分词算法的开源系统
  • 基于张华平NShort的中文分词算法的开源系统

2. pyltp安装部署

哈工大提供的pyltp扩展包,扩展包的源码和案例可以从https://github.com/HIT-SCIR/pyltp 下载。下面介绍部署过程

(1)pyltp安装

pip install pyltp

(2)部署语言模型库

https://pan.baidu.com/share/link?shareid=1988562907&uk=2738088569#list/path=%2F&parentPath=%2F

2.1使用Ltp3.3进行中文分词

(1)Ltp3.3安装成功后,新建一个Python文件:

from pyltp import Segmentor #导入ltp库

model_path = "ltp_data_v3.4.0/cws.model"  #Ltp3.3分词模型库
segmentor = Segmentor() #实例化分词模块
segmentor.load(model_path) #加载分词库
#这里不使用外部词典,仅用Ltp3.3进行中文分词

words = segmentor.segment("在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根节点出发深度探索解空间树")
print("|".join(words)) #分词后的结果
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在|包含|问题|的|所有|解|的|解|空间|树|中|,|按照|深度|优先|搜索|的|策略|,|从|根节点|出发|深度|探索|解|空间|树

(2) 分词结果的后处理

观察上述分析结果。“解|空间”、“解|空间|树”、“深度优先”都可以看做一个完整的专有名称:解空间、解空间树、深度优先,而分词器划分的粒度过细。为了获得更精确的结果,可以讲错分的结果合并为专有名词。这就是分词结果的后处理过程。

postdict={"解|空间":"解空间","深度|优先":"深度优先"}
#分词后处理--矫正一些错误的记过
seg_sent = "|".join(words)
for key in postdict:
    seg_sent=seg_sent.replace(key,postdict[key])
print(seg_sent)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在|包含|问题|的|所有|解|的|解空间|树|中|,|按照|深度优先|搜索|的|策略|,|从|根节点|出发|深度|探索|解空间|树

2.2使用jieba分词模块

张华平NShort的中文分词算法是目前大规模中文分词的主流算法。在商用领域,大多数搜索引擎公司都使用该算法作为主要的分词算法。具有算法原理简单、容易理解、便于训练、大规模分词的效率高、模型支持增量扩展、模型占用资源低等优势。

结巴分词可以支持以下三种分词模式:

  • 精确模式:试图将句子最精确的分开,适合文本分析(类似Ltp的分词模式)
  • 全模式,把句子中所有可以成词的词语都扫描出来,速度非常快,但不能解决歧义
  • 搜索引擎模式,在精确模式的基础上对长词再次切分,提高召回率,适合用户搜索引擎分词
  • 支持繁体分词
  • 支持基于概率的用户词典
# -*- coding: UTF-8 -*-

import sys
import os
import jieba #导入结巴分词库

#结巴分词--全模式
sent = "在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根节点出发深度探索解空间树"
wordlist = jieba.cut(sent,cut_all=True)
print("|".join(wordlist))
print(type(wordlist))

#结巴分词--精确切分
wordlist1 = jieba.cut(sent) #cut_all=False
print("|".join(wordlist1))

#结巴分词--搜索引擎模式
wordlist2 = jieba.cut_for_search(sent)
print("|".join(wordlist2))

# jieba.load_userdict('data/userdict.txt') #加载外部词典
# wordlist3 = jieba.cut(sent) #结巴分词--精确切分
# print("|".join(wordlist3))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

在|包含|问题|的|所有|解|的|解空|空间|树|中|||按照|深度|优先|搜索|的|策略|||从|根|节点|点出|出发|深度|探索|索解|解空|空间|树
<class ‘generator’>
在|包含|问题|的|所有|解|的|解|空间|树中|,|按照|深度|优先|搜索|的|策略|,|从根|节点|出发|深度|探索|解|空间|树
在|包含|问题|的|所有|解|的|解|空间|树中|,|按照|深度|优先|搜索|的|策略|,|从根|节点|出发|深度|探索|解|空间|树

2.3词性标注

中文的词性标注比较统一,大多数使用HMM(隐马尔科夫模型)或者最大熵算法,如前文的结巴分词的词性标注实现。为了提高精度,也有使用CRF算法的,如Ltp3.4中的词性标注。

# -*- coding: UTF-8 -*-
from pyltp import *#导入ltp库

model_path = "ltp_data_v3.4.0/cws.model"  #Ltp3.3分词模型库
segmentor = Segmentor() #实例化分词模块
segmentor.load(model_path) #加载分词库

words = segmentor.segment("在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根节点出发深度探索解空间树")
postdict={"解|空间":"解空间","深度|优先":"深度优先"}
#分词后处理--矫正一些错误的记过
seg_sent = "|".join(words)
for key in postdict:
    seg_sent=seg_sent.replace(key,postdict[key])
print(seg_sent)

words_tag = seg_sent.split("|")
postagger = Postagger() #实例化词性标注类
postagger.load("ltp_data_v3.4.0/pos.model") #导入词性标注库
postags = postagger.postag(words_tag)
for word,postag in zip(words_tag,postags):
    print(word+"/"+postag)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在|包含|问题|的|所有|解|的|解空间|树|中|,|按照|深度优先|搜索|的|策略|,|从|根节点|出发|深度|探索|解空间|树
在/p
包含/v
问题/n
的/u
所有/b
解/v
的/u
解空间/n
树/n
中/nd
,/wp
按照/p
深度优先/d
搜索/v
的/u
策略/n
,/wp
从/p
根节点/n
出发/v
深度/n
探索/v
解空间/v
树/n

# -*- coding: UTF-8 -*-

import jieba.posseg as pseg
import jieba
sent = "在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根节点出发深度探索解空间树"
# jieba.load_userdict('data/userdict.txt') #加载外部词典
words = pseg.cut(sent)
for word,flag in words:
    print('%s %s'%(word,flag))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在 p
包含 v
问题 n
的 uj
所有 b
解 v
的 uj
解 v
空间 n
树中 s
, x
按照 p
深度 ns
优先 vn
搜索 v
的 uj
策略 n
, x
从 p
根 a
节点 n
出发 v
深度 ns
探索 v
解 v
空间 n
树 v

3 StandfordNLP

在使用StandfordNLP系统进行中文词性标注之前,需要安装JDK环境。然后在https://nlp.stanford.edu/software/CRF-NER.shtml 中的https://stanfordnlp.github.io/CoreNLP/index.html#download 中下载两个文件。分别是stanford-chinese-corenlp-2018-10-05-models.jar和stanford-corenlp-full-2018-10-05.zip。
将stanford-chinese-corenlp-2018-10-05-models.jar复制到stanford-corenlp-full-2018-10-05中
在这里插入图片描述

在Python环境下调用Stanfordcorenlp(要事先安装jdk1.8)

pip install stanfordcorenlp

  • 方式一:直接使用路径
from stanfordcorenlp import StanfordCoreNLP
 
nlp = StanfordCoreNLP(r'/root/pyspark/NLP/stanford-corenlp-full-2018-10-05')
#这里改成你stanford-corenlp所在的目录
sentence = 'Guangdong University of Foreign Studies is located in Guangzhou.'
print('Tokenize:', nlp.word_tokenize(sentence))
print('Part of Speech:', nlp.pos_tag(sentence))
print('Named Entities:', nlp.ner(sentence))
print('Constituency Parsing:', nlp.parse(sentence))
print('Dependency Parsing:', nlp.dependency_parse(sentence))
 
nlp.close() # Do not forget to close! The backend server will consume a lot memery.

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Tokenize: [‘Guangdong’, ‘University’, ‘of’, ‘Foreign’, ‘Studies’, ‘is’, ‘located’, ‘in’, ‘Guangzhou’, ‘.’]
Part of Speech: [(‘Guangdong’, ‘NNP’), (‘University’, ‘NNP’), (‘of’, ‘IN’), (‘Foreign’, ‘NNP’), (‘Studies’, ‘NNPS’), (‘is’, ‘VBZ’), (‘located’, ‘JJ’), (‘in’, ‘IN’), (‘Guangzhou’, ‘NNP’), (’.’, ‘.’)]
Named Entities: [(‘Guangdong’, ‘ORGANIZATION’), (‘University’, ‘ORGANIZATION’), (‘of’, ‘ORGANIZATION’), (‘Foreign’, ‘ORGANIZATION’), (‘Studies’, ‘ORGANIZATION’), (‘is’, ‘O’), (‘located’, ‘O’), (‘in’, ‘O’), (‘Guangzhou’, ‘CITY’), (’.’, ‘O’)]
Constituency Parsing: (ROOT
(S
(NP
(NP (NNP Guangdong) (NNP University))
(PP (IN of)
(NP (NNP Foreign) (NNPS Studies))))
(VP (VBZ is)
(ADJP (JJ located)
(PP (IN in)
(NP (NNP Guangzhou)))))
(. .)))
Dependency Parsing: [(‘ROOT’, 0, 7), (‘compound’, 2, 1), (‘nsubjpass’, 7, 2), (‘case’, 5, 3), (‘compound’, 5, 4), (‘nmod’, 2, 5), (‘auxpass’, 7, 6), (‘case’, 9, 8), (‘nmod’, 7, 9), (‘punct’, 7, 10)]

  • 启动CoreNLP服务器命令
    java -mx4g -cp “*” edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9001 -timeout 15000
# coding=utf-8
 
from stanfordcorenlp import StanfordCoreNLP
nlp = StanfordCoreNLP('http://localhost', port=9001)
#这里改成了我们server的地址
sentence = 'Functions shall be declared at file scope.'
print(nlp.word_tokenize(sentence))
print(nlp.pos_tag(sentence))
print(nlp.ner(sentence))
print(nlp.parse(sentence))
print(nlp.dependency_parse(sentence))
nlp.close()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

[‘Functions’, ‘shall’, ‘be’, ‘declared’, ‘at’, ‘file’, ‘scope’, ‘.’]
[(‘Functions’, ‘NNS’), (‘shall’, ‘MD’), (‘be’, ‘VB’), (‘declared’, ‘VBN’), (‘at’, ‘IN’), (‘file’, ‘NN’), (‘scope’, ‘NN’), (’.’, ‘.’)]
[(‘Functions’, ‘O’), (‘shall’, ‘O’), (‘be’, ‘O’), (‘declared’, ‘O’), (‘at’, ‘O’), (‘file’, ‘O’), (‘scope’, ‘O’), (’.’, ‘O’)]
(ROOT
(S
(NP (NNS Functions))
(VP (MD shall)
(VP (VB be)
(VP (VBN declared)
(PP (IN at)
(NP (NN file) (NN scope))))))
(. .)))
[(‘ROOT’, 0, 4), (‘nsubjpass’, 4, 1), (‘aux’, 4, 2), (‘auxpass’, 4, 3), (‘case’, 7, 5), (‘compound’, 7, 6), (‘nmod’, 4, 7), (‘punct’, 4, 8)]

在这里插入图片描述

ROOT:要处理文本的语句
IP:简单从句
NP:名词短语
VP:动词短语
PU:断句符,通常是句号、问号、感叹号等标点符号
LCP:方位词短语
PP:介词短语
CP:由‘的’构成的表示修饰性关系的短语
DNP:由‘的’构成的表示所属关系的短语
ADVP:副词短语
ADJP:形容词短语
DP:限定词短语
QP:量词短语
NN:常用名词
NR:固有名词
NT:时间名词
PN:代词
VV:动词
VC:是
CC:表示连词
VE:有
VA:表语形容词
AS:内容标记(如:了)
VRD:动补复合词
CD: 表示基数词
DT: determiner 表示限定词
EX: existential there 存在句
FW: foreign word 外来词
IN: preposition or conjunction, subordinating 介词或从属连词
JJ: adjective or numeral, ordinal 形容词或序数词
JJR: adjective, comparative 形容词比较级
JJS: adjective, superlative 形容词最高级
LS: list item marker 列表标识
MD: modal auxiliary 情态助动词
PDT: pre-determiner 前位限定词
POS: genitive marker 所有格标记
PRP: pronoun, personal 人称代词
RB: adverb 副词
RBR: adverb, comparative 副词比较级
RBS: adverb, superlative 副词最高级
RP: particle 小品词 
SYM: symbol 符号
TO:”to” as preposition or infinitive marker 作为介词或不定式标记 
WDT: WH-determiner WH限定词
WP: WH-pronoun WH代词
WP$: WH-pronoun, possessive WH所有格代词
WRB:Wh-adverb WH副词

关系表示
abbrev: abbreviation modifier,缩写
acomp: adjectival complement,形容词的补充;
advcl : adverbial clause modifier,状语从句修饰词
advmod: adverbial modifier状语
agent: agent,代理,一般有by的时候会出现这个
amod: adjectival modifier形容词
appos: appositional modifier,同位词
attr: attributive,属性
aux: auxiliary,非主要动词和助词,如BE,HAVE SHOULD/COULD等到
auxpass: passive auxiliary 被动词
cc: coordination,并列关系,一般取第一个词
ccomp: clausal complement从句补充
complm: complementizer,引导从句的词好重聚中的主要动词
conj : conjunct,连接两个并列的词。
cop: copula。系动词(如be,seem,appear等),(命题主词与谓词间的)连系
csubj : clausal subject,从主关系
csubjpass: clausal passive subject 主从被动关系
dep: dependent依赖关系
det: determiner决定词,如冠词等
dobj : direct object直接宾语
expl: expletive,主要是抓取there
infmod: infinitival modifier,动词不定式
iobj : indirect object,非直接宾语,也就是所以的间接宾语;
mark: marker,主要出现在有“that” or “whether”“because”, “when”,
mwe: multi-word expression,多个词的表示
neg: negation modifier否定词
nn: noun compound modifier名词组合形式
npadvmod: noun phrase as adverbial modifier名词作状语
nsubj : nominal subject,名词主语
nsubjpass: passive nominal subject,被动的名词主语
num: numeric modifier,数值修饰
number: element of compound number,组合数字
parataxis: parataxis: parataxis,并列关系
partmod: participial modifier动词形式的修饰
pcomp: prepositional complement,介词补充
pobj : object of a preposition,介词的宾语
poss: possession modifier,所有形式,所有格,所属
possessive: possessive modifier,这个表示所有者和那个’S的关系
preconj : preconjunct,常常是出现在 “either”, “both”, “neither”的情况下
predet: predeterminer,前缀决定,常常是表示所有
prep: prepositional modifier
prepc: prepositional clausal modifier
prt: phrasal verb particle,动词短语
punct: punctuation,这个很少见,但是保留下来了,结果当中不会出现这个
purpcl : purpose clause modifier,目的从句
quantmod: quantifier phrase modifier,数量短语
rcmod: relative clause modifier相关关系
ref : referent,指示物,指代
rel : relative
root: root,最重要的词,从它开始,根节点
tmod: temporal modifier
xcomp: open clausal complement
xsubj : controlling subject 掌控者
中心语为谓词
  subj — 主语
 nsubj — 名词性主语(nominal subject) (同步,建设)
   top — 主题(topic) (是,建筑)
npsubj — 被动型主语(nominal passive subject),专指由“被”引导的被动句中的主语,一般是谓词语义上的受事 (称作,镍)
 csubj — 从句主语(clausal subject),中文不存在
 xsubj — x主语,一般是一个主语下面含多个从句 (完善,有些)
中心语为谓词或介词   
   obj — 宾语
  dobj — 直接宾语 (颁布,文件)
  iobj — 间接宾语(indirect object),基本不存在
 range — 间接宾语为数量词,又称为与格 (成交,元)
  pobj — 介词宾语 (根据,要求)
  lobj — 时间介词 (来,近年)
中心语为谓词
  comp — 补语
 ccomp — 从句补语,一般由两个动词构成,中心语引导后一个动词所在的从句(IP) (出现,纳入)
 xcomp — x从句补语(xclausal complement),不存在   
 acomp — 形容词补语(adjectival complement)
 tcomp — 时间补语(temporal complement) (遇到,以前)
lccomp — 位置补语(localizer complement) (占,以上)
       — 结果补语(resultative complement)
中心语为名词
   mod — 修饰语(modifier)
  pass — 被动修饰(passive)
  tmod — 时间修饰(temporal modifier)
 rcmod — 关系从句修饰(relative clause modifier) (问题,遇到)
 numod — 数量修饰(numeric modifier) (规定,若干)
ornmod — 序数修饰(numeric modifier)
   clf — 类别修饰(classifier modifier) (文件,件)
  nmod — 复合名词修饰(noun compound modifier) (浦东,上海)
  amod — 形容词修饰(adjetive modifier) (情况,新)
advmod — 副词修饰(adverbial modifier) (做到,基本)
  vmod — 动词修饰(verb modifier,participle modifier)
prnmod — 插入词修饰(parenthetical modifier)
   neg — 不定修饰(negative modifier) (遇到,不)
   det — 限定词修饰(determiner modifier) (活动,这些)
 possm — 所属标记(possessive marker),NP
  poss — 所属修饰(possessive modifier),NP
  dvpm — DVP标记(dvp marker),DVP (简单,的)
dvpmod — DVP修饰(dvp modifier),DVP (采取,简单)
  assm — 关联标记(associative marker),DNP (开发,的)
assmod — 关联修饰(associative modifier),NP|QP (教训,特区)
  prep — 介词修饰(prepositional modifier) NP|VP|IP(采取,对)
 clmod — 从句修饰(clause modifier) (因为,开始)
 plmod — 介词性地点修饰(prepositional localizer modifier) (在,上)
   asp — 时态标词(aspect marker) (做到,了)
partmod– 分词修饰(participial modifier) 不存在
   etc — 等关系(etc) (办法,等)
中心语为实词
  conj — 联合(conjunct)
   cop — 系动(copula) 双指助动词????
    cc — 连接(coordination),指中心词与连词 (开发,与)
其它
  attr — 属性关系 (是,工程)
cordmod– 并列联合动词(coordinated verb compound) (颁布,实行)
  mmod — 情态动词(modal verb) (得到,能)
    ba — 把字关系
tclaus — 时间从句 (以后,积累)
       — semantic dependent
   cpm — 补语化成分(complementizer),一般指“的”引导的CP (振兴,的)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/343315
推荐阅读
相关标签
  

闽ICP备14008679号