2017-07-04 53 views
0

在我的業務領域,這兩個詞的組合:「門衛大廈」應始終標記爲(門衛:「JJ」)(建築物:「NN」 )。 NLTK內部惡搞標籤它:自定義詞性標記與回退到nltk內部pos

nltk.pos_tag(["doorman", "building"]) -> [('doorman', 'NN'), ('building', 'NN')] 

我的方法是創建一個BigramTagger,並把它與這句話訓練:

train_sents = [ 
    [('doorman', 'JJ'), ('building', 'NN')] 
] 

與NLTK內部惡搞到退避它爲所有其他案例。

default_tagger = nltk.data.load("../nltk_data/taggers/maxent_treebank_pos_tagger/english.pickle") 
bigram_tagger = nltk.BigramTagger(train_sents, backoff=default_tagger) 

但是,當我嘗試使用這樣的:

bigram_tagger.tag(nltk.word_tokenize("Elegant doorman building with gym"))` 

好像不施加BigramTaager,我得到:

[('Elegant', 'NNP'), ('doorman', 'NN'), ('building', 'NN'), ('with', 'IN'), ('gym', 'NN')] 

但這似乎工作:

bigram_tagger.tag(nltk.word_tokenize("doorman building")) -> [('doorman', 'JJ'), ('building', 'NN')] 

顯然我錯過了我應該使用這些組件的方式, 如何讓nltk內部的pos tagger可以很好的策略,但是在某些與特定業務領域相關的特定情況下,也可以「覆蓋」它?

回答

0

首先,在語法上,nltk標記器是正確的:「門衛建築」是名詞 - 名詞化合物。但是要回答技術問題,BigramTagger根據之前的上下文標記一次一個字。當您的自定義標記符遵循「優雅」時,無法標記「門衛」,因此它將代表默認設置,並在您開始「建立」之前以("doorman", "JJ")結束。

如果您確定要走這條路線(我的猜測是它可能會造成更多的傷害而不是好處),我建議在標記工作完成後通過後期處理應用更正。例如,您提供的示例不需要完整的標記器,您可以匹配單詞序列並將替換應用於標記的版本。

+0

謝謝,它非常有意義 – user1511123

+0

不客氣。如果答案解決了您的問題,請點擊左側的大複選標記以「接受」它。 – alexis