楊明芬 吳旭 闞璦珂 ???/p>
(1.西藏自治區(qū)科技信息研究所,西藏 拉薩 850008;2.成都理工大學,四川 成都 610059)
隨著社會信息技術的發(fā)展,人們希望計算機擁有像人一樣的智力和能力,可以代替人類實現(xiàn)識別、認知、分類和決策等多種功能。人工智能不斷的發(fā)展,由于人工智能主要是利用智能學習算法,從大量的數(shù)據(jù)中學習經(jīng)驗來改善系統(tǒng)自身的性能,從而實現(xiàn)人類智慧所能做的事情[1]。其中文本分類是人工智能應用的一個重要方向,在現(xiàn)實生活中應用廣泛,比如新聞按欄目分類、網(wǎng)頁分類、個性化新聞、垃圾郵件過濾、情感分析等。文本分類問題屬于自然語言處理領域,現(xiàn)在自然語言處理算法是基于機器學習,更多的是統(tǒng)計機器學習。合適的機器學習方法結合大數(shù)據(jù)處理平臺,可以更好的進行文本分類,文本分類的發(fā)展使得計算機可以代替人類進行某些腦力和體力勞動,在當下如此注重效率的時代,文本分類發(fā)揮著重要作用[2]。單從經(jīng)濟而言,借助文本識別可以實現(xiàn)自動化,提高生產(chǎn)率,節(jié)約勞動成本。隨著現(xiàn)代科學技術的發(fā)展,文本識別將向更高的水平發(fā)展,隨之推動科學技術、生產(chǎn)力和人類智慧向更高的水平發(fā)展,對人類的社會進步起著巨大的推動作用。
大數(shù)據(jù)在國外發(fā)展較早,在上個世紀1980年,美國的阿爾文·托夫勒就提出了大數(shù)據(jù)的概念(WANG,Qiao,2014)。2008年經(jīng)由科學雜志發(fā)表相關文章,大數(shù)據(jù)概念才被廣泛傳播。美國政府將大數(shù)據(jù)視為強化國家競爭力的關鍵性因素之一,除了在概念上研究外,在技術方面也重點鉆研。谷歌公司在2003年,2004年分別提出了分布式文件系統(tǒng)和分布式計算模型等大數(shù)據(jù)解決方案(Doug Eadline,2013)43-44。解決了大數(shù)據(jù)存儲和計算問題[3]。國內(nèi)對于文本分類的研究相對于國外較晚,相比于國外的英文文本分類,中文文本分類具有更大的挑戰(zhàn)。英文單詞可以通過空格來區(qū)分,而中文是以字為單位,通過字組成詞語,詞語連成句子,才能表述一個完整的意思。最初通過詞匹配進行文本分類,這種方式主要尋找文章內(nèi)容與分類標簽的共同詞來進行分類,機械的方法無法達到良好的分類效果。后來利用統(tǒng)計學方法,在大量中文文本庫挖掘有效分類規(guī)則,再使用這些訓練好的分類器進行新文檔的歸類。利用統(tǒng)計學方法進行文本分類相比于傳統(tǒng)的詞匹配方法,效果良好。隨著不斷的發(fā)展,我國的分詞技術和文本分類都逐漸趨于成熟。
基于統(tǒng)計學進行文本分類,需要在大量的數(shù)據(jù)集上進行訓練,來尋找有效的分類規(guī)則,本文利用Hadoop和Spark,通過對大量的中文文本數(shù)據(jù)進行處理,結合有效的分類算法,構建一個基于大數(shù)據(jù)的智能文本分類平臺。文章主要研究基于大數(shù)據(jù)的文本識別系統(tǒng),實驗所用到的一些大數(shù)據(jù)處理技術和算法。其中包括分布式系統(tǒng)架構Hadoop、分布式文件系統(tǒng)HDFS、分布式計算模型MapReduce和分布式計算框架Spark,以及文本分類預處理所需要的分詞工具Ansj。采用以上技術,設計開發(fā)基于網(wǎng)絡服務器和瀏覽器架構的文本識別系統(tǒng)。文章開展的研究工作涉及的幾項大數(shù)據(jù)技術如下:
2003年,谷歌發(fā)表論文首先提出了分布式文件系統(tǒng)的概念,允許文件通過網(wǎng)絡訪問多臺主機的文件系統(tǒng),解決了大數(shù)據(jù)存儲的問題。之后,2004年,谷歌又發(fā)表了分布式計算框架MapReduce的論文,解決了大數(shù)據(jù)計算的問題。2006年3月,Hadoop項目正式啟動,將NDFS和MapReduce被納入其中。順應時代的發(fā)展,Hadoop已經(jīng)成為了當下最流行的大數(shù)據(jù)分析平臺[4]。
MapReduce是一種分布式并行計算模型,其主要思想是采用“分而治之”的程序處理理念。能將復雜的,大規(guī)模的數(shù)據(jù)處理任務分解并同時運行在多個節(jié)點上處理,MapRedue將這個復雜的過程抽象為Map和Reduce。將分布式文件系統(tǒng)中的大規(guī)模數(shù)據(jù)集切分成許多獨立的分片,這些分片可以被多個Map任務并行處理。然后利用Reduce任務將結果進行總和[5]。
HDFS是Hadoop的核心設計之一,和傳統(tǒng)的文件系統(tǒng)不同,HDFS把文件存儲在多個計算機節(jié)點上。這些計算機節(jié)點可以有普通的硬件構成,這大大降低了硬件開銷。HDFS有著高容錯性,大數(shù)據(jù)集,簡單的文件模型和強大的跨平臺兼容性等特點。HDFS采用了Master/Slave結構模型,HDFS有兩個關鍵的組件,NameNode(名稱結點)和DataNode(數(shù)據(jù)結點)。名稱結點負責管理文件系統(tǒng)的命名空間及客戶端對文件的訪問;數(shù)據(jù)結點負責處理客戶端的讀寫請求;DataNode會通過心跳機制和NameNode保持通信。為了保證分布式文件系統(tǒng)的容錯性和可用性,HDFS采用了多副本方式對數(shù)據(jù)進行冗余存儲,并以流式的形式訪問寫入的大型文件[6]。
Spark是Apache軟件基金會下的基于內(nèi)存的分布式計算框架,Spark的計算模式借鑒了MapReduce的優(yōu)點,同時很好的解決了MapReduce表達能力有限,磁盤IO開銷大和延遲高等缺點[7]。相比于MapReduce的計算模式,Spark提供了內(nèi)存計算,即把中間結果放到內(nèi)存中,而不是頻繁的讀寫磁盤。Spark是基于有向無環(huán)圖的任務調(diào)度執(zhí)行機制,基于內(nèi)存的執(zhí)行速度較MapReduce快上百倍。且Spark提供了完整而強大的技術棧、更多的語言支持、更多的運行模式。Spark相對于Hadoop具有較大的優(yōu)勢,但并不能取代Hadoop,實際上,Spark已經(jīng)很好的融入了Hadoop生態(tài)圈。
Ansj是一個開源的純Java中文分詞庫,基于中科院的ictclas中文分詞算法,主要應用于自然語言處理、高精度的中文分詞場景,底層利用高度優(yōu)化的Trie樹,TF/IDF詞袋模型等數(shù)據(jù)結構和算法來實現(xiàn)。支持用戶自定義詞典、定制CRF模型、停用詞過濾、書名發(fā)現(xiàn)、電子郵箱發(fā)現(xiàn)、身份證賬號發(fā)現(xiàn)、詞性標注、關鍵字提取等諸多強大的功能。
網(wǎng)頁是經(jīng)常用來展示和獲取信息的方式,主要有前臺網(wǎng)頁,后臺業(yè)務邏輯和服務器組成。Tomcat是一款非常流行的Web應用服務器,是Apache軟件基金會下的開源項目,實現(xiàn)了Servlet和JSP規(guī)范,擁有良好的性能。Servlet是基于Java技術的組件,定義了處理網(wǎng)絡請求的規(guī)范。而JSP是通過在HTML中內(nèi)嵌Java代碼的服務器頁面,在服務端執(zhí)行,返回HTML文本給客戶端[8]。
TF-IDF是一種統(tǒng)計方法,常用于評估字詞對于一個文件集或者語料庫的重要程度,詞語的重要性并不是出現(xiàn)的越多越重要。TF-IDF的思想是一個詞語在文章中出現(xiàn)的次數(shù)越多,而同時在所有文檔中出現(xiàn)的次數(shù)越少,即字詞的重要性與它出現(xiàn)在文件中的次數(shù)成正比,與出現(xiàn)在所有檔或語料庫的次數(shù)成反比。經(jīng)常出現(xiàn)在中文中的詞并不代表實際信息,但是這些詞在文檔中出現(xiàn)的頻率較高。TF-IDF通過數(shù)值化文檔信息,來衡量詞語的重要程度。其中TF值的計算方法如公式(1)
tfi,j是 j此篇文檔中 i詞語的詞頻,ni,j是 i在 j文檔中出現(xiàn)的次數(shù),Tj代表j文檔中每個詞語。IDF定義如公式(2)
其中,idfi代表i詞語的逆向文件頻率,d代表文檔集,D代表文檔的個數(shù),ti代表i詞匯。TF-IDF的值計算公式如(3)所示:
通過對每個詞語進行TF-IDF的計算,然后根據(jù)值的大小降序排列,就可以對文章進行特征抽取和關鍵字提取。
樸素貝葉斯是基于貝葉斯定理與特征條件獨立假設的分類方法,而貝葉斯定理是關于隨機事件和條件概率的(周志華,2016)147-150。貝葉斯定理如公式(4):
P(A|B)表示在事件B發(fā)生的條件下事件A發(fā)生的概率,也等于A和B同時發(fā)生的概率處理B發(fā)生的概率。貝葉斯推斷是貝葉斯定理的一種應用。貝葉斯推斷建立在主觀的判斷基礎上,然后根據(jù)大量實驗數(shù)據(jù)進行不斷的修正[9],因此貝葉斯推斷需要大量的數(shù)據(jù)計算。樸素貝葉斯以貝葉斯定理為基礎,假定屬性值之間相互獨立,這也是樸素一詞的來歷,樸素貝葉斯分類器的核心思想基于公式(5)所示。
可以根據(jù)樣本的特征推斷樣本的類型。因此樸素貝葉斯分類器也常用于文本分類,通過對訓練文本的學習,得到分類器參數(shù),進而使用該網(wǎng)絡對文本進行分類[10]。
隨著互聯(lián)網(wǎng)的發(fā)展,大數(shù)據(jù)時代逐漸到來,互聯(lián)網(wǎng)上各類信息充斥在我們的身邊,這些資源大部分都是以本文的形式出現(xiàn),如何有效的處理,組織這些信息變得尤為重要。文本分類是處理大量信息的有效手段之一,人們對于文本分類的研究起步很早,但由于時代環(huán)境的影響,分類結果差強人意,隨著時代的發(fā)展,機器學習逐漸興起,同時作為機器學習的基礎大數(shù)據(jù)以及大數(shù)據(jù)相關的技術同步發(fā)展,大數(shù)據(jù)的核心是數(shù)據(jù)的價值,而機器學習是利用數(shù)據(jù)價值的關鍵技術。大量的數(shù)據(jù)能夠提升模型的精確性,復雜的機器學習算法需要耗費大量的時間,因此迫切的需要分布式和并行計算這樣關鍵的技術。大數(shù)據(jù)和機器學習的結合為文本分類開辟了一條新的道路,因此基于大數(shù)據(jù)的文本分類系統(tǒng)就變得十分有意義。
系統(tǒng)流程如圖1所示,將收集到的大數(shù)據(jù)存儲在HDFS系統(tǒng)的分布式文件系統(tǒng)中,通過MapReduce批量數(shù)據(jù)預處理,再Spark強大的計算能力根據(jù)文本分類算法訓練數(shù)據(jù),生成文本分類模型,最后將文本分類模型封裝成服務,提供給用戶。
圖1 系統(tǒng)流程圖
基于大數(shù)據(jù)的文本系統(tǒng)主要分為模型應用層、數(shù)據(jù)挖掘層、數(shù)據(jù)預處理層、數(shù)據(jù)存儲層和數(shù)據(jù)采集層。模型應用層調(diào)用數(shù)據(jù)處理層提供的接口,實現(xiàn)文本分類,為用戶提供服務。整個系統(tǒng)中,下層應用為上層應用提供服務。其主要的處理流程為數(shù)據(jù)采集層采集數(shù)據(jù),利用數(shù)據(jù)存儲層提供的服務存儲數(shù)據(jù),由數(shù)據(jù)預處理層對存儲的數(shù)據(jù)進行預處理。數(shù)據(jù)處理層主要利用Spark強大的計算能力和Naive Bayesian算法對符合算法數(shù)據(jù)格式的數(shù)據(jù)挖掘計算,得到數(shù)據(jù)分類模型,最后應用數(shù)據(jù)模型,為用戶提供服務。系統(tǒng)架構如圖2所示。
圖2 系統(tǒng)架構
2.4.1 模型應用層。該層主要功能是利用已經(jīng)訓練好的文本分類模型為用戶提供文本分類服務。
2.4.2 數(shù)據(jù)挖掘層。該層主要功能主要是通過Spark中實現(xiàn)的Naive Bayesian算法,在現(xiàn)有的數(shù)據(jù)上進行模型訓練。該層的主要挑戰(zhàn)是挖掘算法復雜,并且計算量很大。
2.4.3 數(shù)據(jù)預處理層。該層的功能主要是利用MapReduce批量處理文本數(shù)據(jù)的優(yōu)勢和Ansj分詞工具對大量的中文文本進行分詞。
2.4.4 數(shù)據(jù)存儲層。該層的主要功能是利用分布文件系統(tǒng)HDFS存儲來自數(shù)據(jù)采集的大量數(shù)據(jù)。
2.4.5 數(shù)據(jù)采集層。該層的主要功能是利用爬蟲,第三方數(shù)據(jù)采集平臺或多個數(shù)據(jù)庫等獲取主題數(shù)據(jù)。
此系統(tǒng)主要處理文本數(shù)據(jù)分類問題,其主要目標是大量文本數(shù)據(jù)的處理,但所選擇的數(shù)據(jù)中每個目錄下有許多的小文件,這些小文件會單獨的切片,交由map結點進行處理,造成效率低下。為了避免該類問題,根據(jù)MapReduce機制,將采用不切片的方式,所以對數(shù)據(jù)表設計兩個字段,用label字段代表文本分類,text字段代表文本。這樣在一個label下,會有多個小文件的內(nèi)容,對提升這個系統(tǒng)的性能有著很大的作用。
分詞主要是將語句分割成單個詞語,此次實驗主要利用了Ansj工具進行分詞,主要代碼如下所示。該段代碼顯示了如何利用Ansj進行中文分詞,首先讀取默認的停用詞,然后去除空字符串,標點符號等對文本分類模型貢獻不大的數(shù)據(jù)。
通過MapReduce分布式處理框架,能夠高效的處理基于鍵值對的大量數(shù)據(jù),更加適合批處理業(yè)務。MapReduce默認的輸入格式FileInputStream默認為為一個文件生成一個切片,每個切片產(chǎn)生一個map任務,如果map數(shù)過多,則會增加調(diào)度開銷。本次實驗的中文數(shù)據(jù)集分類文件夾下有許多小文件,為提高分詞效率,應該將多個小文件合并,不進行分片。具體方法是實現(xiàn)FileInputFormat的抽象子類Combine-FileInputFormat的createRecordReder方法,并且禁止分片。具體代碼如下所示。
通過自定義InputStream,將多個文件合并為一個分片,接下來需要自定義讀取分片的方式MyRecordReader類。該類中的重要方法nextKeyValue定義了讀取分片的方式,即將文件的類別作為Key,文件的整個內(nèi)容作為Value。主要代碼如下所示。
定義好文件的輸入和讀取方式,接下來需要書寫Map任務類,在Map任務類中,調(diào)用Ansj分詞方法并行的處理文本分詞任務,并將分詞后的字符串作為Value值,Key值為文件類別。具體代碼實現(xiàn)如下所示。
最后,定義分詞驅動類SplitTextDriver,配置相關參數(shù),設置數(shù)據(jù)的讀取和輸出路徑為HDFS,然后執(zhí)行分詞任務。相關代碼如下所示。
在開始計算TF-IDF前,需要對得到的分詞結果進行預處理,將分類標簽數(shù)值化,并且將逗號分隔符轉變?yōu)榭崭穹指舴?,因為Spark默認以逗號分割。具體每個分類標簽代表的數(shù)值如表1所示。
表1 分類標簽對應值
具體實現(xiàn)代碼如下所示。該段代碼首先將分詞結果集讀入Spark內(nèi)置的數(shù)據(jù)結構RDD,調(diào)用自定義工具類SplitTextUtil中的CategoryToIndex方法將分類標簽對應的值數(shù)值化。RecordBean為記錄實體類,定義了兩個字段label和text,分別代表分類標簽和對應分詞后的文本值。
接下來利用Spark計算TF-IDF。首先將字符串按空格分詞,然后創(chuàng)建Spark的HashingTF對象并調(diào)用setInputCol方法設置輸入的列為words,輸出的列外rawFeatures具體代碼如下所示。
輸入為分詞結果,輸出為詞語對應的TF-IDF值,計算結果如圖3所示。為了便于輸出,僅僅選取了100維特征向量。其下標范圍為0-99,緊接在后面的表示對應的值。
圖3 TF-IDF執(zhí)行結果
Spark是基于分布式內(nèi)存通用型計算框架,善于處理大規(guī)模數(shù)據(jù)的復雜運算。此次實驗利用Spark進行文本分類模型的訓練。在Spark中,已經(jīng)提供了關于機器學習的包SparkML。此次實驗直接使用Spark內(nèi)置的NaiveBayes實現(xiàn)。首先配置SparkConf,設置為本地模式。將計算TF-IDF后文本向量數(shù)據(jù)集進行分割,60%當做訓練數(shù)據(jù)集,40%當做測試數(shù)據(jù)集。調(diào)用NaiveBayes的fit方法進行訓練,最后將模型保存在HDFS上。進行模型訓練的代碼已經(jīng)完成,接下來需要考量模型訓練結果的準確度,對模型測試的準確率accuracy進行統(tǒng)計。即預測準確的數(shù)除以總的測試集數(shù)量。并將模型存儲在HDFS中target目錄下。具體代碼如下所示。
運行上述代碼,該段代碼的輸入為5.5.1小寫計算的TF-IDF值,輸出為經(jīng)過NaiveBayes算法訓練后,模型對訓練集進行預測,并預測正確的概率。控制臺輸出如圖4所示結果。
圖4 模型訓練結果
由控制臺輸出的結果來看,模型的準確率達到85%?;拘Ч诲e。
測試環(huán)境是軟件測試的一個重要階段,測試環(huán)境的適合與否嚴重影響測試結果的真實性,是系統(tǒng)安全可靠性,易用性等大多數(shù)指標的主要環(huán)境。本次測試并不在同一個操作系統(tǒng)下測試。
表2 測試結果
功能測試覆蓋整個系統(tǒng)的功能模塊,為用戶提供綜合服務的能力。測試整個系統(tǒng)是否能達到需求分析的功能。具體測試場景如圖5所示。
圖5 測試結果圖1
從上述結果可以看出,系統(tǒng)基本能夠實現(xiàn)正確的分類。但分類結果的可信度還不是很高,初步估計這可能是基于現(xiàn)實環(huán)境的原因,訓練的數(shù)據(jù)集還不是很大。導致模型不是很成熟,同時也可能是中文分詞的結果不理想造成。
大數(shù)據(jù)與機器學習算法的結合才能使人們的生活變得越來越高效。通過對大數(shù)據(jù)的文本分類系統(tǒng)的設計與實現(xiàn),學習了很多關于大數(shù)據(jù)和機器學習方面的知識。實現(xiàn)了一個基于Hadoop和Spark,利用NaiveBayes算法的文本分類系統(tǒng)。文章研究、設計的系統(tǒng)能夠將大量的數(shù)據(jù)存儲在HDFS上,通過MapReduce階段進行中文分詞,然后將分詞結果傳給更高效,計算更快速的Spark階段進行訓練模型,最后利用模型,基本能夠達到對輸入文本數(shù)據(jù)進行類別判斷。不足之處表現(xiàn)在對文本識別的正確率和可信度還有待提高,初步估計是因為文章開展的實驗導致訓練的數(shù)據(jù)量不是很大,從而使模型參數(shù)有偏差。