Mallet是Umass大牛开发的一个关于统计自然语言处理的l的开源库,很好的一个东西。可以用来学topic model,训练ME模型等。对于开发者来说,其官网的技术文档是非常有效的。

mallet下载地址,浏览开发者文档,只需点击相应的“Developer's Guide”。

下面以开发一个简单的最大熵分类模型为例,可参考文档

首先下载mallet工具包,该工具包中包含代码和jar包,简单起见,我们导入mallet-2.0.7\dist下的mallet.jar和mallet-deps.jar,导入jar包过程为:项目右击->Properties->Java Build Path->Libraries,点击“Add JARs”,在路径中选取相应的jar包即可。

新建Maxent类,代码如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import cc.mallet.classify.Classifier;
import cc.mallet.classify.ClassifierTrainer;
import cc.mallet.classify.MaxEntTrainer;
import cc.mallet.classify.Trial;
import cc.mallet.pipe.iterator.CsvIterator;
import cc.mallet.types.Alphabet;
import cc.mallet.types.FeatureVector;
import cc.mallet.types.Instance;
import cc.mallet.types.InstanceList;
import cc.mallet.types.Label;
import cc.mallet.types.LabelAlphabet;
import cc.mallet.types.Labeling;
import cc.mallet.util.Randoms; public class Maxent implements Serializable{ //Train a classifier
public static Classifier trainClassifier(InstanceList trainingInstances) {
// Here we use a maximum entropy (ie polytomous logistic regression) classifier.
ClassifierTrainer trainer = new MaxEntTrainer();
return trainer.train(trainingInstances);
} //save a trained classifier/write a trained classifier to disk
public void saveClassifier(Classifier classifier,String savePath) throws IOException{
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(savePath));
oos.writeObject(classifier);
oos.flush();
oos.close();
} //restore a saved classifier
public Classifier loadClassifier(String savedPath) throws FileNotFoundException, IOException, ClassNotFoundException{
// Here we load a serialized classifier from a file.
Classifier classifier;
ObjectInputStream ois = new ObjectInputStream (new FileInputStream (new File(savedPath)));
classifier = (Classifier) ois.readObject();
ois.close();
return classifier;
} //predict & evaluate
public String predict(Classifier classifier,Instance testInstance){
Labeling labeling = classifier.classify(testInstance).getLabeling();
Label label = labeling.getBestLabel();
return (String)label.getEntry();
} public void evaluate(Classifier classifier, String testFilePath) throws IOException {
InstanceList testInstances = new InstanceList(classifier.getInstancePipe()); //format of input data:[name] [label] [data ... ]
CsvIterator reader = new CsvIterator(new FileReader(new File(testFilePath)),"(\\w+)\\s+(\\w+)\\s+(.*)",3, 2, 1); // (data, label, name) field indices // Add all instances loaded by the iterator to our instance list
testInstances.addThruPipe(reader);
Trial trial = new Trial(classifier, testInstances); //evaluation metrics.precision, recall, and F1
System.out.println("Accuracy: " + trial.getAccuracy());
System.out.println("F1 for class 'good': " + trial.getF1("good"));
System.out.println("Precision for class '" +
classifier.getLabelAlphabet().lookupLabel(1) + "': " +
trial.getPrecision(1));
} //perform n-fold cross validation
public static Trial testTrainSplit(MaxEntTrainer trainer, InstanceList instances) {
int TRAINING = 0;
int TESTING = 1;
int VALIDATION = 2; // Split the input list into training (90%) and testing (10%) lists.
InstanceList[] instanceLists = instances.split(new Randoms(), new double[] {0.9, 0.1, 0.0});
Classifier classifier = trainClassifier(instanceLists[TRAINING]);
return new Trial(classifier, instanceLists[TESTING]);
} public static void main(String[] args) throws FileNotFoundException,IOException{
//define training samples
Alphabet featureAlphabet = new Alphabet();//特征词典
LabelAlphabet targetAlphabet = new LabelAlphabet();//类标词典
targetAlphabet.lookupIndex("positive");
targetAlphabet.lookupIndex("negative");
targetAlphabet.lookupIndex("neutral");
targetAlphabet.stopGrowth();
featureAlphabet.lookupIndex("f1");
featureAlphabet.lookupIndex("f2");
featureAlphabet.lookupIndex("f3");
InstanceList trainingInstances = new InstanceList (featureAlphabet,targetAlphabet);//实例集对象
final int size = targetAlphabet.size();
double[] featureValues1 = {1.0, 0.0, 0.0};
double[] featureValues2 = {2.0, 0.0, 0.0};
double[] featureValues3 = {0.0, 1.0, 0.0};
double[] featureValues4 = {0.0, 0.0, 1.0};
double[] featureValues5 = {0.0, 0.0, 3.0};
String[] targetValue = {"positive","positive","neutral","negative","negative"};
List<double[]> featureValues = Arrays.asList(featureValues1,featureValues2,featureValues3,featureValues4,featureValues5);
int i = 0;
for(double[]featureValue:featureValues){
FeatureVector featureVector = new FeatureVector(featureAlphabet,
(String[])targetAlphabet.toArray(new String[size]),featureValue);//change list to array
Instance instance = new Instance (featureVector,targetAlphabet.lookupLabel(targetValue[i]), "xxx",null);
i++;
trainingInstances.add(instance);
} Maxent maxent = new Maxent();
Classifier maxentclassifier = maxent.trainClassifier(trainingInstances);
//loading test examples
double[] testfeatureValues = {0.5, 0.5, 6.0};
FeatureVector testfeatureVector = new FeatureVector(featureAlphabet,
(String[])targetAlphabet.toArray(new String[size]),testfeatureValues);
//new instance(data,target,name,source)
Instance testinstance = new Instance (testfeatureVector,targetAlphabet.lookupLabel("negative"), "xxx",null);
System.out.print(maxent.predict(maxentclassifier, testinstance));
//maxent.evaluate(maxentclassifier, "resource/testdata.txt");
}
}

说明:trainingInstances为训练样本,testinstance为测试样本,该程序的执行结果为“negative”。

Eclipse下mallet使用的方法的更多相关文章

  1. eclipse下maven一些配置方法汇总

    随着eclipse的不同版本的变更:对maven插件的安装也有着不同的差异:之前也在一些版本的eclipse上安装成功地,但是最近又遇到了一些麻烦,故将这些方法记录下来: 大家都知道的最常用的一种方式 ...

  2. eclipse下使用cygwin的方法(Windows下用eclipse玩gcc/g++和gdb)

    明天就回国了,今晚回国前写写如何配置eclipse和CDT.这个配置方法网上讨论不是很多,可能用的人少,毕竟Windows上写C++程序多数喜欢VS,即使写的是Linux程序,很多人仍然会用VS(说只 ...

  3. Eclipse 下安装 SVN的方法

    http://welcome66.iteye.com/blog/1845176 eclipse里安装SVN插件,一般来说,有两种方式: 直接下载SVN插件,将其解压到eclipse的对应目录里 使用e ...

  4. eclipse下修改项目名导致tomcat内发布名不一致的解决方法 .

    eclipse下修改项目名导致tomcat内发布名不一致的解决方法 . ------------------------------------------------------- 解决方案: 直接 ...

  5. eclipse下java中凝视字体太小和xml中中文字体太小问题解决方法

    我们在win7下进行android应用开发.须要搭建对应的开发环境.如今普遍基本上都是eclipse+adt+sdk,在本人搭建完环境后,发现eclipse下.java中的凝视和xml中的中文字体变得 ...

  6. eclipse下Android工程名称的修改方法

    eclipse下Android工程名称的修改方法 对于已经建立的工程,如果发现原来的工程名不合适,此时若想彻底更改工程名,需要三个步骤: 1.更改工程名 选中工程名,右键-->Refactor- ...

  7. Eclipse下配置javaweb项目快速部署到tomcat

    用惯了VS,再用Eclipse,完全有一种从自动挡到手动挡的感觉啊. 很多同学在Eclipse下开发web项目,每一次修改代码,看效果的时候都有右键项目->Run as -> Run on ...

  8. eclipse maven update error 解决方法

    eclipse  maven  update error 解决方法     本来真不想写这篇博文的,但是eclipse和maven真的是太操蛋了,动不动就出了一些乱七八糟的问题,记录一下.希望公司能早 ...

  9. eclipse下maven项目保持原有目录结构配置resin运行环境

    maven项目用起来很方便,但是它的目录结构和eclipse的目录结构是有区别的,故而在eclipse下的maven项目,直接运行调试是有一些问题的. 为了方便maven项目的运行调试,因而也就有了像 ...

随机推荐

  1. 51Nod - 1006 最长公共子序列Lcs模板

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).   比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是,abca也是,其中abca是这 ...

  2. OkHttp与Cookie及Cookie的持久化

    http://blog.csdn.net/u011150924/article/details/52780931 http://blog.csdn.net/chen19960724/article/d ...

  3. android 图片旋转 移动 放大缩小

    图片的变化主要是matrix的变化,对matrix不懂的可以先了解下matrxi. public class FunnyView extends View { /* * 手指按下时可能是移动 也可能是 ...

  4. shell 监控磁盘使用率【转】

    方案一: disks=(`df |sed 1d | awk '{print $1,$5}'|tr -d %`) len=${#disks[@]} ;i<=$len;i=i+));do ];the ...

  5. 大数据系列之Kafka安装

    先简单说下安装kafka的流程..(可配置多个zookeeper,这篇文只说一个zookeeper场景) 1.环境配置:jdk1.7+ (LZ用的是jdk1.8) 2.资料准备:下载 kafka_2. ...

  6. shell中的变量与eval(转)

    原文链接:http://www.361way.com/shell-eval-variable/4957.html shell 中经常会用到变量的嵌套的情况.比如,单个或多个变量的值作为变量名,再对该变 ...

  7. 使用extjs做的一个简单grid

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  8. PHP下利用PHPMailer

    PHPMailer有什么优点? 可运行在任何平台之上 支持SMTP验证 发送邮时指定多个收件人,抄送地址,暗送地址和回复地址:注:添加抄送.暗送仅win平台下smtp方式支持 支持多种邮件编码包括:8 ...

  9. hive的窗口函数cume_dist、fercent_rank

    一.cume_dist 这两个序列分析函数不是很常用,这里也介绍一下.注意: 序列函数不支持WINDOW子句. 数据准备: d1,user1, d1,user2, d1,user3, d2,user4 ...

  10. iptables配置文件

    https://www.cnblogs.com/itxiongwei/p/5871075.html