标签归档:斯坦福中文分词

中文命名实体识别工具(NER)哪家强?

自去年以来,在AINLP公众号上陆续给大家提供了自然语言处理相关的基础工具的在线测试接口,使用很简单,关注AINLP公众号,后台对话关键词触发测试,例如输入 “中文分词 我爱自然语言处理”,“词性标注 我爱NLP”,“情感分析 自然语言处理爱我","Stanza 52nlp" 等,具体可参考下述文章:

五款中文分词工具在线PK: Jieba, SnowNLP, PkuSeg, THULAC, HanLP
中文分词工具在线PK新增:FoolNLTK、LTP、StanfordCoreNLP
Python中文分词工具大合集:安装、使用和测试
八款中文词性标注工具使用及在线测试
百度深度学习中文词法分析工具LAC试用之旅
来,试试百度的深度学习情感分析工具
AINLP公众号新增SnowNLP情感分析模块
斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

既然中文分词、词性标注已经有了,那下一步很自然想到的是命名实体识别(NER,Named-entity recognition)工具了,不过根据我目前了解到的情况,开源的中文命名实体工具并不多,这里主要指的是一些成熟的自然语言处理开源工具,不是github上一些学习性质的代码。目前明确有NER标记的包括斯坦福大学的NLP组的Stanza,百度的Paddle Lac,哈工大的LTP,而其他这些测试过的开源NLP基础工具,需要从词性标注结果中提取相对应的专有名词,也算是一种折中方案。

在之前这些可测的工具中,除了斯坦福大学的Stanza和CoreNLP有一套词性标记外,LTP使用的是863词性标注集,其他包括Jieba,SnowNLP,PKUSeg,Thulac,HanLP,FoolNLTK,百度Lac等基础工具的词性标注集主要是以人民日报标注语料中的北京大学词性标注集(40+tags)为蓝本:

代码 名称 帮助记忆的诠释
Ag 形语素 形容词性语素。 形容词代码为 a ,语素代码 g 前面置以 A。
a 形容词 取英语形容词 adjective 的第 1 个字母。
ad 副形词 直接作状语的形容词。 形容词代码 a 和副词代码 d 并在一起。
an 名形词 具有名词功能的形容词。 形容词代码 a 和名词代码 n 并在一起。
b 区别词 取汉字“别”的声母。
c 连词 取英语连词 conjunction 的第 1 个字母。
Dg 副语素 副词性语素。 副词代码为 d ,语素代码 g 前面置以 D。
d 副词 取 adverb 的第 2 个字母 ,因其第 1 个字母已用于形容词。
e 叹词 取英语叹词 exclamation 的第 1 个字母。
f 方位词 取汉字“方” 的声母。
g 语素 绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。 由于实际标注时 ,一定
标注其子类 ,所以从来没有用到过 g。
h 前接成分 取英语 head 的第 1 个字母。
i 成语 取英语成语 idiom 的第 1 个字母。
j 简称略语 取汉字“简”的声母。
k 后接成分
l 习用语 习用语尚未成为成语 ,有点“临时性”,取“临”的声母。
m 数词 取英语 numeral 的第 3 个字母 ,n ,u 已有他用。
Ng 名语素 名词性语素。 名词代码为 n ,语素代码 g 前面置以 N。
n 名词 取英语名词 noun 的第 1 个字母。
nr 人名 名词代码 n 和“人(ren) ”的声母并在一起。
ns 地名 名词代码 n 和处所词代码 s 并在一起。
nt 机构团体 “团”的声母为 t,名词代码 n 和 t 并在一起。
nx 非汉字串
nz 其他专名 “专”的声母的第 1 个字母为 z,名词代码 n 和 z 并在一起。
o 拟声词 取英语拟声词 onomatopoeia 的第 1 个字母。
p 介词 取英语介词 prepositional 的第 1 个字母。
q 量词 取英语 quantity 的第 1 个字母。
r 代词 取英语代词 pronoun 的第 2 个字母,因 p 已用于介词。
s 处所词 取英语 space 的第 1 个字母。
Tg 时语素 时间词性语素。时间词代码为 t,在语素的代码 g 前面置以 T。
t 时间词 取英语 time 的第 1 个字母。
u 助词 取英语助词 auxiliary 的第 2 个字母,因 a 已用于形容词。
Vg 动语素 动词性语素。动词代码为 v。在语素的代码 g 前面置以 V。
v 动词 取英语动词 verb 的第一个字母。
vd 副动词 直接作状语的动词。动词和副词的代码并在一起。
vn 名动词 指具有名词功能的动词。动词和名词的代码并在一起。
w 标点符号
x 非语素字 非语素字只是一个符号,字母 x 通常用于代表未知数、符号。
y 语气词 取汉字“语”的声母。
z 状态词 取汉字“状”的声母的前一个字母。

其中HanLp增加了更细粒度的词性标注集,具体可参考:https://www.hankcs.com/nlp/part-of-speech-tagging.html

HanLP使用的HMM词性标注模型训练自2014年人民日报切分语料,随后增加了少量98年人民日报中独有的词语。所以,HanLP词性标注集兼容《ICTPOS3.0汉语词性标记集》,并且兼容《现代汉语语料库加工规范——词语切分与词性标注》。

另外百度词法分析工具Lac使用的词性标注集中特别加了一套强相关的专名类别标签:

词性和专名类别标签集合如下表,其中词性标签24个(小写字母),专名类别标签4个(大写字母)。这里需要说明的是,人名、地名、机名和时间四个类别,在上表中存在两套标签(PER / LOC / ORG / TIME 和 nr / ns / nt / t),被标注为第二套标签的词,是模型判断为低置信度的人名、地名、机构名和时间词。开发者可以基于这两套标签,在四个类别的准确、召回之间做出自己的权衡。

哈工大LTP的命名实体标注集没有提取“时间”,具体参考如下:

https://ltp.readthedocs.io/zh_CN/latest/appendix.html

NE识别模块的标注结果采用O-S-B-I-E标注形式,其含义为

标记 含义
O 这个词不是NE
S 这个词单独构成一个NE
B 这个词为一个NE的开始
I 这个词为一个NE的中间
E 这个词位一个NE的结尾

LTP中的NE 模块识别三种NE,分别如下:

标记 含义
Nh 人名
Ni 机构名
Ns 地名

基于上述观察,我决定采用这种方案做中文命名实体工具测试接口:对于斯坦福Stanza的NER结果直接保留,对于 Baidu Lac 结果则保留强置信度的人名(PER)、地名(LOC)、机构名(ORG)、时间(TIME)提取结果,对于哈工大LTP的NER结果做个人名(Nh=>PER)、地名(Ns=>LOC)和机构名(Ni=>ORG)的映射,对于其他几个工具,去除斯坦福的老NLP工具CoreNLP,其他NLP工具则保留nr、ns、nt、t、nz这几个提取工具,并做了标记映射人名(nr=>PER),地名(ns=>LOC),机构名(nt=>ORG),时间(t=>TIME)。下面是几组测试结果,欢迎关注AINLP公众号试用,结果仅供参考,毕竟除了斯坦福Stanza、Baidu Lac以及哈工大LTP外,其他几个工具的“NER命名实体识别”功能是“强加”的,在实际使用中,可以根据需求采用:

八款中文词性标注工具使用及在线测试

结束了中文分词工具的安装、使用及在线测试,开启中文词性标注在线测试之旅,一般来说,中文分词工具大多数都附带词性标注功能的,这里测试了之前在AINLP公众号上线的8款中文分词模块或者工具,发现它们都是支持中文词性标注的,这里面唯一的区别,就是各自用的词性标注集可能有不同:

以下逐一介绍这八个工具的中文词性标注功能的使用方法,至于安装,这里简要介绍,或者可以参考之前这篇文章:Python中文分词工具大合集:安装、使用和测试,以下是在Ubuntu16.04 & Python3.x的环境下安装及测试。
继续阅读

Python中文分词工具大合集:安装、使用和测试

这篇文章事实上整合了前面两篇文章的相关介绍,同时添加一些其他的Python中文分词相关资源,甚至非Python的中文分词工具,仅供参考。

首先介绍之前测试过的8款中文分词工具,这几款工具可以直接在AINLP公众号后台在线测试,严格的说,它们不完全是纯粹的中文分词工具,例如SnowNLP, Thulac, HanLP,LTP,CoreNLP都是很全面的(中文)自然语言处理工具。安装这些模块其实很简单,只要按官方文档的方法安装即可,以下做个简单介绍,在Python3.x的环境下测试,Ubuntu16.04 或 MacOS 测试成功。

再附加介绍12款其他的中文分词工具或者中文分词模块,最后的两款fnlp和ansj是比较棒的java中文分词工具,貌似还没有python接口,记录一下。这些中文分词工具我没有测试,感兴趣的同学可以动手试试。
继续阅读

中文分词工具在线PK新增:FoolNLTK、HITLTP、StanfordCoreNLP

继续中文分词在线PK之旅,上文《五款中文分词工具在线PK: Jieba, SnowNLP, PkuSeg, THULAC, HanLP》我们选择了5个中文分词开源工具,这次再追加3个,分别是FoolNLTK、哈工大LTP(pyltp, ltp的python封装)、斯坦福大学的CoreNLP(stanfordcorenlp is a Python wrapper for Stanford CoreNLP),现在可以在AINLP公众号测试一下:中文分词 我爱自然语言处理

以下是在Python3.x & Ubuntu16.04 的环境下测试及安装这些中文分词器:
继续阅读

Python自然语言处理工具NLTK学习导引及相关资料

NLTK 大概是最知名的Python自然语言处理工具了,全称"Natural Language Toolkit", 诞生于宾夕法尼亚大学,以研究和教学为目的而生,因此也特别适合入门学习。NLTK虽然主要面向英文,但是它的很多NLP模型或者模块是语言无关的,因此如果某种语言有了初步的Tokenization或者分词,NLTK的很多工具包是可以复用的。

关于NLTK,网上已经有了很多介绍资料,当然首推的NLTK学习资料依然是官方出的在线书籍 NLTK Book:Natural Language Processing with Python – Analyzing Text with the Natural Language Toolkit ,目前基于Python 3 和 NLTK 3 ,可以在线免费阅读和学习。早期的时候还有一个基于Python 2 的老版本:http://www.nltk.org/book_1ed/ ,被 O'Reilly 正式出版过,2012年的时候,国内的陈涛同学无偿翻译过一个中文版,我还在这里推荐过:推荐《用Python进行自然语言处理》中文翻译-NLTK配套书 ,后来才有了基于此版本的更正式的中文翻译版:《Python自然语言处理》。不过如果英文ok的话,优先推荐看目前官方的最新版本:http://www.nltk.org/book/

几年前我尝试写英文博客,觉得可以从NLTK的入门介绍开始,所以写了一个英文系列:Dive into NLTK,基于Python 2,感兴趣的同学可以关注:

Part I: Getting Started with NLTK
Part II: Sentence Tokenize and Word Tokenize
Part III: Part-Of-Speech Tagging and POS Tagger
Part IV: Stemming and Lemmatization
Part V: Using Stanford Text Analysis Tools in Python
Part VI: Add Stanford Word Segmenter Interface for Python NLTK
Part VII: A Preliminary Study on Text Classification
Part VIII: Using External Maximum Entropy Modeling Libraries for Text Classification
Part IX: From Text Classification to Sentiment Analysis
Part X: Play With Word2Vec Models based on NLTK Corpus
Part XI: From Word2Vec to WordNet

这个过程中使用了NLTK中嵌入的斯坦福大学文本分析工具包,发现少了斯坦福中文分词器,所以当时动手加了一个:Python自然语言处理实践: 在NLTK中使用斯坦福中文分词器

斯坦福大学自然语言处理组是世界知名的NLP研究小组,他们提供了一系列开源的Java文本分析工具,包括分词器(Word Segmenter),词性标注工具(Part-Of-Speech Tagger),命名实体识别工具(Named Entity Recognizer),句法分析器(Parser)等,可喜的事,他们还为这些工具训练了相应的中文模型,支持中文文本处理。在使用NLTK的过程中,发现当前版本的NLTK已经提供了相应的斯坦福文本处理工具接口,包括词性标注,命名实体识别和句法分析器的接口,不过可惜的是,没有提供分词器的接口。在google无果和阅读了相应的代码后,我决定照猫画虎为NLTK写一个斯坦福中文分词器接口,这样可以方便的在Python中调用斯坦福文本处理工具。

后来,这个版本在 NLTK 3.2 官方版本中被正式引入:stanford_segmenter.py ,我也可以小自豪一下为NLTK做过一点微小的贡献:

使用NLTK来处理中文是很多同学想干的事情,这方面,在NLTK中调用斯坦福大学的中文工具包刚好是一个切入点,关于NLTK中如何使用斯坦福大学工具包进行中文信息处理,推荐两篇文章:

在 NLTK 中使用 Stanford NLP 工具包http://www.zmonster.me/2016/06/08/use-stanford-nlp-package-in-nltk.html

以及白宁超同学的系列文章:

干货!详述Python NLTK下如何使用stanford NLP工具包http://www.cnblogs.com/baiboy/p/nltk1.html

关于NLTK的书籍,其实还有一本很不错:Python Text Processing with NLTK 2.0 Cookbook ,我之前看过这本,不过现在已经更新到Python 3了:Python 3 Text Processing with NLTK 3 Cookbook 。最后提供一个NLTK相关资料的打包下载,包括早期的中文翻译版和这个Cookbook,仅供个人学习使用,感兴趣的同学可以关注我们的公众号: AINLP, 回复'NLTK'获取相关下载链接:

注:原创文章,转载请注明出处及保留链接“我爱自然语言处理”:http://www.52nlp.cn

本文链接地址:Python自然语言处理工具NLTK学习导引及相关资料 http://www.52nlp.cn/?p=11190

Python自然语言处理实践: 在NLTK中使用斯坦福中文分词器

斯坦福大学自然语言处理组是世界知名的NLP研究小组,他们提供了一系列开源的Java文本分析工具,包括分词器(Word Segmenter),词性标注工具(Part-Of-Speech Tagger),命名实体识别工具(Named Entity Recognizer),句法分析器(Parser)等,可喜的事,他们还为这些工具训练了相应的中文模型,支持中文文本处理。在使用NLTK的过程中,发现当前版本的NLTK已经提供了相应的斯坦福文本处理工具接口,包括词性标注,命名实体识别和句法分析器的接口,不过可惜的是,没有提供分词器的接口。在google无果和阅读了相应的代码后,我决定照猫画虎为NLTK写一个斯坦福中文分词器接口,这样可以方便的在Python中调用斯坦福文本处理工具。

首先需要做一些准备工作,第一步当然是安装NLTK,这个可以参考我们在gensim的相关文章中的介绍《如何计算两个文档的相似度》,不过这里建议check github上最新的NLTK源代码并用“python setup.py install”的方式安装这个版本:https://github.com/nltk/nltk。这个版本新增了对于斯坦福句法分析器的接口,一些老的版本并没有,这个之后我们也许还会用来介绍。而我们也是在这个版本中添加的斯坦福分词器接口,其他版本也许会存在一些小问题。其次是安装Java运行环境,以Ubuntu 12.04为例,安装Java运行环境仅需要两步:

sudo apt-get install default-jre
sudo apt-get install default-jdk

最后,当然是最重要的,你需要下载斯坦福分词器的相应文件,包括源代码,模型文件,词典文件等。注意斯坦福分词器并不仅仅支持中文分词,还支持阿拉伯语的分词,需要下载的zip打包文件是这个: Download Stanford Word Segmenter version 2014-08-27,下载后解压。

准备工作就绪后,我们首先考虑的是在nltk源代码里的什么地方来添加这个接口文件。在nltk源代码包下,斯坦福词性标注器和命名实体识别工具的接口文件是这个:nltk/tag/stanford.py ,而句法分析器的接口文件是这个:nltk/parse/stanford.py , 虽然在nltk/tokenize/目录下有一个stanford.py文件,但是仅仅提供了一个针对英文的tokenizer工具PTBTokenizer的接口,没有针对斯坦福分词器的接口,于是我决定在nltk/tokenize下添加一个stanford_segmenter.py文件,作为nltk斯坦福中文分词器的接口文件。NLTK中的这些接口利用了Linux 下的管道(PIPE)机制和subprocess模块,这里直接贴源代码了,感兴趣的同学可以自行阅读:
继续阅读