精通Python自然語言處理 4 :詞性標註--單詞識別

CopperDong發表於2018-06-01

   詞性標註被用於資訊檢索、機器翻譯、NER、語言分析等

1、詞性標註簡介

   一個對句中的每個識別符號分配詞類(如名詞、動詞、形容詞等)標記的過程。在nltk.tag包中並被TaggerIbase類所繼承。

>>> text1 = nltk.word_tokenize("It is a pleasnat day today")
>>> nltk.pos_tag(text1)
[('It', 'PRP'), ('is', 'VBZ'), ('a', 'DT'), ('pleasnat', 'JJ'), ('day', 'NN'), ('today', 'NN')]
Penn Treebank的標記列表https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html
>>> nltk.help.upenn_tagset('VB.*')

在NLTK中,已標註的識別符號呈現為一個由識別符號及其標記組成的元組。

>>> taggedword = nltk.tag.str2tuple('bear/NN')  # 識別符號及其標記組成的元組
>>> taggedword
('bear', 'NN')
>>> taggedtok = ('bear', 'NN')   # 單詞及其詞性標記
>>> nltk.tag.util.tuple2str(taggedtok)
'bear/NN'
    預設標識:DefaultTagger類

2、建立詞性標註語料庫

   一個語料庫可以認為是文件的集合。一個語料庫是多個語料庫的集合。

>>> from nltk.corpus import words
>>> words.fileids()
[u'en', u'en-basic']
>>> len(words.words('en'))
235886

3、選擇一種機器學習演算法

    詞性標註也被稱為詞義消歧或語法標註

    在訓練詞性分類器時,會生成一個特徵集。大體組成如下:

  • 當前單詞的資訊
  • 上一個單詞或字首的資訊
  • 下一個單詞或字尾的資訊

     在NLTK中,FastBrillTagger類是基於一元語法的。它使用一個包含已知單詞及其詞性標記資訊的字典。


4、涉及n-gram的統計建模

    一元語法意味著一個獨立的單詞,在一元語法標註器中,單個的識別符號用於查詢特定的詞性標記。

    可以通過在初始化標註器時提供一個句子的列表來執行UnigramTagger的訓練

>>> from nltk.tag import UnigramTagger
>>> from nltk.corpus import treebank
>>> training = treebank.tagged_sents()[:7000]   # 使用前7000個句子進行訓練
>>> unitagger = UnigramTagger(training)
>>> treebank.sents()[0]
[u'Pierre', u'Vinken', u',', u'61', u'years', u'old', u',', u'will', u'join', u'the', u'board', u'as', u'a', u'nonexecutive', u'director', u'Nov.', u'29', u'.']
>>> unitagger.tag(treebank.sents()[0])
[(u'Pierre', u'NNP'), (u'Vinken', u'NNP'), (u',', u','), (u'61', u'CD'), (u'years', u'NNS'), (u'old', u'JJ'), (u',', u','), (u'will', u'MD'), (u'join', u'VB'), (u'the', u'DT'), (u'board', u'NN'), (u'as', u'IN'), (u'a', u'DT'), (u'nonexecutive', u'JJ'), (u'director', u'NN'), (u'Nov.', u'NNP'), (u'29', u'CD'), (u'.', u'.')]

要評估UnigramTagger,下面用於計算其準確性的程式碼:準確率為96%

>>> testing = treebank.tagged_sents()[2000:]
>>> unitagger.evaluate(testing)
0.9634419196584355   --> 96%

5、使用詞性標註語料庫開發分塊器

    分塊是一個可用於執行實體識別的過程。它用於分割和標記居中的多個識別符號序列

    首先定義分塊語法,包含了有關如何進行分塊的規則。如下名詞短語分塊:

>>> sent = [("A","DT"),("wise","JJ"),("small","JJ"),("girl","NN"),("of","IN"),("village","NN"),("became","VBD"),("leader","NN")]
>>> grammar = "NP: {<DT>?<JJ>*<NN><IN>?<NN>*}"
>>> find = nltk.RegexpParser(grammar)
>>> res = find.parse(sent)
>>> print(res)
(S
  (NP A/DT wise/JJ small/JJ girl/NN of/IN village/NN)
  became/VBD
  (NP leader/NN))

生成解析樹:   res.draw()


分塊是語塊的一部分被消除的過程,既可以使用整個語塊,也可以使用語塊中間的一部分並刪除剩餘的部分,或者也可以使用語塊從開始或結尾擷取的一部分並刪除剩餘的部分。


相關文章