単語の意味を明確にするために、プロジェクトで MALLET 機械学習ライブラリを使用しようとしています。私の特徴ベクトルは、ターゲット トークンの左右にある x 個のトークンの固定サイズのトークン ウィンドウで構成されています。MALLET トレーニング インスタンスは次のように作成されます。
// Create training list
Pipe pipe = new TokenSequenceLowercase();
InstanceList instanceList = new InstanceList(pipe);
Instance trainingInstance = new Instance(data, senseID, instanceID, text);
instanceList.add(trainingInstance);
...
// Training
ClassifierTrainer classifierTrainer = new NaiveBayesTrainer();
Classifier classifier = classifierTrainer.train(trainingList);
どこ
- 「データ」は機能トークンを持つ ArrayList<String> です
- 「senseID」は、それぞれの語義のクラス ラベルです。
- 「instanceID」は、トレーニング インスタンスを識別する単なる文字列です。
- 「テキスト」は元のソーステキストです
InstanceList の dataAlphabet プロパティと targetAlphabet プロパティは、トレーニング インスタンスが追加されるとオンザフライで構築されると予想していましたが、そうではありません。その結果、NB トレーナーの targetAlphabet プロパティが NULL であるため、私のコードは上記の最後の行で NPE で失敗します。
(オープンソースのおかげで) MALLET コードを見ると、Alphabet が構築されていない根本的な原因は、データとラベルが AlphabetCarrying インターフェイスを実装していないことにあることがわかります。したがって、次の Instance クラスでは NULL が返されます。
public Alphabet getDataAlphabet() {
if (data instanceof AlphabetCarrying)
return ((AlphabetCarrying)data).getAlphabet();
else
return null;
}
ドキュメントには、データとラベルは任意のオブジェクト タイプにすることができると記載されているため、これはややこしいと思います。しかし、上記のエラーは逆に、AlphabetCarrying を実装する特定のデータ/ラベル クラスを構築する必要があることを示しているようです。
これらのアルファベットに関して、概念レベルで重要な何かが欠けているように感じます。また、データ アルファベットをすべてのトレーニング インスタンスから派生させる必要があるのか、それとも 1 つだけから派生させる必要があるのかは明確ではありません。誰かがここでエラーを説明できますか?
乾杯、
マーティン