秦 龍,李曉戈+,穆諍輝,李 濤
(1.西安郵電大學 計算機學院,陜西 西安 710121;2.西安郵電大學陜西省網絡數據分析與智能處理重點實驗室,陜西 西安 710121)
在網頁文本信息提取領域,已經有大量的研究工作和成熟的方法。Chen等[1]針對網頁結構特征進行抽取,在內容分析算法的基礎上改進網頁抽取模型。Yi等[2]利用機器學習的思想將支持向量機和DOM重心半徑相結合抽取網頁正文;Zhou等[3]將支持向量機和文本密度結合提取網頁正文;Ye等[4]采用向量空間模型作為文本的描述,提出一種基于Bean優化特征提取算法。Luo等[5]提出一種基于特征的Web數據抽取算法,該算法根據網頁的特征相似度將網頁聚類在一起,并將其它動態網頁與所識別的網頁的模板進行對比抽取網頁正文。Liu等[6]采用文本密度和標簽路徑覆蓋率結合的抽取算法;Wang等[7]提出一種多特征融合的正文抽取算法。Chen等[8]采用長短期記憶網絡的深度學習方法進行網頁正文提取。王輝等[9]將知識圖譜引入信息抽取系統進行數據抽取。
以上算法大都針對文章類型網頁,而當今網頁形式多樣,單一類型的網頁抽取已經無法滿足海量數據自動采集的需求。本文將網頁分為列表網頁和文章網頁,提出基于截屏網頁圖像分類的自動化網頁正文抽取模型。該模型利用神經網絡將截屏網頁圖像進行分類,然后根據網頁類型分別采用改進的基于多特征融合的網頁正文抽取算法。該算法不需要人工配置,不依賴網頁模版,實現數據抓取和網頁正文抽取自動化。
自動化網頁正文抽取模型如圖1所示。

圖1 自動化網頁正文抽取模型
模型分為爬蟲模塊—分類模塊—正文抽取模塊。爬蟲模塊采用網絡爬蟲技術將網頁HTML源碼抓取保存并利用Phantomjs將網頁截圖;分類模塊利用卷積神經網絡將網頁截圖分為文章網頁和列表網頁;正文抽取模塊根據網頁類型分別采用基于相同深度的文本長度標準差算法和基于相同深度的同類名元素排序算法抽取網頁正文內容。
CNN是一個多層感知器神經網絡,從輸入數據中提取特征,并使用神經網絡的反向傳播算法進行訓練。圖像分類中使用了很多CNN架構:AlexNet、GoogLeNet、DenseNet[10]、VGGNet、ResNet和EfficientNet。LeNet-5模型的提出為使用卷積神經網絡進行圖像分類研究奠定了基礎。Kayed等[11]將LeNet-5應用于電子商務領域,解決服裝分類問題;Chen等[12]將其應用在雷達輻射源個體識別。ResNet[13]利用殘差網絡解決深度增加后網絡退化的問題,很多研究者在其它圖像領域進行應用,如為了解決化學試劑標簽圖像分類問題,Xu等[14]引入遷移學習方法,在ResNet-101基礎模型上進行微調,訓練化學試劑分類模型;Zhou等[15]將ResNet-101模型應用在列車高度閥故障檢測中。
本文將網頁分為文章網頁或列表網頁,采用網頁截屏圖像作為訓練數據。網頁截屏圖像不同于其它公開的圖像分類數據集,一張圖像的大小在10MB左右,因此圖像特征要多于其它通用數據集,并且因為網頁的特殊性,文章網頁圖像和列表網頁圖像的特征存在重復。文章網頁和列表網頁如圖2和圖3所示。接下來簡單介紹本文的圖像分類模型。

圖2 文章網頁

圖3 列表文章
本文在LeNet-5模型上對截屏網頁圖像進行分類,具體模型如圖4所示。

圖4 LeNet模型
輸入層:如圖4所示,輸入層為224×224的圖像。
Conv2D:這幅圖像經過第一個卷積層,該層有6個尺寸為3×3的卷積核,步長為1。圖像尺寸將從224×224×1變成222×222×6。
MaxPooling2D:該池化層經過2×2的卷積核,步長為2,最終圖像減少為111×111×6。
ReLU:激活函數層。
Conv2D:第二個卷積層為16個大小為3×3,步長為1的卷積核,圖像變為109×109×16。
MaxPooling2D:第二個池化層同第一個池化層一樣,將圖像變為54×54×16。
ReLU:激活函數層。
Flatten:將數據拉直,得到46 656個特征參數。
Dense:最后三層為全連接層,特征參數分別為120、84和2。得到代表網頁類型的文章網頁和列表網頁的概率,將最大值作為分類結果輸出。
本文不但在常見的分類模型上對網頁截屏圖像研究,還采用遷移學習的思想,通過微調ResNet-101和EfficientNet[16]預訓練模型進行研究,比較模型訓練參數和訓練的準確率。ResNet-101的核心思想來自于殘差網絡,殘差網絡由一系列殘差塊組成。一個殘差塊如圖5所示。

圖5 殘差塊
殘差塊分為直接映射和殘差部分。X是直接映射,反映在圖中曲線部分;F(x)是殘差部分,一般由兩個或者3個卷積操作構成,即圖中左側包含卷積操作的部分。
如圖6所示,采用遷移學習的思想,通過微調ResNet-101預訓練模型,訓練網頁圖像分類模型。在模型微調的過程中,嚴格遵守常見的做法,即凍結所有內部層的權重,只對預測文章網頁和列表網頁這兩個類的最終邏輯層進行再訓練。即去掉原ResNet-101后面的全局平均池化和全連接層,然后在模型后加入兩個全連接層,節點數分別為1024和2。Batch_size大小為16,epochs為30次,學習率為0.0002。采用Adam優化器,損失函數為交叉損失函數(categorical cross entropy),公式如下

圖6 遷移學習微調ResNet-101模型
(1)
其中,y為期望的輸出,a為神經元的實際輸出。
通過微調EfficientNet預訓練模型,在訓練過程中只訓練最后10層,并加入全局平均池化,將最后的節點數改為2,其它參數同ResNet-101模型。在學習率設置上,本文采用學習率隨epochs進行動態變化的方法,其計算公式分別如下
LR=(LRmax-LRst)/LRre*epoch+LRst
(2)
LR=(LRmax-LRst)*LRed**
(epoch-LRre-LRse)+LRmin
(3)
其中,LR代表不同的學習率, LRst=0.00001, 代表初始化學習率,LRmax=0.0004, 代表最大學習率,LRmin=0.00001, 代表最小學習率, LRre=15, 代表學習率上升過程的epochs個數, LRse=0, 代表學習率保持不變的epochs個數, LRed=0.8, 代表指數衰減因子。在前14個epoch采用式(2)設置學習率,第15個epoch學習率最大,在剩下的epoch中采用式(3)來設置。
解析:網頁正文信息抽取技術大多是在網頁解析的基礎上進行的,從DOM生成效率和遍歷HTML文檔中的節點兩個方面考慮,本文采用python中Pyquery庫對HTML進行解析和查找。
去噪:為了提高處理效率,減少噪音對正文抽取算法的影響,將源文件中的噪音數據清洗。經過對數據集的研究發現,在文章類型的網頁中,噪音數據包含腳本信息 , 樣式信息 [17], 鏈接信息多存在于 標簽中,導航欄信息 , 因為正文信息包含在body體中,頭部信息 也屬于噪音信息。在將原始html網頁利用Pyquery轉換為Dom后,直接刪除,見表1。

表1 文章類型網頁噪音及刪除
在列表類型網頁中,噪音信息大多為廣告鏈接信息,存在于 , 腳本信息 。 見表2。

表2 列表類型網頁噪音及刪除
網頁正文提取方法:根據網頁類型將其分為文章網頁和列表網頁,針對文章網頁,提出基于相同深度文本長度標準差的正文抽取算法。針對列表網頁,提出基于相同節點深度的同類名元素排序的抽取算法。以下對節點深度進行敘述:
元素節點深度經過解析后的html網頁如下:
自動化網頁正文抽取
HTML解析庫性能的比較
假定html標簽的元素根節點深度為1,依次標記每一個元素,得到每個元素在網頁中的元素節點深度,如圖7所示。

圖7 元素節點深度標記示例
算法1:文章網頁正文抽取算法
文章類型網頁的正文通常包含在一個網頁元素中,另一種情況是網頁正文信息分塊存在于多個連續的元素中,每個包含正文信息的元素塊代表正文的一個段落,其文本長度不一。對于第一種情況,通過比較網頁內容存在的元素和其同級別元素中文本的長度得到具有正文信息的元素。對于第二種情況,將文本長度大致相等的元素的父元素作為網頁正文信息抽取的節點。算法的偽代碼如下所示:
偽代碼:基于相同深度文本長度標準差的文章網頁正文抽取算法
輸入:element
輸出:text
(1)function ArticleExtract(element)
(2) childEle=element.allChild //查找每一個元素的子元素個數
(3) if childEle,length==0 then //如果子元素個數為0, 則返回該節點的父節點的文本
(4) return element.parent.text
(5) if childEle.length==1 then //如果子元素數量為1, 則遞歸查找子元素
(6) return ArticleExtract(childEle)
(7) m1,m2=getTwoMax(childEle) //得到子元素中最大的兩個子元素
(8) lm1=wordcount(m1.text) //求兩個子元素的文本長度
(9) lm2=wordcount(m2.text)
(10)stdDev=calcStdElv(childEle) //求所有子元素的文本長度標準差
(11) if(lm1-lm2)>stdDev then
(12) if(lm1-lm2)>100 then //如果lm1和lm2的差值小于100, 則輸出元素Element的文本
(13) if m1 before m2 then //如果m1元素位置靠前, 則輸出m1的文本
(14) return m1.text
(15) return m2.text0 //反之, 輸出m2的文本
(16) return element.text
(17)return ArticleExtract(m1) //如果lm1和lm2的差值小于文本長度標準差, 則繼續遞歸找子元素
算法2:列表網頁正文抽取算法
在列表網頁中,網頁的正文內容通常存在于深度級別相同的元素中,通常它們還擁有相同的類名,并且該元素無子節點,將深度級別相同并且類名也相同的元素作為一個衡量單元。而網頁正文信息所在的元素在網頁中文本長度可以作為一個特征來衡量該元素是否為正文的節點,因此通過對每一種元素節點所擁有的文本長度進行比較,就可以確定含有網頁正文信息的元素節點。因為在網頁中,類名的種類通常較多,如果對每一個類名都統計出現的深度、次數和文本長度,將需要較大的存儲空間開銷。因此,在實際的算法中,需要將統計的衡量單元限定在n=15。
列表網頁采用基于相同節點深度的同類名元素排序抽取算法,該算法通過對具有相同類名和深度級別的元素進行排序來識別正文內容,并且只抽取1種包含正文內容的元素。該算法的偽代碼如下:
偽代碼:基于相同節點深度的同類名元素排序的列表網頁抽取算法
輸入:element
輸出:text
(1) global variables
(2) idCount // IDs出現的次數
(3) idText//IDs中的文本
(4) end global variables
(5) function UpdateInfo(element,level)
(6) id=combine(level,element.className) //將類名和深度級別對應起來, 形成一個新的id
(7) idCount[id]=idCount[id]+1
(8) idText[id]=idText[id]+element.text
(9) function RetrieveEle(element,level)
(10) UpdateInfo(element,level)
(11) for child in element.child do
(12) UpdateInfo(child,level+1)
(13)function ListViewExtract(element,n) //主函數,element: HTML的第一個元素, n: 表示考慮的候選類的數量
(14) RetrieveEle(element,0) //遞歸迭代HTML中所有元素, 檢索每個類出現的次數和其文本
(15) idR=calaRScores(idCount,idText) // 統計每個id出現的次數和其文本長度
(16) topNId=getTop(idR,n) // 計算排序特征值R和平均文本長度TL, 并取前n個結果
(17) predicedId=getMaxTL(topNId) //獲取前n個結果中的第一個進行文本抽取
(18) return predicedId.text
根據ID的出現次數O和來自相應ID的文本長度L來計算排名分數R
(4)
根據上式計算出R值并用該值對ID進行排序,按照順序取前n個列表中每個ID的平均文本長度TL值
(5)
為了驗證本文提出方法的可行性,選擇網易、新浪、國家稅務總局、中國商務部、廣東省人民政府、中國科學院、新華網、中國網、人民網、鳳凰資訊、中國新聞網、知乎專欄、簡書、豆瓣影評、天涯論壇、百度貼吧等16個網站手動構造了圖像分類數據集和正文抽取數據集。
將TensorFlow花朵數據集中的雛菊和玫瑰數據作為驗證數據集來驗證分類模型。兩個數據集具體見表3和表4。

表3 網頁分類數據集

表4 花朵分類數據集
在驗證正文抽取算法時,選取910個網頁作為驗證集,其中文章類型520個,列表類型390個。
3.2.1 圖像分類實驗
研究不同圖像分類模型在網頁圖像數據集上的性能,得到準確率見表5。

表5 網頁圖像分類模型結果
從訓練參數和準確率考慮,截屏網頁圖像在最簡單的圖像分類模型LeNet-5上取得最優的性能。考慮截屏網頁圖像的特殊性,因此研究通用圖像數據集是否也會有類似的結果,利用花朵數據集在LeNet-5和預訓練模型ResNet-101以及EfficientNet模型上進行對比。其結果見表6。

表6 花朵數據集分類模型結果
從結果可以知道,因為截屏網頁圖像樣本的特殊性,該數據集在簡單圖像分類模型上的性能優于復雜網絡。而通用數據集,則在復雜圖像分類模型上的效果更好,因為復雜模型能更好提取特征,減少梯度消失等問題。
考慮到輸入圖像的大小,我們在花朵數據集上研究不同輸入大小在ResNet-101、LeNet-5和EfficientNet模型上的不同表現,結果如圖8所示。

圖8 不同模型不同輸入對比
在通用數據集上,將圖像輸入大小改變后,在復雜模型上改變輸入大小準確率有明顯提升,其中ResNet-101模型在測試集上的準確率提高1.8%。說明在將輸入大小變大后,模型提取特征效果優于之前。
將上述結果遷移到網頁截屏圖像,研究提高輸入圖像的大小對網頁截屏圖像是否有提升,在ResNet-101模型上進行對比實驗,得到結果如圖9所示。

圖9 不同輸入在ResNet-101模型上的結果
從對比結果來看,針對網頁截屏圖像,與圖像輸入大小為224*224相比,1366*1366在測試集上的表現更好,在第4個epoch上就已經達到100%的正確率,而明顯在30個epoch上1366*1366的結果優于224*224。這和普通數據集的結果一致,說明在增大輸入后,特征提取優于之前。
3.2.2 抽取模型實驗
采用查全率和查準率來表示抽取結果,其數學公式分別如下
(6)
(7)
其中,P表示查準率,R表示查全率。C1表示所有網頁的總數,C2表示所有網頁中提取正確的個數,C3表示正確網頁數中完全提取的網頁數。
為了驗證模型的可行性,計算模型抽取的內容和手工抽取的網頁正文內容是否一致,采用漢明距離計算文本相似度。規定漢明距離小于30為提取正確,漢明距離小于10為完全提取正確。
在框架抽取模塊,考慮以后隨著網頁分類復雜化和多種化,在對比各類模型后,從訓練參數和準確率方面考慮,選擇了ResNet-101模型作為截屏網頁圖像分類模型。ResNet-101在正文抽取框架中圖像分類的準確率為98.68%,其中文章類型準確率為100%,列表類型網頁準確率為96.92%。
將I-AWCE模型和Boilerpipe(https://code.google.com/p/boilerpipe)正文內容提取庫進行對比,評價指標采用查全率和查準率。Boilerpipe模型采用開源的python版本。表7和表8是兩個模型進行對比的結果。研究對比I-AWCE模型和Boilerpipe模型在兩種網頁上正文抽取的效果,在文章網頁數據上,I-AWCE模型在查準率和查全率上優于Boilerpipe模型;在列表網頁數據上,I-AWCE模型在查準率和查全率上達到95%以上。

表7 文章類型網頁正文抽取對比

表8 列表類型網頁正文抽取對比
本文提出一種基于圖像分類的自動化正文抽取模型,該模型利用卷積神經網絡對截屏網頁圖像進行類型判斷,并根據不同網頁類型分別改進多特征融合的統計學正文抽取模型,這兩種算法根據文本長度和節點深度兩種特征進行正文抽取,不依賴于大量數據集進行訓練。實驗結果表明,本文提出的I-AWCE模型可以滿足網頁自動化抽取的實際需要。
在針對截屏網頁圖像分類領域,對比各類圖像分類模型,結果顯示在LeNet-5模型上和預訓練模型上訓練時間和準確率優于其它模型;在通用數據集上,增大圖像特征輸入,在復雜模型上有提升效果,其中在ResNet-101模型上測試集準確率提高了1.8%。在網頁截屏圖像上,對比不同輸入大小,增大輸入后模型在測試集上的效果顯著提升。
隨著網頁不斷發展,網頁類型不局限于列表類型和文章類型并且網頁中其它非正文信息越來越多。因此在針對網頁圖像分類模塊,隨著網頁類型增多,加入圖像注意力機制可以適應網頁分類增多的情況。噪音數據太多會影響抽取結果,因此加入網頁分塊提取網頁正文可以減少噪音數據的影響。這兩點是以后工作研究的重點。