第3章 詞性標注
1.什么是詞性標注? 詞性(POS)主要指比如名詞,形容詞,動詞等等。雖然目前最先進的詞性標注算法在預測給定單詞的詞性上已經有了較高的精確度(約97%)。 首先,我們需要學習一些現成的POS標注器。 主要的詞性有哪些呢?
標簽相關說明 NNP 專用名詞的單數形式 NNPS 專用名詞的復數形式 PDT 前置限定詞 POS 所有格結束符 PRP 人稱代詞 PRP$ 所有格代詞 RB 副詞 RBR 相對副詞 RBS 最高級副詞 RP 小品詞 SYM 符號(數學符號或特殊符號) TO To UH 嘆詞 VB 動詞的基本形式 VBD 動詞的過去式 VBG 動詞的動名詞用法 VBN 動詞的過去分詞 WP Wh-代詞 WP$ 所有格wh-代詞 WRB Wh-副詞 # 井號符 $ 美元符 . 句號 , 逗號 : 分號,分隔符 ( 左括號 ) 右括號 " 直雙引號 ‘ 左單引號 “ 左雙引號 ’ 右單引號 ” 右雙引號
2.利用pos標注器 簡單代碼:
import nltk
from nltk import word_tokenize
s="I was watching TV."
print(nltk.pos_tag(word_tokenize(s)))
結果顯示:
D
: \
IR_lab\ venv\ Scripts\ python . exe D
: / IR_lab
/ learn
. py
[ ( 'I' , 'PRP' ) , ( 'was' , 'VBD' ) , ( 'watching' , 'VBG' ) , ( 'TV' , 'NN' ) , ( '.' , '.' ) ] Process finished with exit code
0
其中 PRP----人稱代詞 VBD—動詞的過去式 VBG—動詞的動名詞用法 NN—專用名詞
篩選詞性 比如篩選出名次:
#導入庫
import nltk
from nltk import word_tokenize
s="I was watching TV."
#對字符串s標注
tagged=nltk.pos_tag(word_tokenize(s))
#輸出所有詞性里邊的名詞
all_noun=[word for word ,pos in tagged if pos in ['NN','mnp']]
print(all_noun)
結果:
D
: \
IR_lab\ venv\ Scripts\ python . exe D
: / IR_lab
/ learn
. py
[ 'TV' ] Process finished with exit code
0
注意:不能在詞性標注之前刪除停用詞,否則語義不通
雖然Pos標注器能夠區分不同詞性,但其正確率并不高
3.順序標注器 N-gram標注器是一種順序標注器,會在其所在的上下文環境中標注出前n個單詞,并預測給定詞項的Pos標簽。
import nltk
from nltk.corpus import brown
#一元模型標注,只考慮條件概率
from nltk.tag import UnigramTagger
from nltk.tag import DefaultTagger
#會考慮給定單詞和該單詞前一個單詞
from nltk.tag import BigramTagger
#與前面兩個都有關
from nltk.tag import TrigramTagger
#brown訓練集
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):]
#backoff是指當不能進行正確的標簽預測時會咨詢backoff
#一元模型
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))
結果:
D
: \
IR_lab\ venv\ Scripts\ python . exe D
: / IR_lab
/ learn
. py
0.8361407355726104
0.8452108043456593
0.843317053722715
4.正則表達式標注器 比如任何以ness結尾的詞很可能是名次。NLTK的RegexpTagger參數會為我們提供基于POS模式的標注。 代碼如下:
#導入訓練集
from nltk.corpus import brown
#NLTK正則標注器
from nltk.tag.sequential import RegexpTagger
#對詞性進行標注
brown_tagged_sents = brown.tagged_sents(categories='news')
#測試集
test_data = brown_tagged_sents[int(len(brown_tagged_sents) * 0.9):]
regexp_tagger=RegexpTagger([
( r'^-?[0-9]+(.[0-9]+)?$', 'CD'),
( r'(The|the|A|a|An|an)$', 'AT'),
( r'.*able$', 'JJ'),
( r'.*ness$', 'NN'), #以Ness結尾大多是名詞
( r'.*ly$', 'RB'), #以ly結尾大多是副詞
( r'.*s$', 'NNS'), #以s結尾的大多是復數名詞
(r'.*ing$', 'VBG'), #以ing結尾的大多是動名詞
(r'.*ed$', 'VBD'), #以ed結尾的大多數是動詞過去式
(r'.*', 'NN')
])
print(regexp_tagger.evaluate(test_data))
結果如下:
D
: \
IR_lab\ venv\ Scripts\ python . exe D
: / IR_lab
/ learn
. py
0.31306687929831556
正確率大約有30%
5.命名實體識別(NER) NER主要由實體名、位置和組織等。NLTK庫提供了ne_chunk方法。需要先對語句進行標識化處理,然后再進行語塊分解和詞性標注的處理順序,之后進行命名實體標注。 簡單看一看
import nltk
from nltk import word_tokenize
from nltk import ne_chunk
sent="Mark is studying at Stanford University in California"
print(ne_chunk(nltk.pos_tag(word_tokenize(sent)),binary=False))
結果如下:
D
: \
IR_lab\ venv\ Scripts\ python . exe D
: / IR_lab
/ learn
. py
( S
( PERSON Mark
/ NNP ) is
/ VBZ studying
/ VBG at
/ IN ( ORGANIZATION Stanford
/ NNP University
/ NNP ) in
/ IN ( GPE California
/ NNP ) )
no_chunk能夠識別相關人名,地點和組織。
本章小結 : 主要學習的是關于詞性標注。主要方法有利用POS標注器、N-gram標注還有正則表達式標注 也虛席了NER標注器。
總結
以上是生活随笔 為你收集整理的第3章 词性标注(pos、N-gram、NER等标注器) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。