2015-10-23 50 views
1

我已經使用斯坦福POS標記器和一些自我收集的訓練數據訓練了一種非常見語言(維吾爾語)的詞性標記器。我一直在使用NLTK的nltk.tag.stanford.POSTagger接口來標記Python中的單個句子。這適用於大多數的我的目的:(從/usr/share/stanford-postagger運行)從NLTK內訓練新的斯坦福詞性標記器

>>> from nltk.tag.stanford import POSTagger 
>>> uy = POSTagger('models/uyghur.tagger', 'stanford-postagger.jar') 
>>> uy.tag('Men méning mantini yégenlikimni bilimen .'.split()) 
[[(u'Men', u'PN1s'), (u'm\xe9ning', u'PN1s.GEN'), (u'mantini', u'N-ACC'), (u'y\xe9genlikimni', u'Vt-PST.dir-1s2'), (u'bilimen', u'Vt-PRS-1s1'), (u'.', u'PUNCT')]] 

我願做十倍的交叉驗證得到這個惡搞的準確性更好的感覺,即,使用每個第十我的完整訓練數據作爲測試數據,用於在另外十分之九的數據上訓練標記器。在Python中分裂數據集十種方法是沒有問題的,但我不知道是否有方法在Python中訓練新的標記器。當我完成它時,它已從命令行使用java -mx1g -classpath /usr/share/stanford-postagger/stanford-postagger.jar edu.stanford.nlp.tagger.maxent.MaxentTagger -props uyghurtagger.props

是否可以使用NLTK界面從Python內部培訓新的斯坦福標記器,還是每次都需要通過命令行手動創建它?

+2

據我所知,斯坦福標記界面僅用於使用標記器。我不確定你爲什麼要從nltk中進行訓練,但如果它只是一個自動化交叉驗證過程的問題,那麼你總是可以使用'subprocess'模塊從python中啓動java進程。你有沒有這樣做的理由? – alexis

+1

我相信NLTK只是打電話來使用標記器,而不是任何方式來訓練它。我會迴應上述評論,並說這裏最簡單的最簡單的解決方案就是編寫一些Python代碼來進行命令行調用。 – StanfordNLPHelp

+0

謝謝你們兩位!我應該知道我是從錯誤的方面接近問題的...... – menzenski

回答

1

這比我想象的要簡單得多。

import subprocess32 
subprocess32.call(
    ['java', '-mx1g', '-classpath', 
    '/usr/share/stanford-postagger/stanford-postagger.jar', 
    'edu.stanford.nlp.tagger.maxent.MaxentTagger', '-props', 
    'uyghurtagger.props']) 

這真的就像是通過命令行參數列表subprocess32.call()簡單。 (根據subprocess docs中的建議,我正在使用subprocess32而不是subprocess)。

相關問題