2017-01-18 7 views
0

私はここからJavaで(エンティティ認識装置名前付き)スタンフォードNERをカスタマイズする方法を学びました:スタンフォードNERをPythonでカスタマイズするには?

http://nlp.stanford.edu/software/crf-faq.shtml#a

しかし、私は、Pythonで私のプロジェクトを開発していますし、ここで私はいくつかのカスタムエンティティと私のclassierを訓練する必要があります。

解決策をたくさん検索しましたが、何も見つかりませんでした。何か案が?可能でない場合、カスタムエンティティ、つまりnltkなどで分類器を訓練する方法は他にもありますか?

EDIT:このコードが正常に働いていた

from nltk.tag.stanford import StanfordNERTagger 
path_to_model = "C:\..\stanford-ner-2016-10-31\classifiers\english.all.3class.distsim.crf.ser" 
path_to_jar = "C:\..\stanford-ner-2016-10-31\stanford-ner.jar" 
nertagger=StanfordNERTagger(path_to_model, path_to_jar) 
query="Show me the best eye doctor in Munich" 
print(nertagger.tag(query.split())) 

:コード付加 は、これは私がうまく働いていたスタンフォードNERを設定し、テストするために何をしたかです。次にサンプルausten.propファイルとjane-austen-emma-ch1.tsvとjane-austen-emma-ch2.tsvファイルをダウンロードし、NerTraggerライブラリフォルダのカスタムフォルダに入れました。カスタムエンティティタグでjane-austen-emma-ch1.tsvファイルを修正しました。 austen.propファイルのコードには、jane-austen-emma-ch1.tsvファイルへのリンクがあります。今、私は次のように上記のコードを変更し、それが動作していません。

from nltk.tag.stanford import StanfordNERTagger 
path_to_model = "C:\..\stanford-ner-2016-10-31\custom/austen.prop" 
path_to_jar = "C:\..\stanford-ner-2016-10-31\stanford-ner.jar" 
nertagger=StanfordNERTagger(path_to_model, path_to_jar) 
query="Show me the best eye doctor in Munich" 
print(nertagger.tag(query.split())) 

しかし、このコードは、次のエラーを生成します

Exception in thread "main" edu.stanford.nlp.io.RuntimeIOException: java.io.StreamCorruptedException: invalid stream header: 236C6F63 
    raise OSError('Java command failed : ' + str(cmd)) 
    at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifierNoExceptions(AbstractSequenceClassifier.java:1507) 
    at edu.stanford.nlp.ie.crf.CRFClassifier.main(CRFClassifier.java:3017) 
Caused by: java.io.StreamCorruptedException: invalid stream header: 236C6F63 
OSError: Java command failed : ['C:\\Program Files\\Java\\jdk1.8.0_111\\bin\\java.exe', '-mx1000m', '-cp', 'C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31\\stanford-ner-3.7.0-javadoc.jar;C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31\\stanford-ner-3.7.0-sources.jar;C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31\\stanford-ner-3.7.0.jar;C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31\\stanford-ner.jar;C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31\\lib\\joda-time.jar;C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31\\lib\\jollyday-0.4.9.jar;C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31\\lib\\stanford-ner-resources.jar', 'edu.stanford.nlp.ie.crf.CRFClassifier', '-loadClassifier', 'C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31/custom/austen.prop', '-textFile', 'C:\\Users\\HP\\AppData\\Local\\Temp\\tmppk8_741f', '-outputFormat', 'slashTags', '-tokenizerFactory', 'edu.stanford.nlp.process.WhitespaceTokenizer', '-tokenizerOptions', '"tokenizeNLs=false"', '-encoding', 'utf8'] 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:808) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:301) 
    at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifier(AbstractSequenceClassifier.java:1462) 
    at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifier(AbstractSequenceClassifier.java:1494) 
    at edu.stanford.nlp.ie.AbstractSequenceClassifier.loadClassifierNoExceptions(AbstractSequenceClassifier.java:1505) 
    ... 1 more 
+1

この問題は、トレーニングとモデルの使用の違いについての混乱であることは明らかです。私の更新された答えを見てください。 – alexis

答えて

3

スタンフォードNER分類器は、Javaプログラムです。 NLTKのモジュールは、Java実行可能ファイルへのインタフェースです。だから、以前と同じようにモデルを訓練しています(または、あなたが提供したリンクを見ているように)。

コードでは、新しいテキストをチャンクするためにモデルのトレーニングを混乱させています。 .propファイルには、新しいモデルのトレーニング手順が記載されています。それ自体はモデルではありません。これは私がお勧めです:

  1. は一瞬のpython/NLTKを忘れると、Windowsのコマンドライン(プロンプトまたは任意CMD)から新しいモデルを訓練:ハウツーあなたをフォロー言及あなたの質問に、 ner-model.ser.gzという名前のシリアル化されたモデル(.serファイル)を作成するか、.propファイルから呼び出すことを決めたものを作成します。あなたのpythonのコードで

  2. 、あなたが本当にのpythonからトレーニングプロセスを制御したい場合は、あなたがsubprocessを使用することができます。手順1.

で生成.serファイルを指すようにpath_to_model変数を設定適切なコマンドラインコマンドを発行するモジュール。しかし、あなたは本当にこれを必要としないように思えます。これらのステップが正しく実行できるようにするために、これらのステップが何をするのかを理解しようとしてください。

+0

NERで通常行っているように分類器をセットアップしようとしました。しかし、crf.ser.gzファイルの代わりにチュートリアルで提案されているプロパティー・ファイルを使用すると、Javaコマンドの失敗エラーが表示されます。 st = StanfordNERTagger( 'C:/Users/HP/Desktop/Downloads1/Compressed/stanford-ner-2016-10-31/stanford-ner-2016-10-31/custom/austen.prop'、 'C​​:/'ユーザー/ HP /デスクトップ/ダウンロード1 /圧縮/スタンフォード - ner-2016-10-31 /スタンフォード - ner-2016-10-31 /スタンフォードner。jar ') query = "ミュンヘンで最高の眼科医を教えてください" print(st.tag(query.split()) – Newbie23

+0

私はこれについてお手伝いできますか? – Newbie23

+0

**あなたの質問**を編集して、あなたがしたこととあなたが持つ問題を説明してください。あなたのコメントに表示されたコマンドと共に、完全なエラートレースを含めてください。そうすれば私や他の誰かが助けることができます。 – alexis

関連する問題