1

次のコードを使用して、pos-tagging と文の分割に MaxEntTagger を使用しています。

MaxentTagger tagger = new MaxentTagger("models/left3words-wsj-0-18.tagger");

@SuppressWarnings("unchecked")
List<Sentence<? extends HasWord>> sentences = MaxentTagger.tokenizeText(new BufferedReader(new StringReader(out2)));

for (Sentence<? extends HasWord> sentence : sentences) {
    content.append(sentence + "\n");
    Sentence<TaggedWord> tSentence = MaxentTagger.tagSentence(sentence);
    out.append(tSentence.toString(false) + "\n");
}

問題は、テキストにトークン化できない文字があると文句を言うことです。タグ付けされた出力では、これらのトークン化できない文字が省略されます。たとえば、元のテキストは次のとおりです。Σ を関数記号の有限集合、署名とします。

ここで、Σ は big5 コードです。ただし、プログラムは次の警告メッセージを表示します: Untokenizable: Σ (10 進数の最初の文字: 931)

タグ付けされた出力は次のとおりです。/VB を/VB a/DT 有限/JJ セット/IN の NN 関数/NN シンボル/NNS ,/、/DT 署名/NN ./ とします。

私が得た分割文は次のとおりです。関数記号の有限集合、署名をしましょう。

私の質問は、これらのトークン化できない文字を保持する方法ですか?

モードの props ファイルを変更しようとしましたが、うまくいきませんでした:

  Tagger Training は、Sun Sep 21 23:03:26 PDT 2008 に次の引数で呼び出されます。
                    モデル = left3words-wsj-0-18.tagger
                     arch = left3words,naacl2003unknowns,wordshapes(3)
                trainFile = /u/nlp/data/pos-tagger/train-wsj-0-18 ...
                 エンコーディング = Big5
            initFromTrees = false

なにか提案を?

マニング教授の助けに感謝します。しかし、パーサー ツリーを使用すると、同じ問題が発生します。

続編

文のパーサー ツリーを取得する必要があるため、次のコードを使用しました。

PTBTokenizer<Word> ptb = PTBTokenizer.newPTBTokenizer(new StringReader(sentences));            
List<Word> words = ptb.tokenize(); 
Tree parseTree2 = lp.apply(words); 
TreebankLanguagePack tlp = new PennTreebankLanguagePack(); 
GrammaticalStructureFactory gsf = tlp.grammaticalStructureFactory(); 
GrammaticalStructure gs = gsf.newGrammaticalStructure(parseTree2); 

しかし、今回トークン化できない文字の問題を解決するための PTBTokenizer の設定方法がわかりません。ファクトリ メソッドを使用して PTBTokenizer オブジェクトを生成する場合、それを StringReader に連結する方法がわかりません。

List<Word> words = ptb.getTokenizer(new StringReader(sentences)); 

動作しません。

4

1 に答える 1

5

スタンフォード トークナイザーは、トークン化を制御するためのさまざまなオプションを受け入れます。これには、認識されていない文字の処理方法が含まれます。ただし、それらを設定するには、現在、独自のトークナイザーをインスタンス化する必要があります。しかし、それは上記のものよりもはるかに難しいことではありません。次の完全なプログラムは、オプションを使用してトークナイザーを作成し、それを使用してタグを付けます。

「noneKeep」オプションは、不明な文字に関するメッセージをログに記録せずに保持し、それぞれを単一の文字トークンに変換することを意味します。その他のオプションについては、PTBTokenizer クラスの javadoc を参照してください。

注:かなり古いバージョンのタガーを使用しているようです。(私たちは Sentence クラスを取り除き、List's of tokens を約 2 年前に使い始めました。おそらく、これらのオプションがトークナイザーに追加されたのとほぼ同じ時期です。) したがって、最新バージョンにアップグレードする必要があるかもしれません。いずれにせよ、以下のコードは、より新しいバージョンのタガーに対してのみ正しくコンパイルされます。

import java.io.*;
import java.util.*;

import edu.stanford.nlp.ling.*;
import edu.stanford.nlp.process.*;
import edu.stanford.nlp.objectbank.TokenizerFactory;
import edu.stanford.nlp.tagger.maxent.MaxentTagger;

/** This demo shows user-provided sentences (i.e., {@code List<HasWord>}) 
 *  being tagged by the tagger. The sentences are generated by direct use
 *  of the DocumentPreprocessor class. 
 */
class TaggerDemo2 {

  public static void main(String[] args) throws Exception {
    if (args.length != 2) {
      System.err.println("usage: java TaggerDemo modelFile fileToTag");
      return;
    }
    MaxentTagger tagger = new MaxentTagger(args[0]);
    TokenizerFactory<CoreLabel> ptbTokenizerFactory = 
    PTBTokenizer.factory(new CoreLabelTokenFactory(), "untokenizable=noneKeep");
    BufferedReader r = 
        new BufferedReader(new InputStreamReader(new FileInputStream(args[1]), "utf-8"));
    PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out, "utf-8"));
    DocumentPreprocessor documentPreprocessor = new DocumentPreprocessor(r);
    documentPreprocessor.setTokenizerFactory(ptbTokenizerFactory);
    for (List<HasWord> sentence : documentPreprocessor) {
      List<TaggedWord> tSentence = tagger.tagSentence(sentence);
      pw.println(Sentence.listToString(tSentence, false));
    }
  }

}
于 2012-06-20T16:05:22.753 に答える