lingpipe情感分析模块思路整理(菜鸟先飞)

    xiaoxiao2022-06-29  37

    (刚开始接触,测试了一些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 如果再写出一个程序可以计算情感得分,那么对情感极性的判断肯定更加准确。但是我不会。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 }

    转载请注明原文地址: https://ju.6miu.com/read-1125181.html

    最新回复(0)