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

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

我在stanford maxent分类器中查看了ColumnDataClassifier 。 但我无法理解如何创建培训数据。 我需要训练数据的forms,其中训练数据包括句子单词的POS标签,以便用于分类器的function将像前一个单词,下一个单词等。

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

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

任何帮助将不胜感激。

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

在您的示例中,句子“我的名字是XYZ”将表示为一组(PRP $,NN,VBZ,NNP)。 这意味着,每个句子实际上都是长度为37的二进制向量(因为根据此页面有36个可能的POS标签 +整个句子的CLASS结果特征)

这可以编码为OpenNLP Maxent,如下所示:

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

或者干脆:

 PRP$ NN VBZ NNP CLASS=SomeClassOfYours1 

(对于工作代码片段,请参阅我的答案: 使用openNLP maxent训练模型 )

一些更多的样本数据将是:

  1. “到了1978年,无线电城失去了魅力,洛克菲勒中心的业主决定拆除老化的大厅。”
  2. “他完全被遗忘了,他的许多建筑物都被拆除了,其他建筑物也变得无用了。”
  3. “她搬出去后,移动房屋被拆除了,诉讼说。”

这将产生样本:

 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 ... 

但是,我不认为这样的分类会产生良好的结果。 最好利用句子的其他结构特征,例如可以使用例如斯坦福解析器获得的解析树或依赖树。

编辑于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 =======================================