1. 程式人生 > >文字分類演算法之--貝葉斯分類演算法的實現Java版本

文字分類演算法之--貝葉斯分類演算法的實現Java版本

複製程式碼 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+"]");
    }
}
複製程式碼