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

由于最近在做一個(gè)項(xiàng)目关面,給了36個(gè)安全網(wǎng)站相關(guān)的博客網(wǎng)站演怎,需要將其中的博客正文都抽取出來大诸,而且需要滿足以后添加一個(gè)博客網(wǎng)站的鏈接捅厂,就可以自動(dòng)完成正文的抽取工作贯卦。

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

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

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

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

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

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

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

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)頁解析為一個(gè)token序列,例如對(duì)于下面這段html源碼:

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

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

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

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

  • 一個(gè)標(biāo)簽給 -3.25 分
  • 一個(gè)文本給 +1 分

根據(jù)打分規(guī)則和上面的token序列笙什,我們可以獲取一個(gè)分?jǐn)?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算法認(rèn)為飘哨,找出token序列中的一個(gè)子序列,使得這個(gè)子序列中token對(duì)應(yīng)的分?jǐn)?shù)總和達(dá)到最大琐凭,則這個(gè)子序列就是網(wǎng)頁中的正文芽隆。從另一個(gè)角度來理解這個(gè)規(guī)則,即從html源碼字符串中找出一個(gè)子序列统屈,這個(gè)子序列應(yīng)該盡量包含較多的文本和較少的標(biāo)簽胚吁,因?yàn)樗惴ㄖ薪o標(biāo)簽賦予了絕對(duì)值較大的負(fù)分(-3.25),為文本賦予了較小的正分(1)愁憔。

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

  • MSS算法(樸素貝葉斯)
    MSS還有其他的版本思犁,我們上面說算法給標(biāo)簽和文本分別賦予-3.25和1分代虾,這是固定值,還有一個(gè)版本的MSS(也在論文中)利用樸素貝葉斯的方法為標(biāo)簽和文本計(jì)算分?jǐn)?shù)激蹲。雖然這個(gè)版本的MSS效果有一定的提升棉磨,但仍不理想。

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

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

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

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

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

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

從工程的角度來說,流程中的第一步和第二步都是較為困難的号俐。訓(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)練集中只有五六個(gè)網(wǎng)站的頁面,很有可能這些網(wǎng)站的正文都是上面這種結(jié)構(gòu)猪落,而恰好在特征設(shè)計(jì)中贞远,有兩個(gè)特征是:

  • 節(jié)點(diǎn)標(biāo)簽類型(div,p,body等)
  • 孩子節(jié)點(diǎn)標(biāo)簽類型頻數(shù)(即孩子節(jié)點(diǎn)中,div有幾個(gè)笨忌,p有幾個(gè)…)

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

如果一個(gè)節(jié)點(diǎn)的標(biāo)簽類型為div,且其孩子節(jié)點(diǎn)中標(biāo)簽為p的節(jié)點(diǎn)超過3個(gè)官疲,則這個(gè)節(jié)點(diǎn)對(duì)應(yīng)網(wǎng)頁的正文袱结。

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

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

2.2 lazy learning

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

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

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

可以看出來垦写,在site1上,A算法的抽取效果比B好彰触,在site2和site3上梯投,B算法的抽取效果較好。在實(shí)際中况毅,這種情況很常見分蓖。所以有些人就希望設(shè)計(jì)一個(gè)分類器,這個(gè)分類器不是用來分類正文和非正文尔许,而是用來幫助選擇抽取算法么鹤。例如在這個(gè)例子中,分類器在我們對(duì)site1中網(wǎng)頁進(jìn)行抽取時(shí)味廊,應(yīng)該告訴我們使用A算法可以獲得更好的效果蒸甜。

舉個(gè)形象的例子,A算法在政府類網(wǎng)站上抽取效果較好余佛,B算法在互聯(lián)網(wǎng)新聞網(wǎng)站上抽取效果較好柠新。那么當(dāng)我對(duì)政府類網(wǎng)站進(jìn)行抽取時(shí),分類器應(yīng)該幫我選擇A算法辉巡。

這個(gè)分類器的實(shí)現(xiàn)登颓,可以借助KNN算法。事先需要準(zhǔn)備一個(gè)數(shù)據(jù)集红氯,數(shù)據(jù)集中有多個(gè)站點(diǎn)的網(wǎng)頁,同時(shí)需要維護(hù)一張表咕痛,表中告訴我們?cè)诿總€(gè)站點(diǎn)上痢甘,不同抽取算法的抽取效果(實(shí)際上只要知道在每個(gè)站點(diǎn)上,哪個(gè)算法抽取效果最好即可)茉贡。當(dāng)遇到一個(gè)待抽取的網(wǎng)頁塞栅,我們將網(wǎng)頁和數(shù)據(jù)集中所有網(wǎng)頁對(duì)比(效率很低),找出最相似的K個(gè)網(wǎng)頁腔丧,然后看著K個(gè)網(wǎng)頁中放椰,哪個(gè)站點(diǎn)的網(wǎng)頁最多(例如k=7,其中有6個(gè)網(wǎng)頁都是來自CSDN新聞),那么我們就選擇這個(gè)站點(diǎn)上效果最好的算法作烟,對(duì)這個(gè)未知網(wǎng)頁進(jìn)行抽取。

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

基于網(wǎng)頁模板自動(dòng)生成的網(wǎng)頁抽取算法(第三類算法)有很多種砾医。這里例舉一種拿撩。在《URL Tree: Efficient Unsupervised Content Extraction from Streams of Web Documents》中,用多個(gè)相同結(jié)構(gòu)頁面(通過URL判斷)的對(duì)比如蚜,找出其中異同压恒,頁面間的共性的部分是非正文,頁面間差別較大的部分有可能是正文错邦。這個(gè)很好理解探赫,例如在一些網(wǎng)站中,所有的網(wǎng)頁頁腳都相同撬呢,都是備案信息或者版權(quán)申明之類的伦吠,這是頁面之間的共性,因此算法認(rèn)為這部分是非正文魂拦。而不同網(wǎng)頁的正文往往是不同的毛仪,因此算法識(shí)別出正文頁較容易。這種算法往往并不是針對(duì)單個(gè)網(wǎng)頁作正文抽取晨另,而是收集大量同構(gòu)網(wǎng)頁后潭千,對(duì)多個(gè)網(wǎng)頁同時(shí)進(jìn)行抽取。也就是說借尿,并不是輸入一個(gè)網(wǎng)頁就可以實(shí)時(shí)進(jìn)行抽取刨晴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市路翻,隨后出現(xiàn)的幾起案子狈癞,更是在濱河造成了極大的恐慌,老刑警劉巖茂契,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝶桶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡掉冶,警方通過查閱死者的電腦和手機(jī)真竖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厌小,“玉大人恢共,你說我怎么就攤上這事¤笛牵” “怎么了讨韭?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我透硝,道長狰闪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任濒生,我火速辦了婚禮埋泵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甜攀。我一直安慰自己秋泄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布规阀。 她就那樣靜靜地躺著恒序,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谁撼。 梳的紋絲不亂的頭發(fā)上歧胁,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音厉碟,去河邊找鬼喊巍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛箍鼓,可吹牛的內(nèi)容都是我干的崭参。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼款咖,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼何暮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起铐殃,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤海洼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后富腊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坏逢,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年赘被,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了是整。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡民假,死狀恐怖贰盗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布秽晚,位于F島的核電站筒愚,受9級(jí)特大地震影響赴蝇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜巢掺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陆淀。 院中可真熱鬧,春花似錦轧苫、人聲如沸楚堤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽身冬。三九已至岔乔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雏门,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工搅幅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呼胚,地道東北人茄唐。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓沪编,卻偏偏與公主長得像年扩,于是被迫代替她去往敵國和親蚁廓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厨幻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容