(刚开始接触,测试了一些Demo,写在博客上防止遗忘,如果错了,那就错了。0菜鸟先飞0)
开源工具lingpipe基本涵盖了NLP的很多领域,包含的算法也很多也有相应的论文,最厉害的是它支持中文处理,测试了一个sentiment Analyse的demo,精度大概能达到80%左右。lingpipe首页提供了工具的下载,直接下载下来以后,可以导入到eclipse。
配置步骤:
1,eclipse选择new--java project--other--Java Project from Existing Ant Buildfile。
2,选中lingpipe-4.1.0---demos---tutorial---sentiment---bulid.xml
3,还需要build path --libraries--add external jar --lib文件夹下的.jar文件
测试过程:
lingpipe 官方提供了测试的Demo。共有4个,包括基本极性分析,polarity Basic.java。主客观句识别 sujectivitybasic.java。
在原代码的基础上,添加 了一个情感词库,该情感词库包含情感得分,可以判断正负极性。
代码(修改版,测试句子的正负性,添加一个情感词典。):
import com.aliasi.util.Files; import com.test.Sentiment.TestSentiment1; import com.test.Sentiment.TrainSentiment; import com.aliasi.classify.Classification; import com.aliasi.classify.Classified; import com.aliasi.classify.DynamicLMClassifier; import com.aliasi.lm.NGramProcessLM; import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Iterator; import java.util.Locale.Category; public class PolarityBasic { File mPolarityDir;//极性词典 String[] mCategories;//类别集合 DynamicLMClassifier<NGramProcessLM> mClassifier;//分类模型 /** * @param mPolarityDir读取需要训练的文件 * @param mCategories 存取类别集合 * @author NLP1r */ PolarityBasic(String[] args) { System.out.println("\nBASIC POLARITY DEMO"); mPolarityDir = new File("parents path","child path"); System.out.println("\nData Directory=" + mPolarityDir);//输出文件路径 mCategories = mPolarityDir.list();//存储类别集合 //System.out.println(mCategories.length); int nGram = 8;//应该是一次关联8个文件 mClassifier = DynamicLMClassifier .createNGramProcess(mCategories,nGram);//创建分类模型,参数是(类别,n-路径) } void run() throws ClassNotFoundException, IOException, SQLException { train(); evaluate(); } boolean isTrainingFile(File file) { //判断选择作为训练文件的文件 return file.getName().charAt(4) != '1'; // test on fold 9 } void train() throws IOException, SQLException { int numTrainingCases = 0;//训练例子数量 int numTrainingChars = 0; System.out.println("\nTraining."); for (int i = 0; i < mCategories.length; ++i) {//类别的长度 String category = mCategories[i];//category 代表第一个类别,第二个类别。。。。。 Classification classification = new Classification(category);//声明classification对象引用类别集合参数 File file = new File(mPolarityDir,mCategories[i]);//创建file对象参数方式为<待训练文件,类别> File[] trainFiles = file.listFiles();//file对象的数组存储形式,很多个。下一步进行一个一个的遍历 for (int j = 0; j < trainFiles.length; ++j) { File trainFile = trainFiles[j];//具体某个文件和其类别j=1.2.3.4........的集合1 //判断该集合1是否为训练文件 if (isTrainingFile(trainFile)) { ++numTrainingCases;//true 训练总数+1 String review = Files.readFromFile(trainFile,"GBK");//读取所有的trainfile numTrainingChars += review.length();//所有trainfile的长度赋予给numTrainingChars Classified<CharSequence> classified = new Classified<CharSequence>(review,classification);//创建新的分类对象 mClassifier.handle(classified);//对以上分类信息做处理 } } TrainSentiment.main(mClassifier); System.out.println(" # Training Cases=" + numTrainingCases); System.out.println(" # Training Chars=" + numTrainingChars); } void evaluate() throws IOException { String test="一个忠厚老实的人,确给别人背黑锅"; Classification classification2 = mClassifier.classify(test); System.out.println(test.toString()+classification2.bestCategory()) } public static void main(String[] args) { try { new PolarityBasic(args).run(); } catch (Throwable t) { System.out.println("Thrown: " + t); t.printStackTrace(System.out); } } }
读取情感词典到程序中,并且根据情感词典得分分出正负性,见上一篇文章,但是做了一些修改:
public class TrainSentiment { //读取文件的流 public static void main(DynamicLMClassifier d) throws IOException{ try { String pathname = "文本绝对路径"; File file = new File(pathname); InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file),"utf-8"); BufferedReader br = new BufferedReader(inputStreamReader); String line = " "; Classification posClassification = new Classification("pos"); Classification negclassification = new Classification("neg"); while((line = br.readLine())!=null){ String[] str=line.split("\\s+"); Classified<CharSequence> classified =null; if (Double.valueOf(str[1])>0.0) { //System.out.println("pos"); classified = new Classified<CharSequence>(line,posClassification);//创建新的分类对象 }else { classified = new Classified<CharSequence>(line,negclassification);//创建新的分类对象 } d.handle(classified);//对以上分类信息做处理 System.out.println("["+str[0]+"="+str[1]+"]"); } //System.out.println(dnumber); br.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("Filepath is not found"); } }
经过测试以后能把那句话判别为neg,这只是粗暴的判断,因为导入情感词典并没有计算分数,而仅仅根据负号判别为pos和neg 如果再写出一个程序可以计算情感得分,那么对情感极性的判断肯定更加准确。但是我不会。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 }