在Java中为Maxent类文件创建训练数据

时间:2016-03-16 10:21:29

标签: java machine-learning classification maxent

我正在尝试为maxent分类器创建java实现。我需要将句子分类为n个不同的类。

我看了ColumnDataClassifier in stanford maxent classifier。但我无法理解如何创建培训数据。我需要训练数据的形式,其中训练数据包括句子单词的POS标签,因此用于分类器的功能将类似于前一个单词,下一个单词等。

我正在寻找训练数据,其中包含POS TAGGING和句子类句子。例如:

我/(POS)名称/(POS)是/(POS)XYZ /(POS)CLASS

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

如果我理解正确,你会试图将句子视为一组POS标签。

在你的例子中,句子"我的名字是XYZ"将表示为一组(PRP $,NN,VBZ,NNP)。 这意味着,每个句子实际上都是长度为37的二进制向量(因为36 possible POS tags according to this page +整个句子的CLASS结果特征)

可以按如下方式对OpenNLP Maxent进行编码:

PRP$=1 NN=1 VBZ=1 NNP=1 CLASS=SomeClassOfYours1

或简单地说:

PRP$ NN VBZ NNP CLASS=SomeClassOfYours1

(有关工作代码段,请参阅我的答案:Training models using openNLP maxent

更多样本数据将是:

  1. "到1978年,无线电城失去了魅力,洛克菲勒中心的业主决定拆除老化的大厅。"
  2. "他完全被遗忘了,他的许多建筑物被拆除,其他建筑物被无情地改变了。"
  3. "一旦她搬出去,移动房屋就被拆除了,诉讼说。"
  4. ...
  5. 这将产生样本:

    IN CD NNP VBD VBN PRP$ NN CC DT NNS IN TO VB VBG CLASS=SomeClassOfYours2
    IN NN PRP VBD RB VBN JJ IN PRP$ NNS CLASS=SomeClassOfYours3
    IN RB PRP VBD RP DT JJ NN VBN NN CLASS=SomeClassOfYours2
    ...
    

    但是,我不希望这样的分类产生良好的结果。最好利用句子的其他结构特征,例如可以使用例如句子获得的解析树或依赖树。 Stanford parser

    于2016年3月28日编辑: 您也可以将整个句子用作训练样本。但是,请注意: - 两个句子可能包含相同的单词但含义不同 - 过度拟合的几率很高 - 你应该使用短句 - 你需要一套庞大的训练集

    根据您的示例,我将按如下方式对训练样本进行编码:

    class=CLASS My_PRP name_NN is_VBZ XYZ_NNP
    ...
    

    请注意,结果变量是每行的第一个元素。

    以下是使用opennlp-maxent-3.0.3.jar的完整工作的最小示例。

    package my.maxent;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.zip.GZIPInputStream;
    
    import opennlp.maxent.GIS;
    import opennlp.maxent.io.GISModelReader;
    import opennlp.maxent.io.SuffixSensitiveGISModelWriter;
    import opennlp.model.AbstractModel;
    import opennlp.model.AbstractModelWriter;
    import opennlp.model.DataIndexer;
    import opennlp.model.DataReader;
    import opennlp.model.FileEventStream;
    import opennlp.model.MaxentModel;
    import opennlp.model.OnePassDataIndexer;
    import opennlp.model.PlainTextFileDataReader;
    
    public class MaxentTest {
    
    
        public static void main(String[] args) throws IOException {
    
            String trainingFileName = "training-file.txt";
            String modelFileName = "trained-model.maxent.gz";
    
            // Training a model from data stored in a file.
            // The training file contains one training sample per line.
            DataIndexer indexer = new OnePassDataIndexer( new FileEventStream(trainingFileName)); 
            MaxentModel trainedMaxentModel = GIS.trainModel(100, indexer); // 100 iterations
    
            // Storing the trained model into a file for later use (gzipped)
            File outFile = new File(modelFileName);
            AbstractModelWriter writer = new SuffixSensitiveGISModelWriter((AbstractModel) trainedMaxentModel, outFile);
            writer.persist();
    
            // Loading the gzipped model from a file
            FileInputStream inputStream = new FileInputStream(modelFileName);
            InputStream decodedInputStream = new GZIPInputStream(inputStream);
            DataReader modelReader = new PlainTextFileDataReader(decodedInputStream);
            MaxentModel loadedMaxentModel = new GISModelReader(modelReader).getModel();
    
            // Now predicting the outcome using the loaded model
            String[] context = {"is_VBZ", "Gaby_NNP"};
            double[] outcomeProbs = loadedMaxentModel.eval(context);
    
            String outcome = loadedMaxentModel.getBestOutcome(outcomeProbs);
            System.out.println("=======================================");
            System.out.println(outcome);
            System.out.println("=======================================");
        }
    
    }
    

    一些虚拟训练数据(存储为training-file.txt):

    class=Male      My_PRP name_NN is_VBZ John_NNP
    class=Male      My_PRP name_NN is_VBZ Peter_NNP
    class=Female    My_PRP name_NN is_VBZ Anna_NNP
    class=Female    My_PRP name_NN is_VBZ Gaby_NNP
    

    这会产生以下输出:

    Indexing events using cutoff of 0
    Computing event counts...  done. 4 events
    Indexing...  done.
    Sorting and merging events... done. Reduced 4 events to 4.
    Done indexing.
    Incorporating indexed data for training...  
    done.
        Number of Event Tokens: 4
            Number of Outcomes: 2
          Number of Predicates: 7
    ...done.
    Computing model parameters ...
    Performing 100 iterations.
      1:  ... loglikelihood=-2.772588722239781  0.5
      2:  ... loglikelihood=-2.4410105407571203 1.0
          ...
     99:  ... loglikelihood=-0.16111520541752372    1.0
    100:  ... loglikelihood=-0.15953272940719138    1.0
    =======================================
    class=Female
    =======================================