1. 程式人生 > >第五章 分類和標註詞彙 ----5.1、5.2節

第五章 分類和標註詞彙 ----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
...