第五章 分类和标注词汇 ----5.1、5.2节

将词汇按它们的词性(parts-of-speech,POS)分类并相应地对他们进行标注,这个过程叫做词形标注(POS tagging)或者标注。词性也成为词类,在本章中重点是利用标记和自动标注文本。

5.1使用词性标注器

词形标注器处理一个词序列,为每个词附加的一个词性标记。

import nltk
text=nltk.word_tokenize("And now for someting completely different")
nltk.pos_tag(text)

输出:[('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('someting', 'VBG'), ('completely', 'RB'), ('different', 'JJ')]
text.similar()方法为词w找到所有上下文w1ww2,然后找到所有出现在相同上下文中的词w’,即w1w’w2。

text=nltk.Text(word.lower() for word in nltk.corpus.brown.words())
text.similar('woman')

输出:man time day year car moment world family house country child boy state job way war girl place word work
搜索woman找到的都是名词。

5.2 标注语料库

表示以标注的标识符

已标注的标识符使用一个标识符和标记组成的元组来表示。可以使用函数str2tuple()为一个已标注的标识符的标准字符串创建一个特殊元组。

tagged_token=nltk.tag.str2tuple('fly/NN')
tagged_token

输出:('fly', 'NN')

tagged_token[0]

输出:'fly'
可以直接从一个字符串构造出一个已标注的标识符的链表。第一步是对字符串分词以便能访问单独的词/标记 字符串,然后将其转换成一个元组。

sent='''The/AT grand/JJ jury/NN'''
[nltk.tag.str2tuple(t) for t in sent.split()]

输出:[('The', 'AT'), ('grand', 'JJ'), ('jury', 'NN')]

读取已标注的语料库

只要语料库包含已标注的文本,NLTK的语料库接口豆浆有一个tagged_words()方法。

nltk.corpus.brown.tagged_words()

输出:[(u'The', u'AT'), (u'Fulton', u'NP-TL'), ...]

简化的词性标注集

在这里插入图片描述在这里插入图片描述
布朗语料库的新闻类中的类别:

from nltk.corpus import brown
brown_news_tagged=brown.tagged_words(categories='news')
tag_fd=nltk.FreqDist(tag for (word,tag)in brown_news_tagged)
tag_fd.keys()

未简化的标记

例5.1 找出最频繁的名词标记的程序

def findtags(tag_prefix,tagged_text):
    cfd=nltk.ConditionalFreqDist((tag,word)for (word,tag)in tagged_text if tag.startswith(tag_prefix))
    return dict((tag,cfd[tag].keys()[:5])for tag in cfd.conditions())
tagdict=findtags('NN',nltk.corpus.brown.tagged_words(categories='news'))
for tag in sorted(tagdict):
    print tag,tagdict[tag]

输出:NN [u'inning', u'pardon', u'sunbonnet', u'temperament', u'hitch'] NN$ [u"junior's", u"player's", u"wife's", u"layman's", u"coach's"] NN$-HL [u"Golf's", u"Navy's"] NN$-TL [u"House's", u"Art's", u"University's", u"U.'s", u"Department's"] NN-HL [u'son', u'help', u'show', u'lack', u'rest'] NN-NC [u'eva', u'ova', u'aya'] NN-TL [u'Communisn', u'Communism', u'Secretary-General', u'Monthly', u'Self'] NN-TL-HL [u'City', u'Commissioner', u'Grove', u'House', u'Oak'] NNS [u'wetlands', u'hats', u'facilities', u'woods', u'$12.50'] NNS$ [u"steelmakers'", u"taxpayers'", u"teammates'", u"bishops'", u"owners'"] NNS$-HL [u"Dealers'", u"Idols'"] NNS$-TL [u"Officers'", u"States'", u"Bombers'", u"Falcons'", u"Princes'"] NNS-HL [u'years', u'idols', u'Creations', u'thanks', u'centers'] NNS-TL [u'Gables', u'Broncos', u'Hills', u'Workers', u'Ministers'] NNS-TL-HL [u'Nations']

探索已标注的语料库

假设我们正在研究词often,想看看它是如何在文本中使用的。我们可以试着看看跟在often后面的词汇。

browm_learned_text=brown.words(categories='learned')
sorted(set(b for (a,b)in nltk.bigrams(browm_learned_text)if a =='often'))
#然后使用tagged_words()方法查看跟随词的词形标注
brown_lrnd_tagged=brown.tagged_words(categories='learned')
tags=[b[1]for (a,b) in nltk.bigrams(brown_lrnd_tagged)if a[0]=='often']
fd=nltk.FreqDist(tags)
fd.tabulate()

输出:

VBN  VB VBD  JJ  IN  RB   ,  CS  QL WRB  TO VBG BEN  HV QLP  AP  RP   . VBZ 
 15  10   8   5   4   3   3   3   3   1   1   1   1   1   1   1   1   1   1 

接下来,让我们看一些较大范围的上下文,找到涉及特定标记和词序列的词(“W”。在例5-2中,考拉句子中的每三个词窗口,检查它是否符合我们的标准,如果符合则输出。
例5-2 使用POS标记寻找三词短语

from nltk.corpus import brown
def process(sentence):
    for (w1,t1),(w2,t2),(w3,t3) in nltk.trigrams(sentence):
        if (t1.startswith('V') and t2=='TO' and t3.startswith('V')):
            print w1,w2,w3
for tagged_sent in brown.tagged_sents():
    process(tagged_sent)

输出:

combined to achieve
continue to place
serve to protect
wanted to wait 
...

最后让我们看看与他们标记关系高度模糊不清的词。了解标注这样的词是因为他们各自的上下文可以帮助我们弄清楚标记之间的区别。

brown_news_tagged=brown.tagged_words(categories='news')
data=nltk.ConditionalFreqDist((word.lower(),tag) for (word,tag)in brown_news_tagged)
for word in data.conditions():
    if len(data[word])>3:
        tags=data[word].keys()
        print word,' '.join(tags)

输出:

second OD-TL OD RB NN QL
place NP VB NN-TL NN
fair JJ-HL JJ-TL NN-TL NN JJ
best VB JJT NP-TL RBT JJT-HL
right RB JJ NN QL
...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值