最大熵开源——openNLP MaxEnt

opennlp.maxent package是一个比较成熟的Java package,用来训练和使用最大熵模型。
本文描述最大熵和使用opennlp.maxent package的一些相关细节。

更新内容:http://sourceforge.net/projects/maxent/(Sourceforge page for Maxent )
Download:http://sourceforge.net/projects/maxent/files/
讨论组:http://sourceforge.net/p/maxent/discussion/(forums)


一、最大熵是什么?
参考:http://www-nlp.stanford.edu/~manning/
以免翻译有误,还是上原文吧~~~~~
Maximum entropy modeling is a framework for integrating information from many heterogeneous information sources for classification.  The data for a  classification problem is described as a (potentially large) number of features.  These features can be quite complex and allow the experimenter to make use of prior knowledge about what types of informations are expected to be important for classification. Each feature corresponds to a constraint on the model.  We then compute the maximum entropy model, the model with the maximum entropy of all the models that satisfy the constraints.  This term may seem perverse, since we have spent most of the book trying to minimize the (cross) entropy of models, but the idea is that we do not want to go beyond the data.  If we chose a model with less entropy, we would add `information' constraints to the model that are not justified by the empirical evidence available to us. Choosing the maximum entropy model is motivated by the desire to preserve as much uncertainty as possible.


概括:最大熵模型基本思想是除了你能观察到的知识以外,对概率分布不要作任何额外假设。
应用:词性标注、句子发现、命名实体识别等自然语言处理领域及其他更多领域。
优点:不需要关注特征之间的相互依赖,专注event空间即可。
由来:统计物理学。


二、最大熵模型的使用
1、概念

必备技能:
     1.An understanding of feature selection for maxent modeling.
     2.Java skills or the ability to read some example Java code and turn it into what you need.

特征函数映射关系:
     outcomes (classes) and contexts -> true/false ,举例:
     feature (outcome, context)  = { 1   if  outcome=DETERMINER &&  currentword(context) = "that"
                                                { 0   otherwise
注意:
     建模就是要选择对于分类决策有用的特征。
     特征的理论表示和实现表示不一样,如上面的例子
     理论表示 currentword(context)="that"
     实现表示 current=that" or even just "that"

2、model的使用
 现要做这么一件事情:使用MaxEnt找出下面句子中的名字
 He succeeds Terrence D. Daniels, formerly a W.R. Grace vice chairman, who resigned.

 假如现在看到了单词“Terrence”,你试图去判断它是否是名字,你可能会选择如下特征:
 "previous=succeeds", "current=Terrence", "next=D.", and "currentWordIsCapitalized". 甚至再加一个特征 "Terrence" was seen as a name before


  那么怎么把这信息变为实现呢?假设已经有了一个查找名字的model,而且也已经使用这个模型建好了MaxEntModel接口的实例,至此可以使用openNLP maxent来判断,流程如下:
   1.model的输入准备
     特征数组String[],如上面定义。
   2.调用方法
      public double[] eval(String[] context);传递特征String[]给model
      返回值:model赋给每个类别结果的概率值数组。如结果可能是“TRUE”(索引为0)和“FALSE”(索引为1)。
  3.找到结果索引对应的名字
     调用public String getOutcome(int i);
  4.返回概率值最高的结果
     调用public String getBestOutcome(double[] outcomes);


3、model的训练
   数据准备:event集合,实现EventStream对象。一个event包括outcome和context,如:
          outcome: T 
          context: previous=succeeds current=Terrence next=D. currentWordIsCapitalized
   model训练
          opennlp.maxent实现了GIS(Generalized Iterative Scaling )算法,实现方法调用GIS.trainModel
           public static MaxentModel trainModel(DataIndexer di, int iterations) {  ...  }
           参数:iterations 迭代次数(不要超过100)
   数据格式化:
          DataIndexer是一个abstract objec,用来将EventStream收集的event数据格式化,以便更有效的训练它们。用下面方法创建一个DataIndexer实例
          public OnePassDataIndexer(EventStream es, int cutoff){ ... }  cutoff为阈值,特征在model里出现的最少次数
          也可以调用构造函数 OnePassDataIndexer(EventStream events)  阈值为0

   model输出:
         将返回的model写到disk
          File outputFile = new File(modelFileName+".bin.gz"); 
          GISModelWriter writer = new SuffixSensiiveGISModelWriter(model, outputFile); 
          writer.persist();

  二进制格式保存:

         使用BinaryGISModelWriter类

4、model加载:
     GISModel m = new SuffixSensitiveGISModelReader(new File(modelFileName)).getModel();

5、自带例子

     samples/sports

 

你可能感兴趣的:(机器学习,自然语言处理,文本分类)