本發明屬于大數據存儲與分析領域,尤其涉及一種基于Spark的海量文本關鍵詞快速提取方法。
背景技術:
提取文本的關鍵詞是計算機分析自然語言的基本步驟。典型的文本關鍵詞提取算法有TFIDF、TextRank等。TFIDF即詞頻-逆文檔頻率算法,該算法綜合考慮一個單詞的兩種屬性:詞頻,即單詞在所屬文檔中出現的頻率;逆文檔頻率,即整個文本庫中包含該單詞的文檔數的倒數。詞頻越大則單詞在所在文檔中出現越頻繁,逆文檔頻率越大則該單詞在其它文檔中出現的概率越小,越能體現該文檔的特點。二者相乘即為一個單詞的TFIDF值,該值越高則相應單詞的重要性越高。TextRank是從搜索引擎計算頁面排名的PageRank算法變化而來,利用句子中單詞的互相關系計算每個單詞的重要性,并由此提取關鍵詞。相比TFIDF算法而言,TextRank算法較為復雜,且效果并不優于TFIDF。
目前,互聯網上有海量的文本信息,且數量還在不斷迅速增長。在大數據技術面世之前,缺乏對這些文本進行處理的手段。以Hadoop平臺為代表的大數據技術解決了這一困境。Hadoop平臺包含一系列適用于大數據處理的工具,如存放海量文件的分布式文件系統HDFS,存放海量數據的分布式數據庫HBase,分布式計算框架MapReduce等。
MapReduce框架以磁盤作為中間結果的緩存,算法執行效率大大受限于磁盤的讀寫速度,當數據量較大及算法比較復雜時尤為明顯。與之相比,內存計算框架Spark將數據加載到內存中進行處理,把對磁盤的讀寫轉化為對內存的讀寫,大大提高了算法的執行速度。隨著市場內存價格的降低,從經濟性角度考慮,內存計算也逐漸趕上甚至超過MapReduce框架。但內存數據有易失性,存儲需要長期保存的數據時仍然需要使用HDFS這樣的磁盤文件系統。
技術實現要素:
發明目的:為解決上述問題,對海量文本進行關鍵詞快速提取,本發明提供一種基于Spark的海量文本關鍵詞快速提取方法。
技術方案:一種基于Spark的海量文本關鍵詞快速提取方法,包括以下步驟:
(1)指定本地文件夾,并讀取所述文件夾下所有文本文件列表;
(2)根據所有的文本文件在本地創建SequenceFile,作為原始文本文件;
(3)將所述SequenceFile上傳到Hadoop平臺,等待關鍵詞提取算法處理;
(4)使用Spark將存儲在Hadoop平臺的SequenceFile加載到內存中;
(5)使用Spark對SequenceFile中每個文本文件分詞,并統計整個SequenceFile中每個文本文件的每個單詞在其所在的文本文件中出現的次數,記為x;統計整個SequenceFile中每個文件的總單詞數,記為y,設每個文本文件的每個單詞在其所在的文本文件中出現的頻率為TF,計算公式為TF=x/y;使用Spark統計每個單詞出現的文本文件數,記為m,統計總的文本文件數,記為n;設該單詞的逆文檔頻率為IDF,計算公式為對于每個文件的每個單詞,計算TF*IDF,作為詞頻-逆文檔頻率值;
(6)對每個文件,把每個單詞的詞頻-逆文檔頻率值從大到小排列,設定一個閾值p,保留所述排名前p位的值作為提取結果,去除其余的值;
(7)將所述提取結果保存為Hadoop平臺上的SequenceFile,根據所述提取結果生成結果文件。
有益效果:本發明提供的一種基于Spark的海量文本關鍵詞快速提取方法,將海量文本打包進行存儲、處理,把對海量小文件的讀寫轉化為對少數大文件的讀寫,提高讀寫的效率;利用Spark內存計算框架把待處理數據一次性加載到內存中再用算法處理,把對磁盤的讀寫轉化為對內存的讀寫,提高了數據處理的速度;最后,通過對算法步驟的合理安排,本方法一次性提取整個海量文本庫中所有文件的關鍵詞并把結果存儲在Hadoop平臺上,需要使用結果時只需直接讀取即可,從而實現了對海量文本庫中文件關鍵詞的秒級查詢。在處理總大小達到10GB、文件數達到100萬以上的海量文本時,對小文本打包處理比不打包的原始方法可快15倍以上,使用Spark處理比使用MapReduce又可快5倍以上。隨著數據量的增加,兩種方法的速度差距還會進一步擴大。對相應的提取結果進行查詢,可在0.1秒內獲得所需文檔的關鍵詞列表。利用Spark將待處理文本數據加載到內存中再利用TFIDF算法處理,實現了對文本關鍵詞的快速準確提取;將提取結果存儲到Hadoop平臺上,實現了對提取結果的實時快速查詢。
附圖說明
圖1是文本關鍵詞提取流程圖;
圖2是關鍵詞提取結果圖。
具體實施方式
下面結合附圖與具體實施方式,對本發明做進一步說明。
基于Spark的海量文本關鍵詞快速提取方法,包括以下步驟:
(1)指定本地文件夾,并讀取所述文件夾下所有文本文件列表;
(2)根據所有的文本文件在本地創建SequenceFile,作為原始文本文件。把文本庫中的海量小文件在本地打包為SequenceFile,并作為一個整體上傳到HDFS。HDFS設計為存儲比較大的數據文件,其默認的單個文件塊大小達到128MB,海量的小文本文件會大大降低HDFS的讀寫效率,而SequenceFile則是在HDFS上存儲這類文件的有效手段。一個SequenceFile實際上是一個鍵/值的映射,在本實施例中,文件路徑+文件名作為鍵,而文本文件的內容則作為對應的值。
(3)將所述SequenceFile上傳到Hadoop平臺,等待關鍵詞提取算法處理。搭建Hadoop集群整合多臺計算機的存儲能力,利用HDFS來存儲海量的文本數據。
(4)搭建Spark集群,利用Spark計算框架整合多臺計算機的計算能力和內存,提供算法實現的基本環境。使用Spark將存儲在Hadoop平臺的SequenceFile加載到內存中;
(5)利用Spark內存計算框架實現TFIDF算法。Spark的優勢在于使用讀寫速度大大高于磁盤的內存作為數據緩存。首先將SequenceFile加載到內存中,使用Spark對SequenceFile中每個文本文件分詞,并統計整個SequenceFile中每個文本文件的每個單詞在其所在的文本文件中出現的次數,記為x;統計整個SequenceFile中每個文件的總單詞數,記為y,設每個文本文件的每個單詞在其所在的文本文件中出現的頻率為TF,計算公式為TF=x/y;使用Spark統計每個單詞出現的文本文件數,記為m,統計總的文本文件數,記為n;設該單詞的逆文檔頻率為IDF,計算公式為對于每個文件的每個單詞,計算TF*IDF,作為詞頻-逆文檔頻率值;
(6)對每個文件,把每個單詞的詞頻-逆文檔頻率值從大到小排列,設定一個閾值p,保留所述排名前p位的值作為提取結果,去除其余的值;
(7)將所述提取結果保存為Hadoop平臺上的SequenceFile,根據所述提取結果生成結果文件,以原始文本文件名作為鍵,該文件的關鍵詞提取結果文件作為值,每個結果文件每行包括兩列,一列是單詞,另一列是該單詞在原始文本文件中的詞頻-逆文檔頻率值,所述單詞按照詞頻-逆文檔頻率值從大到小排列。將結果文件以SequenceFile的形式存儲到HDFS,以供查詢。
在查詢文本關鍵詞提取結果時,以目標文本的文件名+路徑作為鍵,到存放結果的SequenceFile中提取該鍵對應的值,即為相應文本文件的關鍵詞列表。本方法從海量文本庫提取關鍵詞的具體操作流程如圖1所示。
整個系統的硬件資源包含內存、CPU及磁盤存儲三部分,其中內存和CPU由Spark計算框架管理,用于加載文本數據、進行算法處理;磁盤存儲由Hadoop平臺組件HDFS整合,用于存儲打包的文本庫及關鍵詞提取結果。
圖2展示的是算法對示例文本庫(英文名著)的處理結果。圖2展示了其中一個文本文件(列夫·托爾斯泰的《戰爭與和平》)提取關鍵詞的結果,兩列數據分別為單詞的詞頻-逆文檔頻率值及單詞本身,可見詞頻-逆文檔頻率值最高的單詞是這部小說中主要人物的姓名。