を使用して 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 は本当にそれらのラベルが必要なようです。
SimpleTagger
a のトレーニングに使用できるもあることに気付きましたが、CRF
それを使用して新しい入力にラベルを付けるために同じ問題が発生すると思います。
SimpleTagger
またはからのCRFを使用したラベル付けに関するヘルプGenericAcrfTui
が役立ちます。
ところで、通常は CRF++ を使用しますが、このタスクでは、依存関係解析機能を使用しているため、独自のグラフを作成したいと考えています。