王龍霄,李 健,沈麗民
(戰略支援部隊信息工程大學洛陽校區,洛陽 471003)
隨著互聯網媒體的發展,新聞行業邁向互聯網時代,人們可以在新聞網站閱覽熱點信息,新聞網站也是信息獲取的重要途經。新聞信息具有時效性的特點,而且伴隨著大數據時代的到來,新聞信息變得越來越多,越來越復雜,用人力將所有信息逐一分析不僅是對人力資源的巨大浪費,而且實施的過程困難重重。許多信息由于來不及整理、匯總、分析,使得信息的時效性價值大打折扣。因此,亟需設計一套新聞分析系統對時事新聞進行獲取和分析。
針對上述提到的問題,本文建立了基于網絡爬蟲技術和自然語言處理技術的新聞獲取分析系統。系統使用網絡爬蟲技術抓取新聞網站的全部信息,將信息存儲在數據庫中,并在存儲的過程中對信息進行語音分析與翻譯,提取關鍵詞、關鍵句等,使用者可使用系統內檢索工具對所需信息進行模糊搜索,以方便給予使用者掌握社會、國際熱點及輿情動向。
以美國有線電視新聞網(CNN)為例設計新聞獲取分析系統。系統分為3 個模塊,爬蟲模塊、自然語言處理模塊和系統可視化與交互模塊。系統總體架構如圖1所示。

圖1 整體架構
1.1.1 URL管理功能
URL 管理的設計思路是將URL 存儲在兩個.txt文本中,其中一個文本內儲存待獲取的新聞信息URL,另一個文本內儲存已爬取新聞信息的URL。利用.txt 文本方便增加與刪除的特點,實現全部新聞信息URL 的動態管理,也為后續增量式爬蟲設計提供方便。除使用.txt文本外,也可使用csv文件對URL進行管理。可以將未爬取的URL 標記為0,已爬取的URL 標記為1。兩種方法在均不涉及數據庫的方式下實現了URL管理功能,避免了系統過于復雜。
1.1.2 網頁下載與解析
首先給定新聞網站(美國有線電視新聞網)URL,并對該網站架構進行分析。網絡爬蟲總體分為三次爬取。第一次爬取為爬取網站各個欄目的URL。目前,Python 主要的網頁數據抓取方法有正則表達式匹配方法、BeautifulSoup 方法、LXML 方法[1]。網頁下載過程使用Python 第三方庫request 完成,網頁解析過程使用BeautifulSoup 第三方庫或LXML 第三方庫進行網頁的結構化解析。經過比較發現,使用LXML 第三方庫比使用BeautifulSoup 第三方庫效率高。效率對比如表1所示。經過下載解析后,得到各個欄目的URL,將URL 存放在列表之中。第二次爬取為按照獲取的各個欄目的URL 獲取新聞詳情頁的URL。

表1 效率對比
在第二次爬取過程中,新聞詳情頁URL是利用ajax技術或js技術動態請求,傳統的爬取方式無法爬取新聞詳情頁的URL。可以使用兩種方式進行爬取。第一種為分析JS源碼,完成爬取。首先在網頁控制臺中選擇XHR異步加載數據,抓取網絡數據包,得到Json文件的URL地址,查詢參數,解析js 源碼完成爬取。第二種為使用selenium 第三方庫進行爬取。下載與瀏覽器匹配的webdriver驅動,計算機自動模擬瀏覽器進行網頁的下載與解析。將得到的新聞詳情頁URL置于URL管理庫中,以方便后續的爬取。
第三次爬取過程為爬取新聞詳細的內容,包括題目、作者、時間、內容。系統使用threading 第三方庫進行多線程的爬取,最大程度地節約時間。可以建立線程池,將爬取函數置于線程池中,既節約時間,也節省計算機資源。爬取的新聞信息寫入.txt文本文件中,文件名稱為新聞標題,并在寫入文件的同時進行自然語言處理模塊的工作。系統爬取新聞信息部分結果如圖2所示。

圖2 爬取部分結果
在使用基于廣度的通用爬蟲獲取新聞網站全部的新聞信息后,針對網站新發布的新聞信息,系統增添了增量式爬蟲設計,以便在后續系統維護和信息更新中盡可能地爬取新的新聞信息。增量式爬蟲的關鍵在于新聞詳情頁URL的去重,可使用以hash 函數為基礎的布隆過濾器進行URL的去重操作。
布隆過濾器由元素位圖與k個hash 函數構成,當新的元素至于位圖中,k個hash函數將此元素映射到k個元素位圖上的點,標記為1。在檢索過程中,通過k個hash 函數推測元素位圖中k個點標記是否均為1。布隆過濾器避免了單獨的hash 函數可能將兩個及以上的元素標記為同一地址,產生hash碰撞。
自然語言處理模塊實現了系統的分析功能,其表現為提取關鍵詞與關鍵句,并使用API 接口對新聞信息全文及提取的關鍵詞句進行翻譯。系統采取基于詞圖模型的TextRank 無監督算法進行關鍵詞句的提取。無監督相比有監督算法優點在于有監督算法在訓練過程中的成本過高,無監督算法利用某些方法進行詞的提取,不需要人工手動進行訓練。
TextRank 算法是基于詞圖的關鍵詞抽取排序及文章摘要算法,由PageRank 網頁重要性排序算法衍進而來。TextRank 算法將整篇文章視作有向圖,將文章內每個句子視作圖內節點,將兩個句子的相似程度視作轉移概率。在算法遍歷運算過程中形成了一階馬爾科夫鏈,形成一個平穩分布,兩個句子之間的相似性分值儲存在矩陣之中,在經過排序后選取排名較前的若干句子形成摘要。在抽取關鍵詞時,首先對文本進行分詞,保留名詞、動詞、形容詞、副詞等實義詞,將實義詞作為候選關鍵詞,即:
其中:T為文本全體信息,Si為文本內所有句子,tij表示句子內所有分詞。
其次,構建詞圖關系:
其中:V為節點集合,采用共現關系構造任意兩個節點之間的邊,共現最多K個單詞,K等于2。根據公式迭代各個節點的權重至收斂,即:
其中:WS(Vi)代表第i句的權重;d為阻尼系數,為0.85;Vi,Vj為任意兩節點,Wji表示兩節點邊的權重[2];WS(Vj)代表迭代之前句子j的權重;out(Vj)為指向節點的結合,根據權重排名選取m個詞作為關鍵詞。
系統使用Textrank4zh 第三方庫內Text-Rank4Keyword 與TextRank4Sentece 模塊進行關鍵詞與關鍵句的抽取,選定關鍵詞數量為5,關鍵句數量為3。系統對某文本處理結果如圖3所示。

圖3 文本自然語言處理結果
系統采用百度翻譯API 接口,百度翻譯提供了中英翻譯與小語種翻譯的服務,通過注冊百度開放平臺得到的APIID 與Key,實現文檔對百度翻譯引擎的請求。百度翻譯API 工作流程分為兩步:第一步為使用HTTP 協議get 或post請求方式調用API 接口,第二步為翻譯引擎工作根據設置的參數返回數據并調整格式。利用百度開放平臺中給出的代碼Demo,可極為方便地實現API接口的設置。
Tornado 是基于Python 的輕量級Web 框架,為異步非阻塞IO式處理方式,較Django框架具有少而精、性能高的特點。系統采用Tornado框架作為使用者與服務器的交互平臺,由四個部分組成:
(1)IOLoop 模塊是Tornado 框架的核心模塊,Tornado 利用此模塊開啟循環監聽并處理全部I/O事項。
(2)Handler 模塊是實現框架不同頁面功能的模塊,一個頁面功能一般對應一個handler類。系統有5個交互功能,登錄頁面、全部新聞信息標題縮略頁面、模糊檢索功能、新聞信息詳情、自然語言處理詳情。在編寫Handler 類時,可使用第三方的模板或JavaScript 語言進行網絡頁面的編寫制作。
(3)Application 模塊表示Tornado 框架后端服務實例,可利用實例進行端口的接聽等。
(4)路由映射模塊通過指定URL 規則與Handler 類關聯。使用者請求數據時,根據訪問的路由映射查詢找到相應功能的Handler 類處理請求[3]。
Tornado框架Web結構如圖4所示。

圖4 Tornado框架結構
使用Javascript 語言制作網頁作為系統的可視化交互平臺,實現使用者對數據庫內全部信息的檢索功能。系統響應過程為使用者向系統發出檢索請求,檢索數據提交數據庫以Json 格式返回,頁面對數據進行處理后顯示給使用者[4]。系統頁面如圖5所示。

圖5 系統頁面展示
本文建立了對美國有限電視新聞網的新聞信息爬取與分析的系統,分析了有關爬蟲過程、自然語言處理過程及交互過程中細節的實現。爬蟲過程考慮了新聞網站時間跨度問題,盡可能全面地獲取新聞網站的數據,系統通過分析功能對單個新聞文本信息進行關鍵詞句的抽取并翻譯,方便使用者快速掌握國際熱點信息,也可用于進一步的文本數據挖掘。