奋战聊天机器人(三)自动化对语料做词性标注
2017-08-30 16:20
176 查看
1.英语词干提取器
import nltk porter = nltk.PorterStemmer() porter.stem('lying')
2.词性标注器
import nltk text = nltk.word_tokenize("And now for something completely different") nltk.pos_tag(text)
其中CC是连接词,RB是副词,IN是介词,NN是名次,JJ是形容词
这是一句完整的话,实际上pos_tag是处理一个词序列,会根据句子来动态判断,比如:
i love you ————love识别为名词 love and hate —————love识别为名词
nltk中多数都是英文的词性标注语料库,如果我们想自己标注一批语料库该怎么办呢?
nltk提供了比较方便的方法:
tagged_token = nltk,tag.str2truple('fly/NN')
这里的nltk.tag.str2tuple可以把fly/NN这种字符串转成一个二元组,事实上nltk的语料库中都是这种字符串形式的标注,那么我们如果把语料库标记成:
sent = '我/NN 是/IN 一个/AT 大/JJ 傻x/NN' [nltk.tag.str2tuple(t) for t in sent.split()]
如此一看,也是支持中文的
我们看看布朗语料库中的标注:
nltk.corpus.brown.tagged_words()
事实上,nltk也有中文的语料库,我们可以下载:
在nltk.download()执行的下载窗口中,选择Corpora里的sinica_treebank(台湾话的中国研究院)下载
Step 1: 查看这个中文语料库中有什么内容
# coding:utf-8 import nltk for word in nltk.corpus.sinica_treebank.tagged_words(): print(word[0], word[1])
第一列是中文的词汇,第二列是标注好的词性
我们发现这里面都是繁体,因为是基于台湾的语料生成的,想要简体中文还得自己想办法。不过有人已经帮我们做了这部分工作,那就是jieba分词,强烈推荐,可以自己加载自己的语料,进行中文切词,并且能够自动做词性标注
3.词性自动标注
面对一片新的语料库(比如我们从未处理过中文,只有中文语料),怎么实现词性自动标注呢?默认标注器:
不管什么词,都标注为频率最高的一种词性。比如经过分析,所有中文语料里的词是名词的概率是13%最大,那么我们的默认标注器就全部标注为名词。这种标注器一般作为其他标注器处理之后的最后一道门,既不知道是什么词?那么他是名词。默认标注器用DefaultTagger来实现:
# encoding:utf-8 import nltk default_tagger = nltk.DefaultTagger('NN') raw = '我 累 个 去' tokens = nltk.word_tokenize(raw) tags = default_tagger.tag(tokens) print(tags)
正则表达式标注器:
满足特定正则表达式的认为是某种词性,比如凡是带“们”的都认为是代词(PRO)。正则表达式标注器通RegexpTagge实现,用法如下:pattern = [(r'.*们$', 'PRO')] tagger = nltk.RegexpTagger(pattern) print(tagger.tag(nltk.word_tokenize('我们 累 个 去 你们 和 他们 啊')))
查询标注器:
找出最频繁的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)
这里的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()
参考资料来源:http://www.shareditor.com/
相关文章推荐
- 四、何须动手?完全自动化对语料做词性标注
- 自动化对语料做词性标注
- python nltk 统计语料的词性标注分布
- 生物语料词性标注工具——genia tagger
- 奋战聊天机器人(二)语料和词汇资源
- 词性标注
- 基于隐马尔可夫模型的有监督词性标注
- NLP自然语言处理 jieba中文分词,关键词提取,词性标注,并行分词,起止位置,文本挖掘,NLP WordEmbedding的概念和实现
- 【毕业设计day05_4】词性标注对象写出_思路
- 分词:词性标注北大标准
- 简单感知器实现英文词性标注
- 中文词性标注以及命名实体识别
- jieba分词词性标注含义
- 如何使用斯坦福pos tagger进行词性标注[转—英文]
- ANSJ词性标注集
- 基于隐马尔可夫模型的有监督词性标注
- 统计自然语言处理梳理一:分词、命名实体识别、词性标注
- 自然语言处理基础技术之分词、向量化、词性标注
- 词性标注的python实现-基于平均感知机算法
- jieba分词、自定义词典提取高频词、词性标注及获取词的位置