2017-06-14 8 views
1

OpenNLPを使用して請求書を分類しようとしています。その説明に基づいて私はそれを2つのクラスに分類します。私は、20Kの記述で訓練ファイルを構築し、それぞれを正しいクラスにタグ付けしました。OpenNLPドキュメント分類のトレーニング

トレーニングデータ(最初の列は、私はクラスとして使用することは、コードであり、2番目の列は、請求書の記述である)のように見える:

OpenNLPからDocumentCategorizerを使用
85171231 IPHONE 5S CINZA ESPACIAL 16GB (ME432BZA) 
85171231 Galaxy S6 SM-G920I 
85171231 motorola - MOTO G5 XT1672 
00000000 MOTONETA ITALIKA AT110 
00000000 CJ BOX UNIBOX MOLA 138X57X188 VINHO 

、Iは98.5%を達成しました正確さしかし、効率性を向上させるために、間違った分類された文書を取り、それを使用してトレーニングデータを拡張しました。

たとえば、私が最初に実行したとき、「MOTONETA ITALIKA AT110」は「85171231」と分類されました。最初の試合には「MOTONETA ITALIKA AT110」が分類されていなかったので、大丈夫です。だから、 "MOTONETA ITALIKA AT110"を明示的に "00000000"とタグ付けして分類器を教えました。

しかし、OpenNLPは、トレーニングデータに "000000"の明示マップが含まれていても、それを再び "85171231"と分類するようにしています。

私の質問は:私はOpenNLPライトを教えていますか?どのように効率を上げるのですか?

私が使用しているコードは次のとおりです。デフォルトで

MarkableFileInputStreamFactory dataIn = new MarkableFileInputStreamFactory("data.train"); 

ObjectStream<String> lineStream = new PlainTextByLineStream(dataIn, StandardCharsets.UTF_8); 
ObjectStream<DocumentSample> sampleStream = new DocumentSampleStream(lineStream); 

TrainingParameters params = new TrainingParameters(); 
params.put(TrainingParameters.ITERATIONS_PARAM, "100"); 
params.put(TrainingParameters.CUTOFF_PARAM, "0"); 

DoccatModel model = DocumentCategorizerME.train("pt", sampleStream, params, new DoccatFactory()); 

DocumentCategorizer doccat = new DocumentCategorizerME(model); 
double[] aProbs = doccat.categorize("MOTONETA ITALIKA AT110".replaceAll("[^A-Za-z0-9 ]", " ").split(" ")); 
doccat.getBestCategory(aProbs); 

答えて

3

、DocumentCategorizerは言葉の袋を使用します。これは、用語の順序が考慮されないことを意味します。 グループ85171231に高い頻度でMOTONETA ITALIKA AT110という用語が含まれる場合、分類子はそのグループを使用する傾向があります。

あなたは、いくつかの選択肢があります:

  • あなたがグループ000000MOTONETA ITALIKA AT110のより多くのバリエーションを追加することができます。
  • フィーチャージェネレーターを変更してみてください。

2番目のオプションは、このように、モデルの作成を変更するには、次のようになります。

int minNgramSize = 2; 
int maxNgramSize = 3; 
DoccatFactory customFactory = new DoccatFactory(
    new FeatureGenerator[]{ 
     new BagOfWordsFeatureGenerator(), 
     new NGramFeatureGenerator(minNgramSize, maxNgramSize) 
    } 
); 
DoccatModel model = DocumentCategorizerME.train("pt", sampleStream, params, customFactory); 

あなたはBagOfWordsFeatureGeneratorを削除し、最小値と最大値nグラムの大きさを変更することにより、機能・ジェネレータで遊ぶことができます。

関連する問題