贝叶斯算法(文本分类算法)java源码

上传人:奇*** 文档编号:207063264 上传时间:2023-05-05 格式:DOCX 页数:20 大小:25.39KB
返回 下载 相关 举报
贝叶斯算法(文本分类算法)java源码_第1页
第1页 / 共20页
贝叶斯算法(文本分类算法)java源码_第2页
第2页 / 共20页
贝叶斯算法(文本分类算法)java源码_第3页
第3页 / 共20页
点击查看更多>>
资源描述
packagecom.vista;importjava.io.IOException;importjeasy.analysis.MMAnalyzer;/*中文分词器*/publicclassChineseSpliter/*对给定的文本进行中文分词*paramtext给定的文本*paramsplitToken用于分割的标记,如|*return分词完毕的文本*/publicstaticStringsplit(Stringtext,StringsplitToken)Stringresult=null;MMAnalyzeranalyzer=newMMAnalyzer();tryresult=analyzer.segment(text,splitToken);catch(IOExceptione)e.printStackTrace();returnresult;停用词处理去掉文档中无意思的词语也是必须的一项工作,这里简单的定义了一些常见的停用词,并根据这些常用停用词在分词时进行判断。packagecom.vista;/*停用词处理器*authorphinecos*/publicclassStopWordsHandlerprivatestaticStringstopWordsList=的,我们,要,自己,之,将,“,”,,,(,),后,应,到,某,后,个,是,位,新,一,两,在,中,或,有,更,好,;/常用停用词publicstaticbooleanIsStopWord(Stringword)for(inti=0;istopWordsList.length;+i)if(word.equalsIgnoreCase(stopWordsListi)returntrue;returnfalse;训练集管理器我们的系统首先需要从训练样本集中得到假设的先验概率和给定假设下观察到不同数据的概率。packagecom.vista;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.Properties;importjava.util.logging.Level;importjava.util.logging.Logger;/*训练集管理器*/publicclassTrainingDataManagerprivateStringtraningFileClassifications;/训练语料分类集合privateFiletraningTextDir;/训练语料存放目录privatestaticStringdefaultPath=D:TrainningSet;publicTrainingDataManager()traningTextDir=newFile(defaultPath);if(!traningTextDir.isDirectory()thrownewIllegalArgumentException(训练语料库搜索失败!+defaultPath+);this.traningFileClassifications=traningTextDir.list();/*返回训练文本类别,这个类别就是目录名*return训练文本类别*/publicStringgetTraningClassifications()returnthis.traningFileClassifications;/*根据训练文本类别返回这个类别下的所有训练文本路径(fullpath)*paramclassification给定的分类*return给定分类下所有文件的路径(fullpath)*/publicStringgetFilesPath(Stringclassification)FileclassDir=newFile(traningTextDir.getPath()+File.separator+classification);Stringret=classDir.list();for(inti=0;iret.length;i+)reti=traningTextDir.getPath()+File.separator+classification+File.separator+reti;returnret;/*返回给定路径的文本文件内容*paramfilePath给定的文本文件路径*return文本内容*throwsjava.io.FileNotFoundException*throwsjava.io.IOException*/publicstaticStringgetText(StringfilePath)throwsFileNotFoundException,IOExceptionInputStreamReaderisReader=newInputStreamReader(newFileInputStream(filePath),GBK);BufferedReaderreader=newBufferedReader(isReader);Stringaline;StringBuildersb=newStringBuilder();while(aline=reader.readLine()!=null)sb.append(aline+);isReader.close();reader.close();returnsb.toString();/*返回训练文本集中所有的文本数目*return训练文本集中所有的文本数目*/publicintgetTrainingFileCount()intret=0;for(inti=0;itraningFileClassifications.length;i+)ret+=getTrainingFileCountOfClassification(traningFileClassificationsi);returnret;/*返回训练文本集中在给定分类下的训练文本数目*paramclassification给定的分类*return训练文本集中在给定分类下的训练文本数目*/publicintgetTrainingFileCountOfClassification(Stringclassification)FileclassDir=newFile(traningTextDir.getPath()+File.separator+classification);returnclassDir.list().length;/*返回给定分类中包含关键字词的训练文本的数目*paramclassification给定的分类*paramkey给定的关键字词*return给定分类中包含关键字词的训练文本的数目*/publicintgetCountContainKeyOfClassification(Stringclassification,Stringkey)intret=0;tryStringfilePath=getFilesPath(classification);for(intj=0;jfilePath.length;j+)Stringtext=getText(filePathj);if(text.contains(key)ret+;catch(FileNotFoundExceptionex)Logger.getLogger(TrainingDataManager.class.getName().log(Level.SEVERE,null,ex);catch(IOExceptionex)Logger.getLogger(TrainingDataManager.class.getName().log(Level.SEVERE,null,ex);returnret;先验概率先验概率是我们需要计算的两大概率值之一packagecom.vista;/*先验概率计算*先验概率计算*P(cj)=N(C=cj)/N*其中,N(C=cj)表示类别cj中的训练文本数量;*N表示训练文本集总数量。*/publicclassPriorProbabilityprivatestaticTrainingDataManagertdm=newTrainingDataManager();/*先验概率*paramc给定的分类*return给定条件下的先验概率*/publicstaticfloatcalculatePc(Stringc)floatret=0F;floatNc=tdm.getTrainingFileCountOfClassification(c);floatN=tdm.getTrainingFileCount();ret=Nc/N;returnret;分类条件概率这是另一个影响因子,和先验概率一起来决定最终结果packagecom.vista;/*类条件概率计算*类条件概率*P(xj|cj)=(N(X=xi,C=cj*)+1)/(N(C=cj)+M+V)*其中,N(X=xi,C=cj)表示类别cj中包含属性x*i的训练文本数量;N(C=cj)表示类别cj中的训练文本数量;M值用于避免*N(X=xi,C=cj)过小所引发的问题;V表示类别的总数。*条件概率*定义设A,B是两个事件,且P(A)0称*P(BA)=P(AB)/P(A)*为在条件A下发生的条件事件B发生的条件概率。*/publicclassClassConditionalProbabilityprivatestaticTrainingDataManagertdm=newTrainingDataManager();privatestaticfinalfloatM=0F;/*计算类条件概率*paramx给定的文本属性*paramc给定的分类*return给定条件下的类条件概率*/publicstaticfloatcalculatePxc(Stringx,Stringc)floatret=0F;floatNxc=tdm.getCountContainKeyOfClassification(c,x);floatNc=tdm.getTrainingFileCountOfClassification(c);floatV=tdm.getTraningClassifications().length;ret=(Nxc+1)/(Nc+M+V);/为了避免出现0这样极端情况,进行加权处理returnret;分类结果用来保存各个分类及其计算出的概率值,packagecom.vista;/*分类结果*/publicclassClassifyResultpublicdoubleprobility;/分类的概率publicStringclassification;/分类publicClassifyResult()this.probility=0;this.classification=null;朴素贝叶斯分类器利用样本数据集计算先验概率和各个文本向量属性在分类中的条件概率,从而计算出各个概率值,最后对各个概率值进行排序,选出最大的概率值,即为所属的分类。packagecom.vista;importcom.vista.ChineseSpliter;importcom.vista.ClassConditionalProbability;importcom.vista.PriorProbability;importcom.vista.TrainingDataManager;importcom.vista.StopWordsHandler;importjava.util.ArrayList;importjava.util.Comparator;importjava.util.List;importjava.util.Vector;/*朴素贝叶斯分类器*/publicclassBayesClassifierprivateTrainingDataManagertdm;/训练集管理器privateStringtrainnigDataPath;/训练集路径privatestaticdoublezoomFactor=10.0f;/*默认的构造器,初始化训练集*/publicBayesClassifier()tdm=newTrainingDataManager();/*计算给定的文本属性向量X在给定的分类Cj中的类条件概率*ClassConditionalProbability连乘值*paramX给定的文本属性向量*paramCj给定的类别*return分类条件概率连乘值,即*/floatcalcProd(StringX,StringCj)floatret=1.0F;/类条件概率连乘for(inti=0;iX.length;i+)StringXi=Xi;/因为结果过小,因此在连乘之前放大10倍,这对最终结果并无影响,因为我们只是比较概率大小而已ret*=ClassConditionalProbability.calculatePxc(Xi,Cj)*zoomFactor;/再乘以先验概率ret*=PriorProbability.calculatePc(Cj);returnret;/*去掉停用词*paramtext给定的文本*return去停用词后结果*/publicStringDropStopWords(StringoldWords)Vectorv1=newVector();for(inti=0;ioldWords.length;+i)if(StopWordsHandler.IsStopWord(oldWordsi)=false)/不是停用词v1.add(oldWordsi);StringnewWords=newStringv1.size();v1.toArray(newWords);returnnewWords;/*对给定的文本进行分类*paramtext给定的文本*return分类结果*/SuppressWarnings(unchecked)publicStringclassify(Stringtext)Stringterms=null;terms=ChineseSpliter.split(text,).split();/中文分词处理(分词后结果可能还包含有停用词)terms=DropStopWords(terms);/去掉停用词,以免影响分类StringClasses=tdm.getTraningClassifications();/分类floatprobility=0.0F;Listcrs=newArrayList();/分类结果for(inti=0;iClasses.length;i+)StringCi=Classesi;/第i个分类probility=calcProd(terms,Ci);/计算给定的文本属性向量terms在给定的分类Ci中的分类条件概率/保存分类结果ClassifyResultcr=newClassifyResult();cr.classification=Ci;/分类cr.probility=probility;/关键字在分类的条件概率System.out.println(Inprocess.);System.out.println(Ci+:+probility);crs.add(cr);/对最后概率结果进行排序java.util.Collections.sort(crs,newComparator()publicintcompare(finalObjecto1,finalObjecto2)finalClassifyResultm1=(ClassifyResult)o1;finalClassifyResultm2=(ClassifyResult)o2;finaldoubleret=m1.probility-m2.probility;if(ret0)return1;elsereturn-1;);/返回概率最大的分类returncrs.get(0).classification;publicstaticvoidmain(Stringargs)Stringtext=微软公司提出以446亿美元的价格收购雅虎中国网2月1日报道美联社消息,微软公司提出以446亿美元现金加股票的价格收购搜索网站雅虎公司。微软提出以每股31美元的价格收购雅虎。微软的收购报价较雅虎1月31日的收盘价19.18美元溢价62%。微软公司称雅虎公司的股东可以选择以现金或股票进行交易。微软和雅虎公司在2006年底和2007年初已在寻求双方合作。而近两年,雅虎一直处于困境:市场份额下滑、运营业绩不佳、股价大幅下跌。对于力图在互联网市场有所作为的微软来说,收购雅虎无疑是一条捷径,因为双方具有非常强的互补性。(小桥);BayesClassifierclassifier=newBayesClassifier();/构造Bayes分类器Stringresult=classifier.classify(text);/进行分类System.out.println(此项属于+result+);训练集与分类测试作为测试,这里选用Sogou实验室的文本分类数据,我只使用了mini版本。迷你版本有10个类别,共计100篇文章,总大小244KB使用的测试文本:微软公司提出以446亿美元的价格收购雅虎中国网2月1日报道美联社消息,微软公司提出以446亿美元现金加股票的价格收购搜索网站雅虎公司。微软提出以每股31美元的价格收购雅虎。微软的收购报价较雅虎1月31日的收盘价19.18美元溢价62%。微软公司称雅虎公司的股东可以选择以现金或股票进行交易。微软和雅虎公司在2006年底和2007年初已在寻求双方合作。而近两年,雅虎一直处于困境:市场份额下滑、运营业绩不佳、股价大幅下跌。对于力图在互联网市场有所作为的微软来说,收购雅虎无疑是一条捷径,因为双方具有非常强的互补性。(小桥)使用mini版本的测试结果:Inprocess.IT:2.8119528E-5Inprocess.体育:2.791735E-21Inprocess.健康:3.3188528E-12Inprocess.军事:2.532662E-19Inprocess.招聘:2.3753596E-17Inprocess.教育:4.2023427E-19Inprocess.文化:6.0595915E-23Inprocess.旅游:5.1286412E-17Inprocess.汽车:4.085446E-8Inprocess.财经:3.7337095E-10此项属于IT
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 其他分类 > 大学论文


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!