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;
/**
* 朴素贝叶斯分类器
*/
public class BayesClassifier
{
private TrainingDataManager tdm;//训练集管理器
private String trainnigDataPath;//训练集路径
private static double zoomFactor = 10.0f;
/**
* 默认的构造器,初始化训练集
*/
public BayesClassifier()
{
System.out.println("构造贝叶斯分类器------------------------------------------------------------");
tdm =new TrainingDataManager();
}
/**
* 计算给定的文本属性向量X在给定的分类Cj中的类条件概率
* <code>ClassConditionalProbability</code>连乘值
* @param X 给定的文本属性向量
* @param Cj 给定的类别
* @return 分类条件概率连乘值,即<br>
*/
float calcProd(String[] X, String Cj)
{
//System.out.println("calcProd开始计算给定的文本属性向量X在给定的分类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)
{
//System.out.println("DropStopWords开始去掉停用词-------------------------------------");
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)
{
//System.out.println("classify开始对给定的文本进行分类-------------------------------------");
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....");
String cl="";
if(Ci.equals("C000007")){cl="汽车";}
else if(Ci.equals("C000008")){cl="财经";}
else if(Ci.equals("C000010")){cl="IT";}
else if(Ci.equals("C000013")){cl="健康";}
else if(Ci.equals("C000014")){cl="体育";}
else if(Ci.equals("C000016")){cl="旅游";}
else if(Ci.equals("C000020")){cl="教育";}
else if(Ci.equals("C000022")){cl="招聘";}
else if(Ci.equals("C000023")){cl="文化";}
else{cl="军事";}
System.out.println(cl+"["+Ci + "]"+":" + probility);
crs.add(cr);
}
//对最后概率结果进行排序
java.util.Collections.sort(crs,new Comparator()
{
public int compare(final Object o1,final Object o2)
{
final ClassifyResult m1 = (ClassifyResult) o1;
final ClassifyResult m2 = (ClassifyResult) o2;
final double ret = m1.probility - m2.probility;
if (ret < 0)
{
return 1;
}
else
{
return -1;
}
}
});
//返回概率最大的分类
return crs.get(0).classification;
}
public static void main(String[] args)
{
String text = "市电教馆陈平馆长做了开班讲话。他首先与大家一起回顾了南京市智慧校园建设的背景,他表示这次培训的目的是为了拓宽视野、增进交流,增强大家的紧迫感,更好地进行智慧校园的规划和设计工作。第一,他认为智慧校园建设重在教育应用,而不是重装备建设。建设的终极目标是为应用服务的,是为提升教师和学生的信息素养,提高学校的办学效益而服务的。他希望每一所学校,更多地在谋划如何充分利用现有的条件,开展技术与教育教学、与教学管理相融合的研究和实践。无论是省里的标准,还是市里的标准,都是侧重应用,侧重在全面提升信息化应用水平,提升教师发展、学生发展和学校发展的这个层面上。希望每个试点学校都能充分理解,智慧校园建设的终极目标是为人的发展提供服务的。第二,这次培训共有5天,前3天是大家共同交流,分享建设的经验和成果,是一次思维的碰撞,希望通过这样的碰撞,能激发我们的建设与应用的大智慧。每一个校长和主任都要汲取其他学校教育信息化应用和智慧校园创建中的一些思想火花,回到学校以后开展切实可行的研究与实践。后2天将组织大家到外地参观考察,希望在学习其他地";
//System.out.println("构造贝叶斯分类器开始------------------------------------------------------------");
BayesClassifier classifier = new BayesClassifier();//构造Bayes分类器
String result = classifier.classify(text);//进行分类
System.out.println("此项属于["+result+"]");
}
}