1.格式轉(zhuǎn)換
原始數(shù)據(jù)集是只讀的xml格式文件(news_sohusite_xml.dat)。首先是編碼問題,需要將文件轉(zhuǎn)換為UTF-8編碼;然后是標簽問題,原始XML格式文件缺少根標簽,需要自行添加。本次格式轉(zhuǎn)換部分用java語言實現(xiàn),逐行讀取內(nèi)容,然后寫入目標文件,并在目標文件的首尾加上自定義的根標簽,最終得到格式轉(zhuǎn)換后的文件news_sohusite_xml.txt。格式轉(zhuǎn)換代碼如GBK2UTF8.java,實現(xiàn)了GBK向UTF-8格式的轉(zhuǎn)換

2.XML解析
搜狐新聞文件的格式為XML文件,需要對XML文件進行解析,格式如下:    本次需要解析出url地址,用于判斷新聞對應(yīng)的類別;需要解析出docno,作為存儲文件的名稱,需要解析出content,作文單個文本的內(nèi)容。
   本次需要解析出url地址,用于判斷新聞對應(yīng)的類別;需要解析出docno,作為存儲文件的名稱,需要解析出content,作文單個文本的內(nèi)容。
XML解析的三種方案
正則表達式:正則表達式可以解析任意格式的文本,但正則表達式適用于對滿足指定條件的文件內(nèi)容進行查找或搜索,而本次需要將url、docno、content同時解析出,正則表達式不擅長這種結(jié)構(gòu)化文本的解析;
BeautifulSoup:一個python的XML解析庫,beautifulsoup的容錯能力優(yōu)于正則表達式,但beautifulsoup需要一次性讀取全部文件才能夠解析出數(shù)據(jù),這種機制使得它的解析速度較慢,而且不能處理大文件;本次的原始文件比較大,beautifulsoup無法使用;
SAX:一個基于事件的XML解析庫,java、python均內(nèi)置這種庫。由于SAX基于事件,可以邊讀取邊解析,不需要一次性讀取全部文件,所以該方法能很好地支持大文件解析。本次選用該方法。
SAX解析XML文件的代碼在saxparser包中,解析完畢后,輸出文件在dataout路徑下:   
3.數(shù)據(jù)集的挑選
本次按服務(wù)器主機名分類,類別比較多;同時,大部分類別中的文檔數(shù)目太少,樣本容量不足。所以,本次決定初步篩選出文檔數(shù)目排名前50的類別。
4.數(shù)據(jù)集的精選
為了使數(shù)據(jù)集的類別區(qū)分度明顯,本次從排名前50的數(shù)據(jù)集中選出有代表性的8個類別;為了使樣本類別均衡,每個類別中挑出1000個文檔;將每個類別的文檔分為兩份——600和400,分別用于訓練和測試。這樣,就得到了8*600的訓練集和8*400的測試集。
轉(zhuǎn)碼處理在python平臺分別對訓練集traindata和測試集testdata進行轉(zhuǎn)碼,從GBK轉(zhuǎn)為UTF-8編碼,得到轉(zhuǎn)碼后的訓練集train_raw和測試集test_raw。實現(xiàn)轉(zhuǎn)碼的代碼文件為CodeChange.py 注意:轉(zhuǎn)碼過程中要decode()函數(shù)要加上”ignore”選項,忽略非GBK字符   page = page.decode("GBK",'ignore').encode('utf-8')   分詞處理本次分詞采用python平臺的jieba分詞工具,將訓練集train_raw內(nèi)容分詞,分詞后的文檔存儲在train_seg目錄下;用同樣的方法對測試集test_raw進行分詞,保存在test_seg路徑下。實現(xiàn)分詞的代碼文件為WordSeg.py   注意:讀取文本時需要將換行符替換掉,并將空白字符替換掉;切分文本時,應(yīng)該使cut_all選項為False,不采用全切分模式。構(gòu)建文本的Bunch對象將分詞完畢的文本train_seg/train_seg生成Bunch對象,Bunch對象中將每個文檔的filelabel、filepath、content按對應(yīng)次序保存起來,并保存所有類別targetlabels。訓練集train_seg生成的Bunch對象序列化到磁盤文件train_seg_bunch.dat;用同樣的方法將測試集test_seg生成Bunch對象,并序列化到磁盤文件test_seg_bunch.dat。該部分的實現(xiàn)代碼為Seg2Bunch.py。  注意:在整合bunch_list過程中,需要把已經(jīng)使用完畢的bunch手動刪除,回收內(nèi)存。
   注意:讀取文本時需要將換行符替換掉,并將空白字符替換掉;切分文本時,應(yīng)該使cut_all選項為False,不采用全切分模式。構(gòu)建文本的Bunch對象將分詞完畢的文本train_seg/train_seg生成Bunch對象,Bunch對象中將每個文檔的filelabel、filepath、content按對應(yīng)次序保存起來,并保存所有類別targetlabels。訓練集train_seg生成的Bunch對象序列化到磁盤文件train_seg_bunch.dat;用同樣的方法將測試集test_seg生成Bunch對象,并序列化到磁盤文件test_seg_bunch.dat。該部分的實現(xiàn)代碼為Seg2Bunch.py。  注意:在整合bunch_list過程中,需要把已經(jīng)使用完畢的bunch手動刪除,回收內(nèi)存。    生成TF-IDF詞向量空間對象反序列化train_seg_bunch.dat,讀取停用詞文件得到停用詞列表stop_words,通過train_seg_bunch與stop_words構(gòu)建train_tfidfspace對象,并序列化到文件train_tfidfspace.dat;通過test_seg_bunch、stop_words、train_tfidfspace構(gòu)建test_tfidfspace對象,并序列化到文件test_tfidfspace.dat。該部分的實現(xiàn)代碼見文件filebunch2TFIDF.py執(zhí)行預(yù)測反序列化訓練集詞向量空間train_tfidfspace與測試集詞向量空間test_tfidfspace。用train_tfidfspace訓練分類器,然后用訓練好的分類器進行預(yù)測,最后計算錯誤率。該部分的實現(xiàn)代碼見文件bayes.py。相關(guān)地址搜狗實驗室新聞數(shù)據(jù)java語言數(shù)據(jù)集獲取部分python語言部分精選后的數(shù)據(jù)集
生成TF-IDF詞向量空間對象反序列化train_seg_bunch.dat,讀取停用詞文件得到停用詞列表stop_words,通過train_seg_bunch與stop_words構(gòu)建train_tfidfspace對象,并序列化到文件train_tfidfspace.dat;通過test_seg_bunch、stop_words、train_tfidfspace構(gòu)建test_tfidfspace對象,并序列化到文件test_tfidfspace.dat。該部分的實現(xiàn)代碼見文件filebunch2TFIDF.py執(zhí)行預(yù)測反序列化訓練集詞向量空間train_tfidfspace與測試集詞向量空間test_tfidfspace。用train_tfidfspace訓練分類器,然后用訓練好的分類器進行預(yù)測,最后計算錯誤率。該部分的實現(xiàn)代碼見文件bayes.py。相關(guān)地址搜狗實驗室新聞數(shù)據(jù)java語言數(shù)據(jù)集獲取部分python語言部分精選后的數(shù)據(jù)集新聞熱點
疑難解答