文|熊立波
在當前信息爆炸式增長的時代,用戶對信息服務的需求已經從信息匯聚為主的廣播式服務逐漸過渡到要求提供按需、定制化、定向的集成化信息服務。用戶要求能按照其特定的業務需求,對信息進行預加工、過濾后,提供給他們精品化的“干貨”。這對我們通訊社的信息服務方式也提出了新的要求。在大數據時代,信息量呈幾何方式增長,同時我們也積累了大量的歷史資訊數據,如果不能對信息進行合理的分類,我們就不能按用戶的需求提供給他們需要的信息。但是,如果這些數據都按照傳統的人工方式,通過記者和編輯對所有信息進行分類、加工,不僅成本巨大,而且信息加工的效率也不能滿足用戶對信息時效性的要求。當前,信息智能分析處理技術,特別是針對于中文的資訊智能處理技術已經有了快速的發展。通過技術創新,構建資訊自動預處理系統,減少人工成本,提高信息生產效率和服務能力是我們的必經之路。
文本自動分類技術(textcategorization)主要指的是依靠基于機器學習的文本分類算法,在預先給定的類別標記(Label)集合下,根據文本內容判定它所屬的類別。
目前應用比較成熟的機器學習算法主要是基于統計學的機器學習和分類算法,統計學習方法的基本思想就是讓機器像人類一樣通過對大量已經分類好的同類文檔的觀察來學習并總結經驗,作為今后分類的依據。統計學習方法需要一批由人工預先進行了準確分類的文檔作為學習的材料,計算機從這些文檔中挖掘出一些能夠有效分類的規則,這個過程被形象的稱為“訓練”。訓練總結出的規則集合常常被稱為分類器。訓練完成之后,需要對計算機使用這些訓練出來的分類器對從來沒有見過的文檔進行分類。目前應用比較普遍的分類算法主要包括樸素貝葉斯(naive bayes),KNN算法和支持向量機(SVM, Support Vector Machine)等統計算法。本文主要采用的是樸素貝葉斯算法,主要原因是樸素貝葉斯算法相對簡單又有較好的準確度,執行效率高,便于實現對資訊文本進行在線實時的分類。
全文檢索是指計算機索引程序通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢時,檢索程序就根據事先建立的索引進行查找,并將查找的結果反饋給用戶的檢索方式。這個過程類似于通過字典中的檢索字表查字的過程。
全文檢索的方法主要分為按字檢索和按詞檢索兩種。按字檢索是指對于文章中的每一個字都建立索引,檢索時將詞分解為字的組合。對于各種不同的語言而言,字有不同的含義,比如英文中字與詞實際上是合一的,而中文中字與詞有很大分別。按詞檢索指對文章中的詞,即語義單位建立索引,檢索時按詞檢索,并且可以處理同義項等。英文等西方文字由于按照空白切分詞,因此實現上與按字處理類似,添加同義處理也很容易。中文等東方文字則需要切分字詞,以達到按詞索引的目的,所以分詞器的好壞和效率往往在很大程序上影響全文檢索的準確性和效率,本文使用的IKanalyzer開源中文分詞器是目前使用比較普遍,效率也較高的開源中文分詞器。
Apache Mahout是Apache Software Foundation(ASF)旗下的一個開源項目,提供了一些可擴展的機器學習領域經典算法的實現。經典算法包括聚類、分類、協同過濾、進化編程等等。Mahout的中文意思是“大象的訓練師”,而“大象”正是Hadoop的符號,正如Mahout名稱所表達的意思,Mahout可以構架在Hadoop架構上,從而實現對大數據進行分布式,可擴展的并行計算。Mahout提供的開源分類算法中包含了樸素貝葉斯算法的Java實現。
Apache Solr同樣也是Apache Software Foundation(ASF)旗下面向企業的開源搜索服務器,其核心構架在Lucene框架之上,面向企業應用,提供了基于HTTP Web接口的完整的全文檢索、高亮顯示、切片搜索(facet)等全文搜索功能。
系統的主要目標是能在線實時的對新入庫的資訊文本數據進行自動的預分類和標引,要能夠在線實時的被分類、標引和全文索引入庫,使用戶能即時檢索到新入庫的資訊。
資訊分類的流程主要包括“學習分類”,“全文索引”和“檢索界面”三個部分。“學習分類”流程主要是機器對由人工預先分類好的資訊樣本數據進行學習,得到并生成分類器,這個流程由Mahout框架實現;“全文索引”流程是對資訊文本數據進行分詞和索引,并用學習分類流程生成的分類器對資訊的分類屬性進行標引,這部分功能由Solr框架實現;“檢索界面”流程則是開發Web檢索界面,便于用戶進行查詢和檢索,這部分功能由jQuery和Ajax-solr框架實現。

1、樣本數據
由于分類器是通過對樣本數據的學習和訓練得到的,樣本數據所屬分類信息的準確性對分類結果的準確性有很大的影響。為了保證樣本的分類屬性盡量的準確,本文的樣本數據是從互聯網專業網站上選取了11個行業資訊樣本,每個樣本有50篇的文本資訊,每篇文本資訊的字數在500字左右。

圖2 樣本數據
2、樣本數據的學習
Mahout樸素貝葉斯分類器的訓練學習過程主要分為五步:
1.使用mahout seqdirectory命令從訓練樣本數據生成Seq文件(hadoop文件);
2.使用mahout seq2sparse命令生成向量文件;
3.使用mahout split命令拆分向量文件為“學習集”和“驗證集”兩個集合;
4.使用mahout trainnb命令對“學習集”向量文件進行學習,生成分類器模型
5.使用mahout testnb命令用“驗證集”對上一步生成得到的分類器模型的準確度進行測試和驗證,對結果進行分析,如果存在問題則調整訓練樣本文件重新學習測試(大多數問題的原因是訓練樣本存在分類二義性)
圖3和圖4分別是用“訓練集”和“驗證集”驗證分類準確性進行驗證的輸出結果,從訓練結果看,用“訓練集”驗證分類器模型的分類準確率是100%,用“驗證集”驗證分類器模型的準確率是80.2775%,從圖4輸出的測試矩陣可以看出,錯誤比較大的是“土地政策”有4篇文章被分類到了“房地產”中,“建筑行業”有5篇被分類到了“建材業”中,鋼鐵行業有7篇被分類到了“建材業”,但是從業務角度分析,這幾個行業的確有相似的地方,80.2775%分類的準確性還是可以接受的。

本文使用的新聞數據是新華社多媒體數據庫中歷時半年的部分歷史資訊數據,一共是58萬余條。本文使用了開源的pysolr接口,開發python程序把文本資訊寫入到solr索引庫中,然后使用Solr調用分類器對寫入的資訊數據進行索引和分類,主要步驟是:
1.在solr的schema.xml文件中建立索引字段,由于新聞資訊數據都是中文,本文使用了IKanalyzer開源中文分詞器;
2.開發程序對新聞數據文件進行解析,建立新聞數據字段與solr索引字段的映射關系,調用pysolr進行資訊的逐條寫入;
3.配置solr的solrconfig.xml文件,使得solr可以調用外部的分類器對特定的字段(本文是對DOC_CONTENT字段)進行分類并進行標引。

檢索界面為用戶提供全文檢索和分類檢索的功能,本文使用的是基于jQuery的ajax-solr開源框架,檢索界面把用戶輸入的檢索參數拼裝成http請求,訪問后臺的solr檢索引擎,獲得的結果再回寫入檢索界面展示給用戶。
從圖7可以看出,分類器對每篇資訊所屬的11個行業的可能性都進行了打分,分值最大者是最有可能屬于的分類,分類器對《智慧城市建設助推新興產業“落地” 為地方經濟轉型升級帶來契機》這篇文章的分類判定為“g”——汽車業,通過打開正文分析,是因為文中提到了“智能交通”,所以這篇文章在需要判定的11個行業中,汽車業是最接近的(見圖8)。
本文對58萬條余文本數據進行了在線的分類和索引,并對使用分類器和不使用分類器的資訊入庫性能進行了對比。從圖9、10中可以看出,當使用了分類器以后,較大的影響了文章索引的性能,58萬數據全部完成索引的時間是307分鐘,平均是31篇/秒,即1860篇/分鐘,比沒有分類器的索引時間多了1倍多。但是這個索引和分類速度已經可以完全滿足目前新華社自有資訊業務的需求,同時由于本文的試驗環境是PC虛擬機,如部署到服務器上整體性能還會有進一步提升。
本文創新性的把分類算法和全文檢索引擎結合到了一起,通過技術創新,提出并實現了對文本資訊的在線自動分類和全文索引,同時實現了較好的分類準確性和分類檢索效率。下一步將進一步優化分類算法和提高分類索引的效率,以期盡快應用到新華社實際的采編業務流程中去。