版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
人工智能實(shí)驗(yàn)報告姓名:學(xué)號:所學(xué)專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)報告題目:基于樸素貝葉斯的文本分類器提交日期:基于樸素貝葉斯的文本分類器問題描述樸素貝葉斯學(xué)習(xí)器是貝葉斯學(xué)習(xí)方法中實(shí)用性很高的一種方法,通常被稱作是貝葉斯分類器。在某些領(lǐng)域內(nèi),其性能可與神經(jīng)網(wǎng)絡(luò)和決策樹學(xué)習(xí)相當(dāng)。本文主要介紹樸素貝葉斯在文本分類領(lǐng)域的應(yīng)用。本次試驗(yàn)實(shí)現(xiàn)了一個文本分類器,并且通過實(shí)驗(yàn)驗(yàn)證分類結(jié)果比較客觀。1.1待解決問題的解釋隨著互聯(lián)網(wǎng)信息及電子資源的急劇膨脹,文本分類技術(shù)成為信息組織與管理的有效手段。本文意在實(shí)現(xiàn)一個基于樸素貝葉斯的文本分類器。在應(yīng)用樸素貝葉斯進(jìn)行文本分類時有兩個主要的設(shè)計(jì)問題:首先,要決定怎樣將任意文檔表示為屬性值的形式,其次要決定如何估計(jì)樸素貝葉斯分類器所需的概率。對于第一個問題,可這樣設(shè)計(jì)。給定一篇文本文檔,可對每個詞的位置定義一個屬性,該屬性的值為在此位置上找到的詞。如果文檔被這樣表示,就可以使用樸素貝葉斯的想法進(jìn)行概率估計(jì)了。對于第二個問題,顯而易見可直接利用下面的公式:V=argmaxP(v)nP(aIv)nbjijv^{category,...category.}jijdocs其中P(vj)表示這種類別出現(xiàn)的概率,P(v)二j,docSi為v類別出jjExamplesjj現(xiàn)的文檔數(shù),ExampleS是訓(xùn)練集中全部文檔數(shù)。而P(aIv)二匕,其中nk為ai這個單詞在vj這個類別出現(xiàn)的次ijn+VocabularyJ數(shù),n是v.這個類別包含的單詞總數(shù),Vocabulary是訓(xùn)練集中詞典的詞數(shù)。1.2學(xué)習(xí)方法介紹貝葉斯分類是統(tǒng)計(jì)學(xué)分類方法,它是一類利用概率統(tǒng)計(jì)知識進(jìn)行分類的算法。在許多場合,樸素貝葉斯(NaiveBayes,NB)分類算法可以與決策樹和神經(jīng)網(wǎng)絡(luò)分類算法相媲美,該算法能運(yùn)用到大型數(shù)據(jù)庫中,且方法簡單、分類準(zhǔn)確率高、速度快。由于貝葉斯定理假設(shè)一個屬性值對給定類的影響?yīng)毩⒂谄渌鼘傩缘闹?,而此假設(shè)在實(shí)際情況中經(jīng)常是不成立的,因此其分類準(zhǔn)確率可能會下降。為此,就出現(xiàn)了許多降低獨(dú)立性假設(shè)的貝葉斯分類算法,如TAN(treeaugmentedBayesnetwork)算法。樸素貝葉斯算法:設(shè)每個數(shù)據(jù)樣本用一個n維特征向量來描述n個屬性的值,即:X={xl,x2,…,xn},假定有m個類,分別用Cl,C2,...,Cm表示。給定一個未知的數(shù)據(jù)樣本X(即沒有類標(biāo)號),若樸素貝葉斯分類法將未知的樣本X分配給類Ci,則一定是P(Ci|X)>P(Cj|X)1<j<m,j#i根據(jù)貝葉斯定理P(AIB)=*由于P(X)對于所有類為常數(shù),最大化后驗(yàn)概率P(CiIX)可轉(zhuǎn)化為最大化先驗(yàn)概率P(XICi)P(Ci)。如果訓(xùn)練數(shù)據(jù)集有許多屬性和元組,計(jì)算P(XICi)的開銷可能非常大,為此,通常假設(shè)各屬性的取值互相獨(dú)立,這樣先驗(yàn)概率P(xlICi),P(x2ICi),…,P(xnICi)可以從訓(xùn)練數(shù)據(jù)集求得。根據(jù)此方法,對一個未知類別的樣本X,可以先分別計(jì)算出X屬于每一個類別Ci的概率P(XICi)P(Ci),然后選擇其中概率最大的類別作為其類別。樸素貝葉斯算法成立的前提是各屬性之間互相獨(dú)立。當(dāng)數(shù)據(jù)集滿足這種獨(dú)立性假設(shè)時,分類的準(zhǔn)確度較高,否則可能較低。另外,該算法沒有分類規(guī)則輸出。算法的偽代碼及流程LEARN_NAIVE_BAYES_TEXT(Examples,V)Examples為一組文本文檔以及他們的目標(biāo)值。V為所有可能目標(biāo)值的集合。此函數(shù)作用是學(xué)習(xí)概率項(xiàng)P(aIv),他描述了從類別乂中的文檔總隨機(jī)抽取的一ijj個單詞為單詞wk的概率。該函數(shù)也學(xué)習(xí)類別的先驗(yàn)概率Pg)。l收集Examples中所有的單詞Vocabulary在Examples中任意文本文檔中出現(xiàn)的所有詞匯的集合2計(jì)算所需要的概率項(xiàng)P(wIv)和P(vj)ijj對V中每個目標(biāo)值vjdocs.^Examples中目標(biāo)值為v的文檔子集jjdocsP(v)二j—jExamplesText.-將docs.中所有成員鏈接起來建立的單個文檔n~在Text中不同單詞位置的總數(shù)對Vocabulary中每個單詞wkn?單詞w出現(xiàn)在Text中的次數(shù)kkj…I、1+nP(WIV)=kijn+VocabularyCLASSIFY_NAIVE_BAYES_TEXT(Doc)對文檔Doc返回其估計(jì)的目標(biāo)值。A:代表在doc中的第i個位置上出現(xiàn)的單詞。返回vNBV=argmaxP(v)nP(aIv)nbjijv^{category,...category.}jij算法實(shí)現(xiàn)3.1實(shí)驗(yàn)環(huán)境與問題規(guī)模實(shí)驗(yàn)環(huán)境為WindowsXP操作系統(tǒng),內(nèi)存2G,IntelCore2(TM)DuoCPU。問題規(guī)模比較大,尤其在訓(xùn)練語料是占用內(nèi)存較大,速度比較慢。另外,在訓(xùn)練時,由于文檔較多,I/O操作也耗時較多。3.2數(shù)據(jù)結(jié)構(gòu)HashMapvString,WordItem>,存儲單詞到Worditem的映射,Key是單詞,Value是WordItem。classWordItem{〃單詞的統(tǒng)計(jì)信息包括單詞的個數(shù)和詞頻doublecount;//單詞的個數(shù)doublefrequency;//詞頻,它需要在得出vocabulary的大小之后才能計(jì)算}VectorvLabel>,存儲類別標(biāo)簽的集合,其中Label定義為:classLabel”/類別標(biāo)簽:體育、經(jīng)濟(jì)、政治等等〃m中用來存放每個單詞及其統(tǒng)計(jì)信息Map<String,WordItem>m=newHashMap<String,WordItem>();doublewordCount;//某個類別標(biāo)簽下的所有單詞個數(shù)doubledocumentCount;//某個類別標(biāo)簽下的所有文檔個數(shù)}3.3實(shí)驗(yàn)結(jié)果本實(shí)驗(yàn)選擇選用的語料是財經(jīng)、體育、科技三個類比進(jìn)行訓(xùn)練。其中財經(jīng)類別818篇文檔,體育類別929篇文檔,科技類別1045篇文檔。為了測試樸素貝葉斯分類器的準(zhǔn)確率,我每個類別中隨機(jī)抽出20篇文檔作為測試。于是,訓(xùn)練集和測試集如下表所示:訓(xùn)練集測試集Finace798篇20篇Sport909篇20篇Technology1025篇20篇己過實(shí)驗(yàn)驗(yàn)證,樸素貝葉斯分類器的精確率如下:
Finance:精確率100%Sport:精確率100%Technology:精確率100%3.4系統(tǒng)中間及最終輸出結(jié)果1.系統(tǒng)初始界面:2.選擇待訓(xùn)練的文件夾,并完成訓(xùn)練:3.選擇待測試的目標(biāo)文件,并完成測試分類:參考文獻(xiàn)《人工智能一一種現(xiàn)代方法》《機(jī)器學(xué)習(xí)》《Java項(xiàng)目開發(fā)實(shí)踐》《JavaSE6.0編程指南》StuartRussell,PeterNorvig著TomMitchell著陸正武,張志立編著吳亞峰,紀(jì)超編著《SwingHacks:100個業(yè)界最尖端的技巧和工具》JoshuaMarinacci,ChrisAdamson著《Java綜合實(shí)例經(jīng)典》吳其慶編著附錄一源代碼及其注釋packageMyTextClassify;importjava.io.File;importjava.io.FilelnputStream;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.StringReader;importjava.util.HashMap;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Map;importjava.util.Set;importjava.util.Vector;importjeasy.analysis.MMAnalyzer;importorg.apache.lucene.analysis.Analyzer;importorg.apache.lucene.analysis.Token;importorg.apache.lucene.analysis.TokenStream;publicclassBeyesClassification{privateStringlabel=null;privatelongtrainTime=0;publicString[]labelsName=null;publicVector<Label>labels=null;publicSet<String>vocabulary=newHashSet<String>();publicStringtrainPath=null;publicStringtestPath=null;publicintfindMax(double[]values){doublemax=values[0];intmark=0;for(inti=0;i<values.length;i++){if(values[i]>max){max=values[i];mark=i;}}returnmark;}publicString[]sort(String[]pData,intleft,intright){Stringmiddle,strTemp;inti=left;intj=right;middle=pData[(left+right)/2];do{while((pData[i].compareTo(middle)<0)&&(i<right))i++;while((pData[j].compareTo(middle)>0)&&(j>left))j--;if(i<=j){strTemp=pData[i];pData[i]=pData[j];pData[j]=strTemp;i++;j--;}}while(ivj);〃如果兩邊掃描的下標(biāo)交錯,完成一次排序if(left<j)sort(pData,left,j);//遞歸調(diào)用if(right>i)sort(pData,i,right);//遞歸調(diào)用returnpData;Vector<String>readFile(StringfileName)throwsIOException,FileNotFoundException{Filef=newFile(fileName);InputStreamReaderisr=newInputStreamReader(newFileInputStream(f),"GBK");char[]cbuf=newchar[(int)f.length()];isr.read(cbuf);Analyzeranalyzer=newMMAnalyzer();TokenStreamtokens=analyzer.tokenStream("Contents",newStringReader(newString(cbuf)));Tokentoken=null;Vector<String>v=newVector<String>();while((token=tokens.next(newToken()))!=null){v.add(token.term());}returnv;}publicvoidsetTrainPath(StringfolderPat){trainPath=folderPat;}publicvoidsetTestPath(StringtestPat){testPath=testPat;}publicvoidtrain(){longstartTime=System.currentTimeMillis();Filefolder=newFile(trainPath);labelsName=folder.list();labels=newVector<Label>();for(inti=0;i<labelsName.length;i++){labels.add(newLabel());FilesubFolder=newFile(trainPath+"\\"+labelsName[i]);String[]files=subFolder.list();System.out.println("Processing:"+labelsName[i]);GUI.setTextArea("Processing:"+labelsName[i]);Vector<String>v=newVector<String>();for(intj=0;j<files.length;j++){try{v.addAll(readFile(trainPath+"\\"+labelsName[i]+"\\"+files[j]));}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}//把當(dāng)前類別標(biāo)簽下的所有文檔的所有單詞都放入Set集合中,//目的是為了獲得vocabulary的大小vocabulary.addAll(v);//對當(dāng)前類別標(biāo)簽下的所有文檔的所有單詞進(jìn)行排序,//目的是為了方便接下來統(tǒng)計(jì)各個單詞的信息String[]allWords=newString[v.size()];for(intj=0;j<v.size();j++)allWords[j]=v.elementAt(j);sort(allWords,0,v.size()-1);//統(tǒng)計(jì)各個單詞的信息Stringprevious=allWords[0];doublecount=1;Map<String,WordItem>m=newHashMap<String,WordItem>();for(intj=1;j<allWords.length;j++){if(allWords[j].equals(previous))count++;else{m.put(previous,newWordItem(count));previous=allWords[j];count=1;}}labels.elementAt(i).set(m,v.size(),files.length);longendTime=System.currentTimeMillis();trainTime=endTime-startTime;}//獲得了vocabulary的大小后,下面才開始計(jì)算詞頻for(inti=0;i<labels.size();i++){Iteratoriter=labels.elementAt(i).m.entrySet().iterator();while(iter.hasNext()){Map.Entry<String,WordItem>entry=(Map.Entry<String,WordItem>)iter.next();WordItemitem=entry.getValue();item.setFrequency(Math.log10((item.count+1)/(labels.elementAt(i).wordCount+vocabulary.size())));}}}publicvoidtest(){Vector<String>v=null;try{v=readFile(testPath);}catch(FileNotFoundExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}doublevalues[]=newdouble[labelsName.length];for(inti=0;i<labels.size();i++){doubletempValue=labels.elementAt(i).documentCount;for(intj=0;j<v.size();j++){if(labels.elementAt(i).m.containsKey(v.elementAt(j))){tempValue+=labels.elementAt(i).m.get(v.elementAt(j)).frequency;}else{tempValue+=Math.log10(1/(double)(labels.elementAt(i).wordCount+vocabulary.size()));}}values[i]=tempValue;}//for(inti=0;i<values.length;i++)〃所有的概率均取以10為底的log值〃System.out.println(labelsName[i]+"的概率為"+values[i]);intmaxIndex=findMax(values);System.out.println(testPath+"belongsto"+labelsName[maxIndex]);GUI.setTextArea(testPath+"belongsto"+labelsName[maxIndex]);label=labelsName[maxIndex];}publicStringgetLabelName(){returnlabel;}publiclonggetTrainingTime(){returntrainTime;}}classLabel”/類別標(biāo)簽:體育、經(jīng)濟(jì)、政治等等//m中用來存放每個單詞及其統(tǒng)計(jì)信息Map<String,WordItem>m=newHashMap<String,WordItem>();doublewordCount;//某個類別標(biāo)簽下的所有單詞個數(shù)doubledocumentCount;//某個類別標(biāo)簽下的所有文檔個數(shù)publicLabel(){this.m=null;this.wordCount=-1;this.documentCount=-1;publicvoidset(Map<String,WordItem>m,doublewordCount,doubledocumentCount){this.m=m;this.wordCount=wordCount;this.documentCount=documentCount;}}classWordltem{〃單詞的統(tǒng)計(jì)信息包括單詞的個數(shù)和詞頻doublecount;//單詞的個數(shù)doublefrequency;//詞頻,它需要在得出vocabulary的大小之后才能計(jì)算publicWordItem(doublecount){this.count=count;this.frequency=-1;}publicvoidsetFrequency(doublefrequency){this.frequency=frequency;}}packageMyTextClassify;importjava.awt.Dimension;importjava.awt.FileDialog;importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;importjavax.swing.JFileChooser;importjavax.swing.JFrame;importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.JTextArea;importjavax.swing.UIManager;publicclassGUIextendsJFrameimplementsRunnable{/***主程序界面部分*/privatestaticfinallongserialVersionUID=1L;privatestaticBeyesClassificationbayes=newBeyesClassification();privatestaticJTextAreatextArea;privatestaticfinalintDEFAULT_WIDTH=564;privatestaticfinalintDEFAULT_HEIGHT=471;privatebooleanflagTrain=false;privatebooleanflagTest=false;privatestaticJPanelpanel=null;publicGUI(){super();getContentPane().setLayout(null);setSize(newDimension(DEFAULT_WIDTH,DEFAULT_HEIGHT));finalJButtonbutton1=newJButton();button1.addActionListener(newActionListener(){publicvoidactionPerformed(finalActionEvente){JFileChooserchooser=newJFileChooser();chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);intn=chooser.showOpenDialog(getContentPane());if(n==JFileChooser.APPROVE_OPTION){bayes.setTrainPath(chooser.getSelectedFile().getPath());flagTrain=true;}}});button1.setText("TRAIN");button1.setBounds(93,64,106,28);getContentPane().add(button1);finalJButtonbutton2=newJButton();button2.addActionListener(newActionListener(){publicvoidactionPerformed(finalActionEvente){finalJFramef=newJFrame();FileDialogfd=newFileDialog(f,"打開文件對話框",FileDialog.LOAD);fd.setVisible(true);Stringstr=fd.getDirectory()+fd.getFile();
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《奶制品培訓(xùn)資料》課件
- 《小王子英文》課件
- 《企業(yè)管理概論》課件
- 2024年雷電頌教案
- 尖子生家長會發(fā)言稿
- 單位管理制度匯編大合集【人員管理篇】十篇
- 單位管理制度合并匯編職工管理
- 單位管理制度分享大全【職員管理篇】
- 單位管理制度范文大合集人力資源管理十篇
- 單位管理制度范例合集【職工管理】十篇
- 保育員(高級)考試題庫附答案(600題)
- 中國鋁業(yè)股份有限公司河南分公司鞏義市山川鋁土礦礦山地質(zhì)環(huán)境保護(hù)與土地復(fù)墾方案
- 工商企業(yè)管理畢業(yè)論文范文六篇
- 二十五項(xiàng)反措檢查表優(yōu)質(zhì)資料
- 保密辦主任工作總結(jié)保密辦主任工作總結(jié)八篇
- 新生兒沐浴及撫觸護(hù)理
- 機(jī)械原理課程設(shè)計(jì)-壓床機(jī)構(gòu)的設(shè)計(jì)
- 教學(xué)案例 英語教學(xué)案例 市賽一等獎
- 四川省2023職教高考英語試題
- JJG 913-2015浮標(biāo)式氧氣吸入器
- GB/T 12190-2006電磁屏蔽室屏蔽效能的測量方法
評論
0/150
提交評論