[lingpipe學習筆記]基於LingPipe的文字傾向性分析
lingpipe是一個非常全面的自然語言處理工具包,它包含很多自然語言處理常用的功能,如命名實體識別,分詞,詞性標註,分類聚類等。下文主要講述的是將lingpipe用到文字傾向性分析。
文字傾向性分析
轉自:http://www.cnblogs.com/htynkn/archive/2012/06/17/lingpipe_1.html
文字傾向性分析(情感分析 )是將使用者的觀點分為“正面”和“負面”,有時候會多一個“中性”。文字傾向性分析一個比較直觀的應用就是追蹤使用者對於一個事物的觀點和偏好,比如分析豆瓣上一個電影的評論進行分析。正因為如此情感分析又被稱為觀點挖掘。
LingPipe
lingpipe 是alias公司開發的一款自然語言處理軟體包,包括主題分類、句題檢測、字元語言建模等十餘個模組。而且文件完整,甚至每一個演算法都有論文參考。更難能可貴的是它支援中文。
LingPipe分為兩個大塊,一塊是LingPipe核心檔案,另外一塊是LingPipe的模型類。需要支援中文的話需要下載Chinese Word Segmentation模組。
準備語料庫
語料庫在語言學上意指大量的文字,通常經過整理,具有既定格式與標記。
一般而言做情感分析有個很重要的步驟就是採集觀點並進行整理,但由於應用場景不同,處理方法也不同。為了方便起見,這裡使用已經處理好的語料庫。Movie Review Data的polarity dataset v2.0,包含1000個正面的觀點和1000個負面觀點。當然這個是英文的哈。
基本極性分析
基本極性是指事物從樣本來看所處的整體傾向,比如:一本書,使用者對其的情感傾向是正面的,這樣的斷言就是一個基本極性斷言。
基本極性的分析直接使用LingPipi的DynamicLMClassifier即可。
大致上來講分為兩步,第一步訓練,第二步進行分析。
新建一個類名為PolarityBasic。
public PolarityBasic(String basePath) { pDir =newFile(basePath,"txt_sentoken");//獲取語料集 categories = pDir.list();//獲取類別 intnGram =4; classifer = DynamicLMClassifier.createNGramProcess(categories, nGram);//新建動態分類器 }
我們先來看看如何訓練。
public void train() throwsIOException {
for(inti =0; i < categories.length; ++i) {
String category = categories[i];
Classification classification =newClassification(category);//新建類別
File dir =newFile(pDir, categories[i]);
File[] trainFiles = dir.listFiles();
for(intj =0; j < trainFiles.length; ++j) {
File trainFile = trainFiles[j];
if(isTrainingFile(trainFile)) {//判斷一下是為了讓一部分資料作為訓練集、一部分作為測試集
String review = Files.readFromFile(trainFile,"ISO-8859-1");
Classified classified =newClassified(
review, classification);//指定內容和類別
classifer.handle(classified);//訓練
}
}
}
}
這裡說明一下isTrainingFile方法。我們需要一份測試集和一個訓練集,但是我們只有一個語料庫,只有人為分割。我原本是每次隨機數一下來乾的,但是有點影響速度,這裡直接用檔名作為判斷依據了。
boolean isTrainingFile(File file) {
returnfile.getName().charAt(2) !='1';//如果第2位為1就是測試集
}
訓練完成後使用classifer就可以進行極性分析了。
public void evaluate() throwsIOException {
intnumTests =0;
intnumCorrect =0;
for(inti =0; i < categories.length; ++i) {
String category = categories[i];
File file =newFile(pDir, categories[i]);
File[] testFiles = file.listFiles();
for(intj =0; j < testFiles.length; ++j) {
File testFile = testFiles[j];
if(!isTrainingFile(testFile)) {
String review = Files.readFromFile(testFile,"ISO-8859-1");
++numTests;
Classification classification = classifer.classify(review);
String resultCategory = classification.bestCategory();
if(resultCategory.equals(category))
++numCorrect;
}
}
}
System.out.println("測試總數:"+ numTests);
System.out.println("正確數:"+ numCorrect);
System.out.println("正確率"+ ((double) numCorrect)
/ (double) numTests);
}
效果: 圖片分享:
將isTrainingFile修改一下
boolean isTrainingFile(File file) {
returnfile.getName().charAt(2) !='2';//如果第2位為2就是測試集
}
圖片分享:
就正確率而言怎麼劃分訓練集和測試集影響不大。
還可以這樣劃分
boolean isTrainingFile(File file) {
return(file.getName().charAt(2) !='2')&&(file.getName().charAt(2) !='1');
}
擴充套件
基本極性分析只是文字傾向性分析一個很簡單的部分,如果需要深入的話,LingPipe還可以實現主觀性分析、層次極性分析等。
如果需要支援中文的話,請下載words-zh-as.CompiledSpellChecker。
最後附上三篇參考文獻: