Stanford CoreNLP 入门指南

最近一直在写毕业论文,因为是一个基于语料库分析的题目,所以牵扯到了词性标注、句法分析等等内容。在一番查找之后,决定用 Stanford CoreNLP 来进行处理,一方面是因为这个工具本身功能齐全,另一方面也是因为这个工具比较容易上手使用。在使用过程中慢慢发现目前这一工具的中文教程或者说明还比较不完善,大多数教程都是复制来复制去的几张图,很多需要注意的地方都没有涉及,所以决定写一篇文章来总结一下这个工具主要的使用方法。但是,这并不是一篇讲自然语言处理技术的文章,只是一个使用指南,更适合语言学方向以及单纯需要处理语料的需求,不会涉及原理。
因为我是在 Python 当中使用的,所以这篇文章也会着重于如何在 Python 中使用这个工具,IDE 选择 Jupyter Notebook。另外,也会涉及一点跟 Pandas 的配合问题,但不会展开讲怎么使用 Pandas,NumPy 这类数据分析包。截止到开始写这篇文章的时候 Stanford CoreNLP 更新到了 4.0.0 版本,但是我在使用的时候是 3.9.2,所以文章中可能有这两个版本出现在不同的截图里,但不影响使用。
0. Stanford CoreNLP 是个啥?
是一个自然语言处理工具包。它集成了很多非常实用的功能,包括分词,词性标注,句法分析等等。这不是一个深度学习框架,而是一个已经训练好的模型,实际上可以类比为一个软件。目前市面上有不少类似的工具,结巴分词、清华、哈工大等等,相比之下我个人认为斯坦福这一款有三个值得选择的理由(也可能是优势,但是我没用过其他工具所以没法比):
- 功能足够多,一站式解决所有主流需求;
- 操作足够方便,放到 Python 里基本上就是一两行代码;
- 语言支持广泛,目前支持阿拉伯语,中文,英文,法语,德语,西班牙语,做平行语料的对比非常方便。
Stanford CoreNLP 本身是 Java 写的,提供了 Server 的方式进行交互,可以很方便地在Python 中使用。
官方网站:
这个网站非常非常的有用,虽然很多信息被安排在非常犄角旮旯的地方,但几乎所有问题都可以从这里找到指导。
1. 下载和安装
下载地址就在上面那个官方网站里,打开首页就有下载链接。


这里说一下需要下载什么。中间那个大大的‘Download CoreNLP 4.0.0’是必须要下载的部分,是这个工具的核心。底下那个框里是语言包的下载链接,按需下载即可。核心部分本身包含了英语的处理能力,如果只是用来处理英语语料,那就只点那个红色按钮就可以了,如果还有其它语言需求,或者需要对英语语料做关系提取等更多处理,那就下载相应的语言包。
下载之后核心部分是一个压缩包,直接解压缩即可。语言包是 jar 包,需要复制到核心部分的根文件夹下。之后下载工作就告一段落了。


注意:这里一定要确保文件夹路径不含中文,否则之后是读不进去的。
接下来是具体的安装和导入。
首先打开 Python,使用 pip 安装 stanfordcorenlp。可以使用国内镜像加快速度(下面那一行)。
pip install stanfordcorenlp
pip install stanfordcorenlp -i http://pypi.mirrors.ustc.edu.cn/simple/ --trusted-host pypi.mirrors.ustc.edu.cn
之后使用过程就很简单了,每次使用的时候执行下面这几行语句:
from stanfordcorenlp import StanfordCoreNLP
#默认是英文
nlp = StanfordCoreNLP(r’c:\Code\Jupyter Notebook\stanford-corenlp-full-2018-10-05’)
#如果要用其他语言,需要单独设置
nlp_ch = StanfordCoreNLP(r’c:\Code\Jupyter Notebook\stanford-corenlp-full-2018-10-05’, lang=‘zh’)
读入的地址是文件夹地址,不指定语言的话默认是英语,不能指定未下载语言包的语言。在这里,CoreNLP 不能在同一个语料中处理两种不同的语言,比如“他听到录音里说:‘Please open your textbook.’。”这句话无论是用指定英语的 nlp 还是指定中文的 nlp_ch 都是没法正确处理的。
需要注意的是,工具本身是无法识别语言的,也就是说如果用指定英语的 nlp 去处理一个中文句子,那么它同样会给出结果,只不过这个结果显然不正确。所以如果有多语种处理需求,一定要注意使用正确的 nlp 去处理。
至此,我们就可以在 Python 中使用 CoreNLP 了。关于在其他语言中使用可以参考官网上的说明,这里就不展开了。
2. 分词 Tokenization
分词应该是最基础也最简单的操作了。代码如下:
nlp.word_tokenize(‘This is an example of tokenziation.’)
#结果:[‘This’, ‘is’, ‘an’, ‘example’, ‘of’, ‘tokenziation’, ‘.’]
nlp_ch.word_tokenize(‘浙江大学有七个校区。’)
#结果:[‘浙江’, ‘大学’, ‘有’, ‘七’, ‘个’, ‘校区’, ‘。’]
这里可以看到英语的分词就是简单的分词,包括标点,而中文的分词则是在识别单词。就中文分词来说,不同工具的处理结果往往不同,比如有的工具可能会把‘浙江大学’视为一个词而非两个。就我个人的使用经验来说,StanfordCoreNLP 一般会把中文分词分到最细的状态。
word_tokenize 这个方法的返回值是一个 list,处理起来非常的方便,但要注意一点,如果使用 Pandas,那 list 是无法保存的。一个比较常见的操作是使用一个 DataFrame 来装语料,每一句语料对应一行,然后添加一列来装对应句子的 tokens,那么在刚刚操作完的时候这一列装的是一列 list,但如果接下来把这个 DataFrame 保存成文件,比如 csv 文件,那么下次再重新读取进来的时候这一列 DataFrame 就变成了字符串格式,也就是说保存再读取会让包含七个元素的 list 变为‘[‘This’, ‘is’, ‘an’, ‘example’, ‘of’, ‘tokenziation’, ‘.’]’这样一个字符串。当然,处理方式也非常的简单,比如下面这个方法就可以重新得到一个 list:
#仅适用于 token 字符串的处理
def stringToList(x):
s = x[2:len(x)-2]
l = s.split(“', '”)
return l
3. 词性标注 Part-of-speech Tagging
nlp.pos_tag(‘This is an example of tokenziation.’)
#结果:[(‘This’, ‘DT’), (‘is’, ‘VBZ’), (‘an’, ‘DT’), (‘example’, ‘NN’), (‘of’, ‘IN’), (‘tokenziation’, ‘NN’), (‘.’, ‘.’)]
nlp_ch.pos_tag(‘浙江大学有七个校区。’)
#结果:[(‘浙江’, ‘NR’), (‘大学’, ‘NN’), (‘有’, ‘VE’), (‘七’, ‘CD’), (‘个’, ‘M’), (‘校区’, ‘NN’), (‘。’, ‘PU’)]
词性标注实际上包含了分词和标注两个部分。标注的含义在第五部分。跟分词结果一样,POS的结果一旦保存再读取也会变成字符串,所以一般还是需要处理一下。
4. 句法成分分析 Constituency Parsing
print (nlp.parse(‘This is an example of tokenziation.’))
‘’’
结果:
(ROOT
(S
(NP (DT This))
(VP (VBZ is)
(NP
(NP (DT an) (NN example))
(PP (IN of)
(NP (NN tokenziation)))))
(. .)))
‘’’
print (nlp_ch.parse(‘浙江大学有七个校区。’))
‘’’
结果:
(ROOT
(IP
(NP (NR 浙江) (NN 大学))
(VP (VE 有)
(NP
(QP (CD 七)
(CLP (M 个)))
(NP (NN 校区))))
(PU 。)))
‘’'
句法分析的标注实际上是由两个部分组成的,在最小的一层括号内实际上就是词性标注,而除此之外则是与句子结构相关的标注。句法分析的标注也在第五部分给出。
5. 标注集 Tagset
CoreNLP 使用的是宾州树库的标注集(Penn Treebank Tagset),无论中英。目前在中文网络上,中文标注集总结的比较全,但英文标注集基本上没有完全正确的,尤其是句法相关的标注。下面是一个包含了中英文词性和句法标注的会总。
Penn Treebank Tagset
Clause Level
S Simple declarative clause, i.e. one that is not introduced by a (possible empty) subordinating conjunction or a wh-word and that does not exhibit subject-verb inversion.
SBAR Clause introduced by a (possibly empty) subordinating conjunction.
SBARQ Direct question introduced by a wh-word or a wh-phrase. Indirect questions and relative clauses should be bracketed as SBAR, not SBARQ.
SINV Inverted declarative sentence, i.e. one in which the subject follows the tensed verb or modal.
SQ Inverted yes/no question, or main clause of a wh-question, following the wh-phrase in SBARQ.
Phrase Level
ADJP Adjective Phrase.
ADVP Adverb Phrase.
CONJP Conjunction Phrase.
FRAG Fragment.
INTJ Interjection. Corresponds approximately to the part-of-speech tag UH.
LST List marker. Includes surrounding punctuation.
NAC Not a Constituent; used to show the scope of certain prenominal modifiers within an NP.
NP Noun Phrase.
NX Used within certain complex NPs to mark the head of the NP. Corresponds very roughly to N-bar level but used quite differently.
PP Prepositional Phrase.
PRN Parenthetical.
PRT Particle. Category for words that should be tagged RP.
QP Quantifier Phrase (i.e. complex measure/amount phrase); used within NP.
RRC Reduced Relative Clause.
UCP Unlike Coordinated Phrase.
VP Vereb Phrase.
WHADJP Wh-adjective Phrase. Adjectival phrase containing a wh-adverb, as in how hot.
WHAVP Wh-adverb Phrase. Introduces a clause with an NP gap. May be null (containing the 0 complementizer) or lexical, containing a wh-adverb such as how or why.
WHNP Wh-noun Phrase. Introduces a clause with an NP gap. May be null (containing the 0 complementizer) or lexical, containing some wh-word, e.g. who, which book, whose daughter, none of which, or how many leopards.
WHPP Wh-prepositional Phrase. Prepositional phrase containing a wh-noun phrase (such as of which or by whose authority) that either introduces a PP gap or is contained by a WHNP.
X Unknown, uncertain, or unbracketable. X is often used for bracketing typos and in bracketing the…the-constructions.
Word level
CC Coordinating conjunction
CD Cardinal number
DT Determiner
EX Existential there
FW Foreign word
IN Preposition or subordinating conjunction
JJ Adjective
JJR Adjective, comparative
JJS Adjective, superlative
LS List item marker
MD Modal
NN Noun, singular or mass
NNS Noun, plural
NNP Proper noun, singular
NNPS Proper noun, plural
PDT Predeterminer
POS Possessive ending
PRP Personal pronoun
PRP$ Possessive pronoun (prolog version PRP-S)
RB Adverb
RBR Adverb, comparative
RBS Adverb, superlative
RP Particle
SYM Symbol
TO to
UH Interjection
VB Verb, base form
VBD Verb, past tense
VBG Verb, gerund or present participle
VBN Verb, past participle
VBP Verb, non-3rd person singular present
VBZ Verb, 3rd person singular present
WDT Wh-determiner
WP Wh-pronoun
WP$ Possessive wh-pronoun (prolog version WP-S)
WRB Wh-adverb
上面是宾州树库的标注集[1],但是中文的标注集实际上是 Penn Chinese Treebank Tagset,跟这个有所区别,可以参考下面这个链接: