6

を使用して CRF をトレーニングしました。ファイルGenericAcrfTuiに書き込みACRFます。トレーニング済みの CRFを読み込んで使用する方法はよくわかりませんが、

import cc.mallet.grmm.learning.ACRF;
import cc.mallet.util.FileUtils;
ACRF c = (ACRF) FileUtils.readObject(Paths.get("acrf.ser.gz").toFile());

動作するようです。ただし、ラベル付けは正しくないようで、入力として渡すラベルに依存しているようです。 ロードされた ACRF を使用してラベルを付けるにはどうすればよいですか?

ラベル付けの方法は次のとおりです。

GenericAcrfData2TokenSequence instanceMaker = new GenericAcrfData2TokenSequence();
instanceMaker.setDataAlphabet(c.getInputAlphabet());
instanceMaker.setIncludeTokenText(true);
instanceMaker.setFeaturesIncludeToken(true);
instanceMaker.setLabelsAtEnd(false);
Pipe pipe = new SerialPipes(new Pipe[] {
        instanceMaker,
        new TokenSequence2FeatureVectorSequence(c.getInputAlphabet(),
                true, false),
});
InstanceList testing = new InstanceList(pipe);
Iterator<Instance> testSource = new LineGroupIterator(
    // initialize the labels to O
        new StringReader("O O ---- what W=the@1 W=hell@2\n"
                    + "O O ---- the W=what@-1 W=hell@1\n"
                    + "O O ---- hell W=what@-2 W=the@-1"),
        Pattern.compile("^\\s*$"), true);
testing.addThruPipe(testSource);
System.out.println(c.getBestLabels(testing.get(0)));

を見てわかったGenericAcrfTui。私が試したいくつかのこと:

  • 異なる初期ラベル (「O」以外) を付けようとすると、結果のラベル付けが変更されましたが、最初に付けるラベルを推測できないため、これは役に立ちません。そうしないと、タガーは必要ありません。
  • 最初のラベルをまったく付けないようにしましたが、例外が発生しました。Mallet は本当にそれらのラベルが必要なようです。

SimpleTaggera のトレーニングに使用できるもあることに気付きましたが、CRFそれを使用して新しい入力にラベルを付けるために同じ問題が発生すると思います。

SimpleTaggerまたはからのCRFを使用したラベル付けに関するヘルプGenericAcrfTuiが役立ちます。

ところで、通常は CRF++ を使用しますが、このタスクでは、依存関係解析機能を使用しているため、独自のグラフを作成したいと考えています。

4

1 に答える 1

5

私はそれを考え出した!

問題は、パイプがターゲットのアルファベットを認識していなかったことです。Pipe解決策は、次のように CRF を使用することです。

Pipe pipe = crf.getInputPipe();

その狂気を自分のものにする代わりにPipe

誰かがInstanceクエリを使用して新しいものを作成するより良い方法を知っているなら、それも良いでしょう。トレーナーが行うことをコピーしただけです。

于 2014-03-21T18:49:24.373 に答える