一、概念
指代作为一种常见的语言现象,广泛存在于自然语言的各种表达中(下面的他指的是张三还是小明呢?)
我们人眼一下子就能分辨出上面的他指代张三,但是计算机程序如何识别呢?-指代消解就是来做这个事情
中文的指代主要有以下三种典型的形式:
1.人称代词(Pronoun)
【李明】怕高妈妈一人呆在家里寂寞,【他】便将家里的电视搬了过来。
2.指示代词(Demonstrative)
【很多人都想创造一个美好的世界留给孩子】,【这】可以理解,但不完全正确
3.有定描述(Definite Description)
【贸易制裁】似乎成了【美国政府在对华关系中惯用的大棒】。然而,这【大棒】果真如美国政府所希望的那样灵验吗?
指代消解得类型又可分为下面三种:
1.显性代词消解
所谓显性代词消解,就是指:确定显性代词指向哪个名词短语的问题,代词称为指示语或照应语(Anaphor),其所指向的名词短语一般被称为先行语(Antecedent)
根据二者之间的先后位置,可分为回指(Anaphora)与预指(Cataphora),其中:如果先行语出现在指示语之前,则称为回指,反之则称为预指。
如下图中所示的闲聊型对话机器人,这里有“him”和”he”指向“John”,以及”she”指向”My sister”等,这种指代一般都有显式的代词;
2.零代词消解
与显性代词消解相对,零指代消解,就是没有明确的代词,这部分代词通常来说是省略的
3.共指消解
而共指消解,主要是两个或多个指代词指向同一个实体
二、stanford nlp安装(windows下)
1)需要安装java8:安装Java并设置java的环境变量
2)pip install stanfordcorenlp
3)下载Stanford CoreNLP,并解压
4)由于Stanford NLP是由java开发的,所以如果要使用的话,需要引入相应的jar包,我们想使用中文,找到对应的中文jar包下载即可
注意:一定将下载的中文jar包放到3)中解压的文件夹里
5)运行:若运行下述两行命令没有异常则表明coreNLP安装成功了。
from stanfordcorenlp import StanfordCoreNLP
nlp = StanfordCoreNLP(r'D:\work\stanford-corenlp-4.0.0',lang='zh')
# 这里需要自己指定自己的解压目录
三、使用
1) 对一段句子进行分词(word_tokenize)、词性标注(pos_tag)、命名实体识别(ner)、句法依存分析(dependency_parse)、句法解析(parse)
sentence = "清华大学位于北京市海淀区中关村北大街"
print(nlp.word_tokenize(sentence))
# ['清华', '大学', '位于', '北京市', '海淀区', '中关村', '北大街']
print(nlp.pos_tag(sentence))
#[('清华', 'NR'), ('大学', 'NN'), ('位于', 'VV'), ('北京市', 'NR'), ('海淀区', 'NR'), ('中关村', 'NR'), ('北大街', 'NR')]
print(nlp.ner(sentence))
# [('清华', 'ORGANIZATION'), ('大学', 'ORGANIZATION'), ('位于', 'O'), ('北京市', 'GPE'), ('海淀区', 'GPE'), ('中关村', 'FACILITY'), ('北大街', 'FACILITY')]
print(nlp.dependency_parse(sentence))
# [('ROOT', 0, 3), ('compound:nn', 2, 1), ('nsubj', 3, 2), ('dep', 7, 4), ('dep', 7, 5), ('dep', 7, 6), ('dobj', 3, 7)]
print(nlp.parse(sentence))