基于機器學(xué)習(xí)的網(wǎng)頁抽取

由于最近在做一個項目,給了36個安全網(wǎng)站相關(guān)的博客網(wǎng)站,需要將其中的博客正文都抽取出來,而且需要滿足以后添加一個博客網(wǎng)站的鏈接,就可以自動完成正文的抽取工作。

以前寫過的爬蟲是正則或CSS選擇器(或xpath)的網(wǎng)頁抽取都基于屬于基于包裝器(wrapper)的網(wǎng)頁抽取,但是這類抽取算法有一個通病,對于不同結(jié)構(gòu)的網(wǎng)頁,要制定不同的抽取規(guī)則。如果一個安全態(tài)勢感知系統(tǒng)需要獲取1000個異構(gòu)網(wǎng)站的博客正文,就需要編寫并維護1000套抽取規(guī)則,這太惡心了,根本就是不想完成的任務(wù)。

從2000年左右就開始有人研究如何用機器學(xué)習(xí)的方法,讓程序在不需要人工制定規(guī)則的情況下從網(wǎng)頁中提取所需的信息。從目前的科研成果看,基于機器學(xué)習(xí)的網(wǎng)頁抽取的重心偏向于新聞網(wǎng)頁內(nèi)容自動抽取,即輸入一個新聞網(wǎng)頁,程序可以自動輸出新聞的標題、正文、時間等信息。新聞、博客、百科類網(wǎng)站包含的結(jié)構(gòu)化數(shù)據(jù)較為單一,基本都滿足{標題,時間,正文}這種結(jié)構(gòu),抽取目標很明確,機器學(xué)習(xí)算法也較好設(shè)計。

題外話:這種正文提取算法可以幫助提取安全博客網(wǎng)站的正文,但是一些電商、求職等類型的網(wǎng)頁中包含的結(jié)構(gòu)化數(shù)據(jù)非常復(fù)雜,有些還有嵌套,并沒有統(tǒng)一的抽取目標,針對這類頁面設(shè)計機器學(xué)習(xí)抽取算法難度較大。

下面主要描述如何設(shè)計機器學(xué)習(xí)算法抽取新聞、博客、百科等網(wǎng)站中的正文信息,后面簡稱為網(wǎng)頁正文抽取(Content Extraction)。

基于機器學(xué)習(xí)的網(wǎng)頁抽取算法大致可以分為以下幾類:

  • 基于啟發(fā)式規(guī)則和無監(jiān)督學(xué)習(xí)的網(wǎng)頁抽取算法
  • 基于分類器的網(wǎng)頁抽取算法
  • 基于網(wǎng)頁模板自動生成的網(wǎng)頁抽取算法

三類算法中,第一類算法是最好實現(xiàn)的,也是效果最好的。
下面簡單描述一下三類算法,如果你只是希望在工程中使用這些算法,只要了解第一類算法即可。
下面會提到一些論文,但請不要根據(jù)論文里自己的實驗數(shù)據(jù)來判斷算法的好壞,很多算法面向早期網(wǎng)頁設(shè)計(即以表格為框架的網(wǎng)頁),還有一些算法的實驗數(shù)據(jù)集覆蓋面較窄。有條件最好自己對這些算法進行評測。

1. 基于啟發(fā)式規(guī)則和無監(jiān)督學(xué)習(xí)的網(wǎng)頁抽取算法

基于啟發(fā)式規(guī)則和無監(jiān)督學(xué)習(xí)的網(wǎng)頁抽取算法(第一類算法)是目前最簡單,也是效果最好的方法。且其具有較高的通用性,即算法往往在不同語種、不同結(jié)構(gòu)的網(wǎng)頁上都有效。

早期的這類算法大多數(shù)沒有將網(wǎng)頁解析為DOM樹,而是將網(wǎng)頁解析為一個token序列,例如對于下面這段html源碼:

<body>
    <div>廣告...(8字)</div>
    <div class="main">正文...(500字)</div>
    <div class="foot">頁腳...(6字)</div>
</body>

程序?qū)⑵滢D(zhuǎn)換為token序列:

標簽(body),標簽(div),文本,文本....(8次),標簽(/div),標簽(div),文本,文本...(500次),標簽(/div),標簽(div),文本,文本...(6次),標簽(/div),標簽(/body)

早期有一種MSS算法(Maximum Subsequence Segmentation)以token序列為基礎(chǔ),算法有多個版本,其中一個版本為token序列中的每一個token賦予一個分數(shù),打分規(guī)則如下:

  • 一個標簽給 -3.25 分
  • 一個文本給 +1 分

根據(jù)打分規(guī)則和上面的token序列,我們可以獲取一個分數(shù)序列:

-3.25,-3.25,1,1,1...(8次),-3.25,-3.25,1,1,1...(500次),-3.25,-3.25,1,1,1...(6次),-3.25,-3.25
  • MSS算法
    MSS算法認為,找出token序列中的一個子序列,使得這個子序列中token對應(yīng)的分數(shù)總和達到最大,則這個子序列就是網(wǎng)頁中的正文。從另一個角度來理解這個規(guī)則,即從html源碼字符串中找出一個子序列,這個子序列應(yīng)該盡量包含較多的文本和較少的標簽,因為算法中給標簽賦予了絕對值較大的負分(-3.25),為文本賦予了較小的正分(1)。

如何從分數(shù)序列中找出總和最大的子序列可以用動態(tài)規(guī)劃很好地解決,這里就不給出詳細算法,有興趣可以參考《Extracting Article Text from the Web with Maximum Subsequence Segmentation》這篇論文,MSS算法的效果并不好,但本文認為它可以代表早期的很多算法。

  • MSS算法(樸素貝葉斯)
    MSS還有其他的版本,我們上面說算法給標簽和文本分別賦予-3.25和1分,這是固定值,還有一個版本的MSS(也在論文中)利用樸素貝葉斯的方法為標簽和文本計算分數(shù)。雖然這個版本的MSS效果有一定的提升,但仍不理想。

  • 利用聚類的方法
    無監(jiān)督學(xué)習(xí)在第一類算法中也起到重要作用。很多算法利用聚類的方法,將網(wǎng)頁的正文和非正文自動分為2類。例如在《CETR - Content Extraction via Tag Ratios》算法中,網(wǎng)頁被切分為多行文本,算法為每行文本計算2個特征,分別是下圖中的橫軸和縱軸,紅色橢圓中的單元(行),大多數(shù)是網(wǎng)頁正文,而綠色橢圓中包含的單元(行),大多數(shù)是非正文,使用k-means等聚類方法,就可以很好地將正文和非正文分為兩類,然后再設(shè)計一些啟發(fā)式算法,即可區(qū)分兩類中哪一類是正文,哪一類是非正文。

聚類
  • 使用DOM樹的Node作為特征計算的基本單元
    早期的算法往往將token序列、字符序列作為計算特征的單元,從某種意義來說,這破壞了網(wǎng)頁的結(jié)構(gòu),也沒有充分利用網(wǎng)頁的特征。在后來的算法中,很多使用DOM樹的Node作為特征計算的基本單元,例如《Web news extraction via path ratios》、《Dom based content extraction via text density》,這些算法仍然是利用啟發(fā)式規(guī)則和無監(jiān)督學(xué)習(xí),由于使用DOM樹的Node作為特征計算的基本單元,使得算法可以獲取到更好、更多的特征,因此可以設(shè)計更好的啟發(fā)式規(guī)則和無監(jiān)督學(xué)習(xí)算法,這些算法在抽取效果上,往往遠高于前面所述的算法。由于在抽取時使用DOM樹的Node作為單元,算法也可以較容易地保留正文的結(jié)構(gòu)(主要是為了保持網(wǎng)頁中正文的排版)。
    我們在WebCollector(1.12版本開始)中,實現(xiàn)了一種第一類算法,可以到官網(wǎng)直接下載源碼使用。

2. 基于分類器的網(wǎng)頁抽取算法(第二類機器學(xué)習(xí)抽取算法)

實現(xiàn)基于分類器的網(wǎng)頁抽取算法(第二類算法),大致流程如下:

  • 找?guī)浊€網(wǎng)頁作為訓(xùn)練集,對網(wǎng)頁的正文和非正文(即需要抽取和不需要抽取的部分)進行人工標注。
  • 設(shè)計特征。例如一些算法將DOM樹的標簽類型(div,p,body等)作為特征之一(當然這是一個不推薦使用的特征)。
  • 選擇合適的分類器,利用特征進行訓(xùn)練。

對于網(wǎng)頁抽取,特征的設(shè)計是第一位的,具體使用什么分類器有時候并不是那么重要。在使用相同特征的情況下,使用決策樹、SVM、神經(jīng)網(wǎng)絡(luò)等不同的分類器不一定對抽取效果造成太大的影響。

從工程的角度來說,流程中的第一步和第二步都是較為困難的。訓(xùn)練集的選擇也很有講究,要保證在選取的數(shù)據(jù)集中網(wǎng)頁結(jié)構(gòu)的多樣性。例如現(xiàn)在比較流行的正文結(jié)構(gòu)為:

<div>
    <p>xxxx</p>
    <p>xxxxxxxx</p>
    <span>xxx</span>
    <p>xxxxx</p>
    <p>xxxx</p>
</div>

2.1 eager learning

基于分類器的網(wǎng)頁抽取算法,算法通過訓(xùn)練集產(chǎn)生了模型(如決策樹模型、神經(jīng)網(wǎng)絡(luò)模型等)

如果訓(xùn)練集中只有五六個網(wǎng)站的頁面,很有可能這些網(wǎng)站的正文都是上面這種結(jié)構(gòu),而恰好在特征設(shè)計中,有兩個特征是:

  • 節(jié)點標簽類型(div,p,body等)
  • 孩子節(jié)點標簽類型頻數(shù)(即孩子節(jié)點中,div有幾個,p有幾個…)

假設(shè)使用決策樹作為分類器,最后的訓(xùn)練出的模型很可能是:

如果一個節(jié)點的標簽類型為div,且其孩子節(jié)點中標簽為p的節(jié)點超過3個,則這個節(jié)點對應(yīng)網(wǎng)頁的正文。

雖然這個模型在訓(xùn)練數(shù)據(jù)集上可以達到較好的抽取效果,但顯而易見,有很多網(wǎng)站不滿足這個規(guī)則。因此訓(xùn)練集的選擇,對抽取算法的效果有很大的影響。

網(wǎng)頁設(shè)計的風格一致在變,早期的網(wǎng)頁往往利用表格(table)構(gòu)建整個網(wǎng)頁的框架,現(xiàn)在的網(wǎng)頁喜歡用div構(gòu)建網(wǎng)頁的框架。如果希望抽取算法能夠覆蓋較長的時間段,在特征設(shè)計時,就要盡量選用那些不易變化的特征。標簽類型是一個很容易變化的特征,隨著網(wǎng)頁設(shè)計風格的變化而變化,因此前面提到,非常不建議使用標簽類型作為訓(xùn)練特征。

2.2 lazy learning

事先不通過訓(xùn)練集產(chǎn)生模型的算法,比較有名的KNN就是屬于lazy learning。

一些抽取算法借助KNN來選擇抽取算法,可能聽起來有些繞,這里解釋一下。假設(shè)有2種抽取算法A、B,有3個網(wǎng)站site1,site2,site3。2種算法在3個網(wǎng)站上的抽取效果(這里用0%-100%的一個數(shù)表示,越大說明越好)如下:

網(wǎng)站 A算法抽取效果 B算法抽取效果
site1 90% 70%
site2 80% 85%
site3 60% 87%

可以看出來,在site1上,A算法的抽取效果比B好,在site2和site3上,B算法的抽取效果較好。在實際中,這種情況很常見。所以有些人就希望設(shè)計一個分類器,這個分類器不是用來分類正文和非正文,而是用來幫助選擇抽取算法。例如在這個例子中,分類器在我們對site1中網(wǎng)頁進行抽取時,應(yīng)該告訴我們使用A算法可以獲得更好的效果。

舉個形象的例子,A算法在政府類網(wǎng)站上抽取效果較好,B算法在互聯(lián)網(wǎng)新聞網(wǎng)站上抽取效果較好。那么當我對政府類網(wǎng)站進行抽取時,分類器應(yīng)該幫我選擇A算法。

這個分類器的實現(xiàn),可以借助KNN算法。事先需要準備一個數(shù)據(jù)集,數(shù)據(jù)集中有多個站點的網(wǎng)頁,同時需要維護一張表,表中告訴我們在每個站點上,不同抽取算法的抽取效果(實際上只要知道在每個站點上,哪個算法抽取效果最好即可)。當遇到一個待抽取的網(wǎng)頁,我們將網(wǎng)頁和數(shù)據(jù)集中所有網(wǎng)頁對比(效率很低),找出最相似的K個網(wǎng)頁,然后看著K個網(wǎng)頁中,哪個站點的網(wǎng)頁最多(例如k=7,其中有6個網(wǎng)頁都是來自CSDN新聞),那么我們就選擇這個站點上效果最好的算法,對這個未知網(wǎng)頁進行抽取。

3. 基于網(wǎng)頁模板自動生成的網(wǎng)頁抽取算法

基于網(wǎng)頁模板自動生成的網(wǎng)頁抽取算法(第三類算法)有很多種。這里例舉一種。在《URL Tree: Efficient Unsupervised Content Extraction from Streams of Web Documents》中,用多個相同結(jié)構(gòu)頁面(通過URL判斷)的對比,找出其中異同,頁面間的共性的部分是非正文,頁面間差別較大的部分有可能是正文。這個很好理解,例如在一些網(wǎng)站中,所有的網(wǎng)頁頁腳都相同,都是備案信息或者版權(quán)申明之類的,這是頁面之間的共性,因此算法認為這部分是非正文。而不同網(wǎng)頁的正文往往是不同的,因此算法識別出正文頁較容易。這種算法往往并不是針對單個網(wǎng)頁作正文抽取,而是收集大量同構(gòu)網(wǎng)頁后,對多個網(wǎng)頁同時進行抽取。也就是說,并不是輸入一個網(wǎng)頁就可以實時進行抽取。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容