NLTK基礎教程學習筆記(六)

2021-09-22 00:25:24 字數 2855 閱讀 8151

用nlyk庫實現標註任務的方式有兩種:

1:使用nltk庫或其他庫中的預置標註器,並將其運用到測試資料上。這兩種標註器應該足以應對英語文字環境,以及非特殊領域語料庫中的所有詞性標註任務。

2:基於測試資料來建立或訓練出適合的標註器。

深入了解標註器:

乙個典型的標註器通常要用到大量的訓練資料,它主要被用於標註出句子中的各種單詞,並為其貼上pos標籤。標註是乙個純手工的工作,具體如下:

well/uh what/wp do/vbp you/prp think/vb about/in the/dt idea/nn of/in...
以上是來自penn treebank的語義庫。其中還有乙個語言資料聯盟(ldc)專門用來研究不同語言的標註,不同文字種類以及不同標註操作,如詞性標註,句法分析標註,以及對話標註等。

通常情況下,像詞性標註這樣的標註問題往往會被視為順序標籤化的問題或者某種分類問題,後者特指人們為特定token所生成的正確標籤,並用先關判別模型對其進行判別的一類問題。

下面是分析brown語料庫中各pos標籤的分布頻率:

from nltk.corpus import  brown

import nltk

tags=[tag for (word,tag)in brown.tagged_words(categories='news')]

print(nltk.freqdist(tags))

out=nltk.freqdist(tags)

結果:

由於個數太多無法列印,可以通過debug進去看各個詞的的頻率。

debug進去看可以看到nn在這裡出現頻率最高,可以用來建立乙個pos標註器,用來給所有的測試文字分配nn標籤。

defaulttagger函式是順序性標註器,標註器會去呼叫evaluate()函式,該函式主要用來評估相關單詞pos的準確度,是對brown語料庫的標註器所用的基準:

from nltk.corpus import  brown

import nltk

brown_tagged_sents=brown.tagged_sents(categories='news')

default_tagger=nltk.defaulttagger('nn')

print(default_tagger.evaluate(brown_tagged_sents))

結果:

0.13089484257215028
準確率大概13%左右

defaulttagger的表現並不是很好,defaulttagger本質上只是基類sequentialbackofftagger的一部分,後者是乙個順序性標註服務。

標註器會試著基於其所處的上下文環境來模型化先關的標籤。而且如果它不能進行正確的標籤**,就會去諮詢backofftagger。通常情況下,defaulttagger引數都可以被當作乙個backofftagger實體來使用。

n-gram標註器

from nltk.tag import unigramtagger

from nltk.tag import defaulttagger

from nltk.tag import bigramtagger

from nltk.tag import trigramtagger

from nltk.corpus import brown

import nltk

brown_tagged_sents=brown.tagged_sents(categories='news')

default_tagger=nltk.defaulttagger('nn')

train_data=brown_tagged_sents[:int(len(brown_tagged_sents)*0.9)]

test_data=brown_tagged_sents[int(len(brown_tagged_sents)*0.9):]

unigram_tagger=unigramtagger(train_data,backoff=default_tagger)

print(unigram_tagger.evaluate(test_data))

bigram_tagger=bigramtagger(train_data,backoff=unigram_tagger)

print(bigram_tagger.evaluate(test_data))

trigram_tagger=trigramtagger(train_data,backoff=bigram_tagger)

print(trigram_tagger.evaluate(test_data))

結果:

0.8368384331705372

0.8460081730290043

0.8439150802352238

其中,基於元模型的標註只考慮相關標籤的條件概率,以及針對每個給定token所能**到的、頻率最高的標籤。而bigram-tagger引數將會考慮給定的單詞和該單詞的前乙個單詞,其標籤將以元組的形式來關聯被測試單詞所得到的標籤。類似的,trigramtagger引數將讓其查詢過程兼顧到給定單詞的前兩個單詞。

trigramtagger引數的覆蓋範圍比較小,而例項精度則高一些。從另一方面來說,unigramtagger的覆蓋範圍則會大一些。為了讓準確率和反饋率之間保持平衡,上述**結合了這三種標註器。

NLTK基礎教程學習筆記(九)

不同的解析器型別 解析器通常需要對乙個用於表達一組語法規則的輸入字串繼續處理,然後構成乙個或者多個可用於構成某種語法概念的規則。語法是我們衡量乙個句子是否良好的乙份規範說明,而解析器則是乙個用於解讀語法的程式。該程式會通過搜尋各種不同的樹結構空間,找出給定句子的最佳樹結構,下面是一些解析器的運用細節...

NLTK基礎教程學習筆記(五)

import nltk from nltk import word tokenize s i was watching tv print nltk.pos tag word tokenize s 結果 i prp was vbd watching vbg tv nn 中先將文字進行表示化處理,再呼叫...

NLTK基礎教程學習筆記(四)

標識化處理 機器所要理解的最小處理單位是單詞 分詞 標識化處理,是將原生字元創分割成一系列有意義的分詞。標識化就是將原生字串分割成一系列有意義的分詞。標識化處理的複雜性因具體nlp應用而異,目標語言本身的複雜性本身也會帶來相關的變化。在英語中,可以通過正規表示式簡單的單詞來選取純單詞和數字,但在中文...