文字分類演算法之--貝葉斯分類演算法的實現Java版本
阿新 • • 發佈:2019-01-09
package com.vista;
import com.vista.ChineseSpliter;
import com.vista.ClassConditionalProbability;
import com.vista.PriorProbability;
import com.vista.TrainingDataManager;
import com.vista.StopWordsHandler;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Vector;
/**
* 樸素貝葉斯分類器
*/publicclass BayesClassifier
{
private TrainingDataManager tdm;//訓練集管理器private String trainnigDataPath;//訓練集路徑privatestaticdouble zoomFactor =10.0f;
/**
* 預設的構造器,初始化訓練集
*/public BayesClassifier()
{
tdm =new TrainingDataManager();
}
/**
* 計算給定的文字屬性向量X在給定的分類Cj中的類條件概率
* <code>ClassConditionalProbability</code>連乘值
* @param X 給定的文字屬性向量
* @param Cj 給定的類別
* @return 分類條件概率連乘值,即<br>
*/float calcProd(String[] X, String Cj)
{
float ret =1.0F;
// 類條件概率連乘for (int i =0; i <X.length; i++)
{
String Xi = X[i];
//因為結果過小,因此在連乘之前放大10倍,這對最終結果並無影響,因為我們只是比較概率大小而已 ret *=ClassConditionalProbability.calculatePxc(Xi, Cj)*zoomFactor;
}
// 再乘以先驗概率 ret *= PriorProbability.calculatePc(Cj);
return ret;
}
/**
* 去掉停用詞
* @param text 給定的文字
* @return 去停用詞後結果
*/public String[] DropStopWords(String[] oldWords)
{
Vector<String> v1 =new Vector<String>();
for(int i=0;i<oldWords.length;++i)
{
if(StopWordsHandler.IsStopWord(oldWords[i])==false)
{//不是停用詞 v1.add(oldWords[i]);
}
}
String[] newWords =new String[v1.size()];
v1.toArray(newWords);
return newWords;
}
/**
* 對給定的文字進行分類
* @param text 給定的文字
* @return 分類結果
*/
@SuppressWarnings("unchecked")
public String classify(String text)
{
String[] terms =null;
terms= ChineseSpliter.split(text, "").split("");//中文分詞處理(分詞後結果可能還包含有停用詞) terms = DropStopWords(terms);//去掉停用詞,以免影響分類
String[] Classes = tdm.getTraningClassifications();//分類float probility =0.0F;
List<ClassifyResult> crs =new ArrayList<ClassifyResult>();//分類結果for (int i =0; i <Classes.length; i++)
{
String Ci = Classes[i];//第i個分類 probility = calcProd(terms, Ci);//計算給定的文字屬性向量terms在給定的分類Ci中的分類條件概率
//儲存分類結果 ClassifyResult cr =new ClassifyResult();
cr.classification = Ci;//分類 cr.probility = probility;//關鍵字在分類的條件概率 System.out.println("In process.");
System.out.println(Ci +":"+ probility);
crs.add(cr);
}
//對最後概率結果進行排序 java.util.Collections.sort(crs,new Comparator()
{
publicint compare(final Object o1,final Object o2)
{
final ClassifyResult m1 = (ClassifyResult) o1;
final ClassifyResult m2 = (ClassifyResult) o2;
finaldouble ret = m1.probility - m2.probility;
if (ret <0)
{
return1;
}
else
{
return-1;
}
}
});
//返回概率最大的分類return crs.get(0).classification;
}
publicstaticvoid main(String[] args)
{
String text ="微軟公司提出以446億美元的價格收購雅虎中國網2月1日報道 美聯社訊息,微軟公司提出以446億美元現金加股票的價格收購搜尋網站雅虎公司。微軟提出以每股31美元的價格收購雅虎。微軟的收購報價較雅虎1月31日的收盤價19.18美元溢價62%。微軟公司稱雅虎公司的股東可以選擇以現金或股票進行交易。微軟和雅虎公司在2006年底和2007年初已在尋求雙方合作。而近兩年,雅虎一直處於困境:市場份額下滑、運營業績不佳、股價大幅下跌。對於力圖在網際網路市場有所作為的微軟來說,收購雅虎無疑是一條捷徑,因為雙方具有非常強的互補性。(小橋)";
BayesClassifier classifier =new BayesClassifier();//構造Bayes分類器 String result = classifier.classify(text);//進行分類 System.out.println("此項屬於["+result+"]");
}
}
import com.vista.ChineseSpliter;
import com.vista.ClassConditionalProbability;
import com.vista.PriorProbability;
import com.vista.TrainingDataManager;
import com.vista.StopWordsHandler;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Vector;
* 樸素貝葉斯分類器
*/publicclass BayesClassifier
{
private TrainingDataManager tdm;//訓練集管理器private String trainnigDataPath;//訓練集路徑privatestaticdouble zoomFactor =10.0f;
/**
* 預設的構造器,初始化訓練集
*/public BayesClassifier()
{
tdm =new TrainingDataManager();
}
/**
* 計算給定的文字屬性向量X在給定的分類Cj中的類條件概率
* <code>ClassConditionalProbability</code>連乘值
*
* @param Cj 給定的類別
* @return 分類條件概率連乘值,即<br>
*/float calcProd(String[] X, String Cj)
{
float ret =1.0F;
// 類條件概率連乘for (int i =0; i <X.length; i++)
{
String Xi = X[i];
//因為結果過小,因此在連乘之前放大10倍,這對最終結果並無影響,因為我們只是比較概率大小而已 ret
}
// 再乘以先驗概率 ret *= PriorProbability.calculatePc(Cj);
return ret;
}
/**
* 去掉停用詞
* @param text 給定的文字
* @return 去停用詞後結果
*/public String[] DropStopWords(String[] oldWords)
{
Vector<String> v1 =new Vector<String>();
for(int i=0;i<oldWords.length;++i)
{
if(StopWordsHandler.IsStopWord(oldWords[i])==false)
{//不是停用詞 v1.add(oldWords[i]);
}
}
String[] newWords =new String[v1.size()];
v1.toArray(newWords);
return newWords;
}
/**
* 對給定的文字進行分類
* @param text 給定的文字
* @return 分類結果
*/
@SuppressWarnings("unchecked")
public String classify(String text)
{
String[] terms =null;
terms= ChineseSpliter.split(text, "").split("");//中文分詞處理(分詞後結果可能還包含有停用詞) terms = DropStopWords(terms);//去掉停用詞,以免影響分類
String[] Classes = tdm.getTraningClassifications();//分類float probility =0.0F;
List<ClassifyResult> crs =new ArrayList<ClassifyResult>();//分類結果for (int i =0; i <Classes.length; i++)
{
String Ci = Classes[i];//第i個分類 probility = calcProd(terms, Ci);//計算給定的文字屬性向量terms在給定的分類Ci中的分類條件概率
//儲存分類結果 ClassifyResult cr =new ClassifyResult();
cr.classification = Ci;//分類 cr.probility = probility;//關鍵字在分類的條件概率 System.out.println("In process.");
System.out.println(Ci +":"+ probility);
crs.add(cr);
}
//對最後概率結果進行排序 java.util.Collections.sort(crs,new Comparator()
{
publicint compare(final Object o1,final Object o2)
{
final ClassifyResult m1 = (ClassifyResult) o1;
final ClassifyResult m2 = (ClassifyResult) o2;
finaldouble ret = m1.probility - m2.probility;
if (ret <0)
{
return1;
}
else
{
return-1;
}
}
});
//返回概率最大的分類return crs.get(0).classification;
}
publicstaticvoid main(String[] args)
{
String text ="微軟公司提出以446億美元的價格收購雅虎中國網2月1日報道 美聯社訊息,微軟公司提出以446億美元現金加股票的價格收購搜尋網站雅虎公司。微軟提出以每股31美元的價格收購雅虎。微軟的收購報價較雅虎1月31日的收盤價19.18美元溢價62%。微軟公司稱雅虎公司的股東可以選擇以現金或股票進行交易。微軟和雅虎公司在2006年底和2007年初已在尋求雙方合作。而近兩年,雅虎一直處於困境:市場份額下滑、運營業績不佳、股價大幅下跌。對於力圖在網際網路市場有所作為的微軟來說,收購雅虎無疑是一條捷徑,因為雙方具有非常強的互補性。(小橋)";
BayesClassifier classifier =new BayesClassifier();//構造Bayes分類器 String result = classifier.classify(text);//進行分類 System.out.println("此項屬於["+result+"]");
}
}