簡體   English   中英

使用python NLTK:如何提高POS標記器的准確性?

[英]Working with the python NLTK: How can I improve the accuracy of the POS tagger?

我一直在使用NLTK的POS標記器:

...
nltk.pos_tag(nltk.word_tokenize(tfile[i]))
...

但是有時我得到的結果不准確(當我應該獲得JJ時為NN,依此類推。我要標記的文本在相當特定的業務領域內……我不太願意在這里說出哪個領域)。 誠然,我不是Python或NLTK的專家(但是正在研究),但我想知道是否有某種方法可以提高標記器的准確性。

我想我了解標記器通過將提供給它的文本與帶有預標記文本的語料庫進行比較來工作。 我的自然傾向是嘗試向該語料庫添加一組我自己的自標記句子...但是我不知道該怎么做。

我非常感謝您提供關於如何將自己的文本添加到語料庫的建議(或者我希望添加到現有的而不是完全開始一個新的建議),或者如果有人有其他建議來提高標記器的准確性,我將不勝感激為了我的目的,我很想聽聽。

謝謝!

您可能已經在nltk上看過GoogleCode書 我一直非常緩慢地自行處理它,雖然還沒有解決POS標記問題,但是當我足夠熟練地使用該工具時,這是我最終想要做的事情之一。 無論如何,在第5章第2節中,您會獲得以下文本和示例,以了解如何制作自己的標記令牌集(對所有人表示歉意,但我直接從文本中進行了復制):

>>> tagged_token = nltk.tag.str2tuple('fly/NN')
>>> tagged_token
('fly', 'NN')
>>> tagged_token[0]
'fly'
>>> tagged_token[1]
'NN'

從5.2繼續:

我們可以直接從字符串構造標記標記的列表。 第一步是標記字符串以訪問各個單詞/標記字符串,然后將每個字符串轉換為元組(使用str2tuple())。

>>> sent = '''
... The/AT grand/JJ jury/NN commented/VBD on/IN a/AT number/NN of/IN
... other/AP topics/NNS ,/, AMONG/IN them/PPO the/AT Atlanta/NP and/CC
... Fulton/NP-tl County/NN-tl purchasing/VBG departments/NNS which/WDT it/PPS
... said/VBD ``/`` ARE/BER well/QL operated/VBN and/CC follow/VB generally/RB
... accepted/VBN practices/NNS which/WDT inure/VB to/IN the/AT best/JJT
... interest/NN of/IN both/ABX governments/NNS ''/'' ./.
... '''
>>> [nltk.tag.str2tuple(t) for t in sent.split()]
[('The', 'AT'), ('grand', 'JJ'), ('jury', 'NN'), ('commented', 'VBD'), ('on', 'IN'), ('a', 'AT'), ('number', 'NN'), ... ('.', '.')]

上方的“已發送”變量實際上就是原始標記文本的樣子,已確認到我自己計算機上的nltk_data目錄,並查看corpora / brown /中的任何內容,因此您可以使用以下格式來編寫自己的標記文本:然后使用它構建您自己的標記令牌集。

一旦設置了自己的標記令牌,您就應該能夠基於標記的令牌(從5.5開始)設置自己的unigram標記器:

>>>unigram_tagger = nltk.UnigramTagger(YOUR_OWN_TAGGED_TOKENS)

最后,由於您標記的文本可能只是一個很小的樣本(因此不准確),因此您可以列出一個后備標記器,以便當失敗時,可以使用后備標記:

>>> t0 = nltk.UnigramTagger(a_bigger_set_of_tagged_tokens)
>>> t1 = nltk.UnigramTagger(your_own_tagged_tokens, backoff=t0)

最后,您應該研究前面第5章中介紹的n-gram差異,bigram,unigram等。

無論如何,如果您繼續閱讀第5章,將會看到幾種標記文本的方式(包括我最喜歡的regex標記器!)。 有很多方法可以做到,而且太復雜了,無法在這樣的小文章中充分介紹。

注意:我還沒有嘗試所有這些代碼,因此我以自己目前正在嘗試的解決方案作為解決方案。 如果我犯了錯誤,請幫助我糾正它們。

“如何改進NLTK標記器”是一個受歡迎的問題:-)我絕對不建議您手工制作語料庫來訓練標記器。 標線需要大量數據才能在新文本上正常工作。

如果您想盡力而為, 可以做的事情就是“引導”語料庫:使用NLTK標記器在您的域中標記一堆文本,手動更正子集中的錯誤(如果可以預見,則更容易),使用結果來訓練更好的標記器。 您甚至可以重復此過程,以便可以手動清潔大量自己的材料。 您的新標記仍將基於少量文本,因此您可以將默認標記添加為回退,如@erewok所示。 另請參閱此問題 ,它詢問相同的問題。

正如@erewok指出的那樣,使用退避標記器是一種改進的好方法。 從最准確的開始。 如果無法標記,或者計算出的概率低於設置的閾值,請嘗試下一種(精度較低)的方法。 甚至最后的“假設它是一個名詞”步驟也可以做出可衡量的改進。

諸如unigram和bigram標記器之類的東西通常不那么准確。 我建議先從一個朴素的貝葉斯(Naive Bayes)標記器開始(O'Reilly的書中介紹了這些標記器)。 這可以使用Unigram標記器或Wordnet標記器(在Wordnet中查找單詞,並使用最常見的示例)作為后備標記器。

然后,您可以轉到MaxEnt(最大熵)標記器,該標記器由於其對相關功能的支持而被認為比Naive Bayes更為准確。 但是,它速度較慢,需要更多的精力來實施-最終結果可能不值得。 NLTK版本也可能很難使用。

為了訓練這些標記器,NLTK附帶了各種語料庫。 我對您的域名一無所知,我不知道它們的用處,但它們包括Penn Treebank的子集,某些特定領域的語料庫,各種語言等。 看一看。

除了O'Reilly的書,我還會推薦Jacob Perkins的Python Text Processing NLTK Cookbook ,其中包括此類事情的實際示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM