1.格式轉換
原始數據集是只讀的xml格式文件(news_sohusite_xml.dat)。首先是編碼問題,需要將文件轉換為UTF-8編碼;然后是標簽問題,原始XML格式文件缺少根標簽,需要自行添加。本次格式轉換部分用java語言實現,逐行讀取內容,然后寫入目標文件,并在目標文件的首尾加上自定義的根標簽,最終得到格式轉換后的文件news_sohusite_xml.txt。格式轉換代碼如GBK2UTF8.java,實現了GBK向UTF-8格式的轉換
2.XML解析
搜狐新聞文件的格式為XML文件,需要對XML文件進行解析,格式如下: 本次需要解析出url地址,用于判斷新聞對應的類別;需要解析出docno,作為存儲文件的名稱,需要解析出content,作文單個文本的內容。
XML解析的三種方案
正則表達式:正則表達式可以解析任意格式的文本,但正則表達式適用于對滿足指定條件的文件內容進行查找或搜索,而本次需要將url、docno、content同時解析出,正則表達式不擅長這種結構化文本的解析;
BeautifulSoup:一個python的XML解析庫,beautifulsoup的容錯能力優于正則表達式,但beautifulsoup需要一次性讀取全部文件才能夠解析出數據,這種機制使得它的解析速度較慢,而且不能處理大文件;本次的原始文件比較大,beautifulsoup無法使用;
SAX:一個基于事件的XML解析庫,java、python均內置這種庫。由于SAX基于事件,可以邊讀取邊解析,不需要一次性讀取全部文件,所以該方法能很好地支持大文件解析。本次選用該方法。
SAX解析XML文件的代碼在saxparser包中,解析完畢后,輸出文件在dataout路徑下:
3.數據集的挑選
本次按服務器主機名分類,類別比較多;同時,大部分類別中的文檔數目太少,樣本容量不足。所以,本次決定初步篩選出文檔數目排名前50的類別。
4.數據集的精選
為了使數據集的類別區分度明顯,本次從排名前50的數據集中選出有代表性的8個類別;為了使樣本類別均衡,每個類別中挑出1000個文檔;將每個類別的文檔分為兩份——600和400,分別用于訓練和測試。這樣,就得到了8*600的訓練集和8*400的測試集。
轉碼處理在python平臺分別對訓練集traindata和測試集testdata進行轉碼,從GBK轉為UTF-8編碼,得到轉碼后的訓練集train_raw和測試集test_raw。實現轉碼的代碼文件為CodeChange.py 注意:轉碼過程中要decode()函數要加上”ignore”選項,忽略非GBK字符 page = page.decode("GBK",'ignore').encode('utf-8')
分詞處理本次分詞采用python平臺的jieba分詞工具,將訓練集train_raw內容分詞,分詞后的文檔存儲在train_seg目錄下;用同樣的方法對測試集test_raw進行分詞,保存在test_seg路徑下。實現分詞的代碼文件為WordSeg.py 新聞熱點
疑難解答