2017-08-07 7 views
2

Python 3.6.0、NLTK 3.2.4、およびStanford POS Tagger 3.8.0をインストールしました。中国語のNLTKでStanfordPOSTaggerを実行すると予期しないフォーマットが発生する

その後、私は以下のスクリプト実行してみました:

#!/usr/bin/env python3 

from nltk.tag import StanfordPOSTagger 


st = StanfordPOSTagger('chinese-distsim.tagger') 
print(st.tag('这 是 斯坦福 中文 分词器 测试'.split())) 

をし、出力が予期しない形式になります。

[('', '这#PN'), ('', '是#VC'), ('', '斯坦福#NR'), ('', '中文#NN'), ('', '分词器#NN'), ('', '测试#NN')] 

鬼はその仕事を行いますが、言葉と言葉のその部品はペアとして分離されず、 '#'で結合されて単一の文字列を形成します。これは特別に中国語の書式ですか、それとも間違っていますか?

答えて

1

TL; DR

は異なる_SEPARATORを設定します。

from nltk.tag import StanfordPOSTagger 

st = StanfordPOSTagger('chinese-distsim.tagger') 
st._SEPARATOR = '#' 
print(st.tag('这 是 斯坦福 中文 分词器 测试'.split())) 

よりよい解決策

非常に存在しますNLTKのv3.2.5を待って、しばらくの間差し出しますさまざまな言語で標準化されているスタンフォードトークナイザとの簡単なインターフェイス。

タグとトークンがRESTインターフェースからJSONを介して転送されるため=関わる一切の区切りがあってはなりませう)

また、StanfordSegmenterStanfordTokenizerクラスがv3.2.5に廃止されます、

を参照してください

まずあなたnltkバージョンアップグレード:

ダウンロード、スタンフォードCoreNLPサーバを起動します。

wget http://nlp.stanford.edu/software/stanford-corenlp-full-2016-10-31.zip 
unzip stanford-corenlp-full-2016-10-31.zip && cd stanford-corenlp-full-2016-10-31 
wget http://nlp.stanford.edu/software/stanford-chinese-corenlp-2016-10-31-models.jar 
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-chinese.properties 

java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \ 
-serverProperties StanfordCoreNLP-chinese.properties \ 
-preload tokenize,ssplit,pos,lemma,ner,parse \ 
-status_port 9001 -port 9001 -timeout 15000 

はその後NLTKのv3.2.5で:

>>> from nltk.tag.stanford import CoreNLPPOSTagger, CoreNLPNERTagger 
>>> from nltk.tokenize.stanford import CoreNLPTokenizer 
>>> stpos, stner = CoreNLPPOSTagger('http://localhost:9001'), CoreNLPNERTagger('http://localhost:9001') 
>>> sttok = CoreNLPTokenizer('http://localhost:9001') 

>>> sttok.tokenize(u'我家没有电脑。') 
['我家', '没有', '电脑', '。'] 

# Without segmentation (input to`raw_string_parse()` is a list of single char strings) 
>>> stpos.tag(u'我家没有电脑。') 
[('我', 'PN'), ('家', 'NN'), ('没', 'AD'), ('有', 'VV'), ('电', 'NN'), ('脑', 'NN'), ('。', 'PU')] 
# With segmentation 
>>> stpos.tag(sttok.tokenize(u'我家没有电脑。')) 
[('我家', 'NN'), ('没有', 'VE'), ('电脑', 'NN'), ('。', 'PU')] 

# Without segmentation (input to`raw_string_parse()` is a list of single char strings) 
>>> stner.tag(u'奥巴马与迈克尔·杰克逊一起去杂货店购物。') 
[('奥', 'GPE'), ('巴', 'GPE'), ('马', 'GPE'), ('与', 'O'), ('迈', 'O'), ('克', 'PERSON'), ('尔', 'PERSON'), ('·', 'O'), ('杰', 'O'), ('克', 'O'), ('逊', 'O'), ('一', 'NUMBER'), ('起', 'O'), ('去', 'O'), ('杂', 'O'), ('货', 'O'), ('店', 'O'), ('购', 'O'), ('物', 'O'), ('。', 'O')] 
# With segmentation 
>>> stner.tag(sttok.tokenize(u'奥巴马与迈克尔·杰克逊一起去杂货店购物。')) 
[('奥巴马', 'PERSON'), ('与', 'O'), ('迈克尔·杰克逊', 'PERSON'), ('一起', 'O'), ('去', 'O'), ('杂货店', 'O'), ('购物', 'O'), ('。', 'O')] 
+0

OKそれは、今のおかげで動作します。しかし、なぜこれはドキュメントに記載されていないのですか?アンダースコアで始まる変数を変更するのはむしろ面倒なようです。 – yhylord

+0

実際には 'StanfordPOSTagger'は次のNLTKリリースで廃止予定です。新しいCoreNLPPOSTaggerを使用してください。https://github.com/nltk/nltk/pull/1735 – alvas

+0

中国語https://github.com/nltk/nltk/pull/1735#issuecomment-306137326 – alvas

関連する問題