四、何须动手?完全自动化对语料做词性标注
2017-01-25 12:04
197 查看
全人工对语料做词性标注就像蚂蚁一样忙忙碌碌,是非常耗费声明的,如果有一个机器能够完全自动化地,给它一篇语料,它迅速给你一片标注,这样才甚好,本节就来讨论一下怎么样能无需动手对语料做自动化的词性标注
请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址
先插入个tips:
英文词干提取器
>>> import nltk >>> porter = nltk.PorterStemmer() >>> porter.stem('lying') u'lie'
词性标注器
>>> import nltk >>> text = nltk.word_tokenize("And now for something completely different") >>> nltk.pos_tag(text) [('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'), ('completely', 'RB'), ('different', 'JJ')]
其中CC是连接词,RB是副词,IN是介词,NN是名次,JJ是形容词
这是一句完整的话,实际上pos_tag是处理一个词序列,会根据句子来动态判断,比如:
>>> nltk.pos_tag(['i','love','you'])
[('i', 'NN'), ('love', 'VBP'), ('you', 'PRP')]
这里的love识别为动词
而:
>>> nltk.pos_tag(['love','and','hate'])
[('love', 'NN'), ('and', 'CC'), ('hate', 'NN')]
这里的love识别为名词
nltk中多数都是英文的词性标注语料库,如果我们想自己标注一批语料库该怎么办呢?
nltk提供了比较方便的方法:
>>> tagged_token = nltk.tag.str2tuple('fly/NN') >>> tagged_token ('fly', 'NN')
这里的nltk.tag.str2tuple可以把fly/NN这种字符串转成一个二元组,事实上nltk的语料库中都是这种字符串形式的标注,那么我们如果把语料库标记成:
>>> sent = '我/NN 是/IN 一个/AT 大/JJ 傻×/NN' >>> [nltk.tag.str2tuple(t) for t in sent.split()] [('\xe6\x88\x91', 'NN'), ('\xe6\x98\xaf', 'IN'), ('\xe4\xb8\x80\xe4\xb8\xaa', 'AT'), ('\xe5\xa4\xa7', 'JJ'), ('\xe5\x82\xbb\xc3\x97', 'NN')]
这么说来,中文也是可以支持的,恩~
我们来看一下布朗语料库中的标注:
>>> nltk.corpus.brown.tagged_words() [(u'The', u'AT'), (u'Fulton', u'NP-TL'), ...]
事实上nltk也有中文的语料库,我们来下载下来:
执行
nltk.download()
选择Corpora里的sinica_treebank下载
sinica就是台湾话中的中国研究院
我们看一下这个中文语料库里有什么内容,创建cn_tag.py,内容如下:
# coding:utf-8 import sys reload(sys) sys.setdefaultencoding( "utf-8" ) import nltk for word in nltk.corpus.sinica_treebank.tagged_words(): print word[0], word[1]
请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址
执行后输出:
一 Neu 友情 Nad 嘉珍 Nba 和 Caa 我 Nhaa 住在 VC1 同一條 DM 巷子 Nab 我們 Nhaa 是 V_11 ……
第一列是中文的词汇,第二列是标注好的词性
我们发现这里面都是繁体,因为是基于台湾的语料生成的,想要简体中文还得自己想办法。不过有人已经帮我们做了这部分工作,那就是jieba切词,https://github.com/fxsjy/jieba,强烈推荐,可以自己加载自己的语料,进行中文切词,并且能够自动做词性标注
词性自动标注
面对一片新的语料库(比如我们从未处理过中文,只有一批批的中文语料,现在让我们做词性自动标注),如何实现词性自动标注?有如下几种标注方法:默认标注器:不管什么词,都标注为频率最高的一种词性。比如经过分析,所有中文语料里的词是名次的概率是13%最大,那么我们的默认标注器就全部标注为名次。这种标注器一般作为其他标注器处理之后的最后一道门,即:不知道是什么词?那么他是名次。默认标注器用DefaultTagger来实现,具体用法如下:
# coding:utf-8 import sys reload(sys) sys.setdefaultencoding( "utf-8" ) import nltk default_tagger = nltk.DefaultTagger('NN') raw = '我 累 个 去' tokens = nltk.word_tokenize(raw) tags = default_tagger.tag(tokens) print tags
执行后输出:
[('\xe6\x88\x91', 'NN'), ('\xe7\xb4\xaf', 'NN'), ('\xe4\xb8\xaa', 'NN'), ('\xe5\x8e\xbb', 'NN')]
正则表达式标注器:满足特定正则表达式的认为是某种词性,比如凡是带“们”的都认为是代词(PRO)。正则表达式标注器通RegexpTagge实现,用法如下:
pattern = [(r'.*们$','PRO')] tagger = nltk.RegexpTagger(pattern) print tagger.tag(nltk.word_tokenize('我们 累 个 去 你们 和 他们 啊'))
执行后输出:
[('\xe6\x88\x91\xe4\xbb\xac', 'PRO'), ('\xe7\xb4\xaf', None), ('\xe4\xb8\xaa', None), ('\xe5\x8e\xbb', None), ('\xe4\xbd\xa0\xe4\xbb\xac', 'PRO'), ('\xe5\x92\x8c', None), ('\xe4\xbb\x96\xe4\xbb\xac', 'PRO'), ('\xe5\x95\x8a', None)]
查询标注器:找出最频繁的n个词以及它的词性,然后用这个信息去查找语料库,匹配的就标记上,剩余的词使用默认标注器(回退)。这一般使用一元标注的方式,见下面。
一元标注:基于已经标注的语料库做训练,然后用训练好的模型来标注新的语料,使用方法如下:
tagged_sents = [[(u'我', u'PRO'), (u'小兔', u'NN')]] unigram_tagger = nltk.UnigramTagger(tagged_sents) sents = brown.sents(categories='news') sents = [[u'我', u'你', u'小兔']] tags = unigram_tagger.tag(sents[0]) print tags
输出结果如下:
[(u'\u6211', u'PRO'), (u'\u4f60', None), (u'\u5c0f\u5154', u'NN')]
这里的tagged_sents是用于训练的语料库,我们也可以直接用已有的标注好的语料库,比如:
brown_tagged_sents = brown.tagged_sents(categories='news')
二元标注和多元标注:一元标注指的是只考虑当前这个词,不考虑上下文。二元标注器指的是考虑它前面的词的标注,用法只需要把上面的UnigramTagger换成BigramTagger。同理三元标注换成TrigramTagger
组合标注器:为了提高精度和覆盖率,我们对多种标注器组合,比如组合二元标注器、一元标注器和默认标注器,如下:
t0 = nltk.DefaultTagger('NN') t1 = nltk.UnigramTagger(train_sents, backoff=t0) t2 = nltk.BigramTagger(train_sents, backoff=t1)
标注器的存储:训练好的标注器为了持久化,可以存储到硬盘,具体方法如下:
>>> from cPickle import dump >>> output = open('t2.pkl', 'wb') >>> dump(t2, output, -1) >>> output.close()
使用时也可以加载,如下:
>>> from cPickle import load >>> input = open('t2.pkl', 'rb') >>> tagger = load(input) >>> input.close()
相关文章推荐
- 奋战聊天机器人(三)自动化对语料做词性标注
- 自动化对语料做词性标注
- 生物语料词性标注工具——genia tagger
- python nltk 统计语料的词性标注分布
- jieba词性和句法分析树标注集
- 词性标注
- HMM与分词、词性标注、命名实体识别
- 中英文分词及词性标注工具
- 通过主动学习的方法进行自动语料标注
- 中文词性标注与viterbi算法
- 教程入门:建立一个完全自动化的交易系统
- 【Python实战】机型自动化标注(搜狗爬虫实现)
- python实现的基于hmm模型的词性标注系统
- 电话机有些故障,用户完全可以自己修好。下面介绍几例,读者遇到类似情况,可以自己动手试试。
- stanford命令行进行词性标注
- 北大计算所词性标注集简表
- 斯坦福Stanford coreNLP宾州树库的词性标注规范
- 中文词性标注规范
- 中文命名实体识别之学习笔记一(词性标注)
- 中文词性标注解释一览表