Nltk 常用方法

2021-09-07 14:43:45 字數 4694 閱讀 9283

在nltk的介紹文章中,前面幾篇主要介紹了nltk自帶的資料(書籍和語料),感覺系統學習意義不大,用到**看到那裡就行(笑),所以這裡會從一些常用功能開始,適當略過對於資料本體的介紹。

把切分好的詞表進行詞頻排序(按照出現次數排序),

只考慮最高頻率的兩個詞,並且繪製累積圖,

'''分詞

'''print(nltk.word_tokenize(sent))

print(nltk.tokenize.word_tokenize(sent))

'''詞根還原

'''porter = nltk.porterstemmer()

print([porter.stem(x) for x in nltk.word_tokenize(sent)])

'''詞形還原(lemmatizer),即把乙個任何形式的英語單詞還原到一般形式,與詞根還原不同(stemmer),

後者是抽取乙個單詞的詞根。

'''porter2 = nltk.stem.wordnetlemmatizer()

print([porter2.lemmatize(x) for x in nltk.word_tokenize(sent)])

print(nltk.pos_tag(text))

print(nltk.pos_tag(['i','love','you']))

print( nltk.pos_tag(['love','and','hate']))

[('and', 'cc'), ('now', 'rb'), ('for', 'in'), ('something', 'nn'), ('completely', 'rb'), ('different', 'jj')]

[('i', 'nn'), ('love', 'vbp'), ('you', 'prp')]

[('love', 'nn'), ('and', 'cc'), ('hate', 'nn')]

厲害的地方在這裡:第二局裡面的love是動詞,第三句裡面的love是名詞。

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

print(tagged_token)

('fly', 'nn')

中文的也行,

sent = '我/nn 是/in 乙個/at 大/jj 傻×/nn'

[nltk.tag.str2tuple(t) for t in sent.split()] # 中文語料詞性標註(&分詞)

[('我', 'nn'), ('是', 'in'), ('乙個', 'at'), ('大', 'jj'), ('傻×', 'nn')]

預設標註器:

不管什麼詞,都標註為頻率最高的一種詞性。比如經過分析,所有中文語料裡的詞是名次的概率是13%最大,那麼我們的預設標註器就全部標註為名次。這種標註器一般作為其他標註器處理之後的最後一道門,即:不知道是什麼詞?那麼他是名詞。

raw = '我 累 嗯個 e去?'

tokens = nltk.word_tokenize(raw)

default_tagger = nltk.defaulttagger('nn')

tags = default_tagger.tag(tokens)

print(tokens)

print(tags)

['我', '累', '嗯個', 'e去', '?']

[('我', 'nn'), ('累', 'nn'), ('嗯個', 'nn'), ('e去', 'nn'), ('?', 'nn')]

正規表示式標註器:

滿足特定正規表示式的認為是某種詞性,比如凡是帶「們」的都認為是代詞(pro)。

pattern = [('.*們$','pro')]

tagger = nltk.regexptagger(pattern)

print(tagger.tag(nltk.word_tokenize('我們 累 個 去 你們 和 他們 啊')))

[('我們', 'pro'), ('累', none), ('個', none), ('去', none), ('你們', 'pro'), ('和', none), ('他們', 'pro'), ('啊', none)]

查詢標註器:

找出最頻繁的n個詞以及它的詞性,然後用這個資訊去查詢語料庫,匹配的就標記上,剩餘的詞使用預設標註器(回退)。這一般使用一元標註的方式,見下面。

一元標註:基於已經標註的語料庫做訓練,然後用訓練好的模型來標註新的語料。

sents = [[u'我', u'你', u'小兔']]

tagged_sents = [[(u'我', u'pro'), (u'小兔', u'nn')]]

unigram_tagger = nltk.unigramtagger(tagged_sents)

tags = unigram_tagger.tag(sents[0])

print(tags)

[('我', 'pro'), ('你', none), ('小兔', 'nn')]

二元標註和多元標註:一元標註指的是只考慮當前這個詞,不考慮上下文,二元標註器指的是考慮它前面的詞的標註,用法只需要把上面的unigramtagger換成bigramtagger,同理三元標註換成trigramtagger(並未有示例)。

組合標註器:

為了提高精度和覆蓋率,我們對多種標註器組合,比如組合二元標註器、一元標註器和預設標註器,如下,

t0 = nltk.defaulttagger('nn')

t1 = nltk.unigramtagger(train_sents, backoff=t0)

t2 = nltk.bigramtagger(train_sents, backoff=t1)

直接呼叫t2即可。

持久化&較為完整的訓練乙個標註器:

sent = '我/nn 是/in 乙個/at 好的/jj 人/nn'

train_sents = [[nltk.tag.str2tuple(t) for t in sent.split()]]

t0 = nltk.defaulttagger('nn')

t1 = nltk.unigramtagger(train_sents, backoff=t0)

t2 = nltk.bigramtagger(train_sents, backoff=t1)

from pickle import dump

output = open('t2.pkl', 'wb')

dump(t2, output, -1)

output.close()

載入在這裡,

from pickle import load 

input = open('t2.pkl', 'rb')

tagger = load(input)

input.close()

NLTK學習筆記

學習參考書 nltk.set proxy com 80 nltk.download 2.使用sents fileid 函式時候出現 resource tokenizers punkt english.pickle not found.please use the nltk to obtain the...

NLTK學習筆記

學習參考書 nltk.set proxy com 80 nltk.download 2.使用sents fileid 函式時候出現 resource tokenizers punkt english.pickle not found.please use the nltk to obtain the...

NLTK學習筆記

學習參考書 nltk.set proxy com 80 nltk.download 2.使用sents fileid 函式時候出現 resource tokenizers punkt english.pickle not found.please use the nltk to obtain the...