基於文字密度的新聞正文抽取方法之Python實現

2021-07-25 05:35:48 字數 2160 閱讀 1228



回顧以上的網頁分析,如果按照文字密度來找提取正文,那麼就是寫這麼乙個演算法,能夠從過濾html標籤後的文字中找到正文文字的起止行號,行號之間的文字就是網頁正文部分。

還是從上面三個網頁的分析結果看,他們都有這麼乙個特性:正文部分的文字密度要高出非正文部分很多。我們按照這個特性就可以很容易將演算法實現,那就是基於閾(讀音:yu)值去分析正文所在的位置。

那麼接下來就需要解決一些問題:

閾值的確定可以通過統計分析得出乙個比較好的值,我在實際處理過程中,發現這個值取180是比較合適的,也就是分析文字的時候,如果所分析的文字超過了180,那麼就可以認為到達了正文部分。

再有就是如何分析的問題,這個其實比較容易確定,一行行的分析效果肯定不好,如果在按行分析的過程中往下在分析幾行作為一次分析效果比較好。也就是一次性分析上5行左右,將字元累加起來,看看有沒有達到設定的閾值,如果達到了,那麼認為已經進入正文部分了。

import

refrom bs4 import

beautifulsoup,comment

import

requests

authorset =

defgetcontentfromweb(src):

obj =requests.get(src)

return

obj.text

deffilter_tags(html_str):

soup =beautifulsoup(html_str)

title =soup.title.string.encode().decode('

utf-8')

[script.extract()

for script in soup.findall('

script')]

[style.extract()

for style in soup.findall('

style')]

comments = soup.findall(text=lambda

text: isinstance(text, comment))

[comment.extract()

for comment in

comments]

reg1 = re.compile("

<[^>]*>")

content = reg1.sub('', soup.prettify()).split('\n'

)

return

title,content

defgetcontent(lst,title,authorset):

lstlen = [len(x) for x in

lst]

threshold=50startindex =0

maxindex =lstlen.index(max(lstlen))

endindex =0

for i,v in enumerate(lstlen[:maxindex-3]):

if v> threshold and lstlen[i+1]>5 and lstlen[i+2]>5 and lstlen[i+3]>5:

startindex =i

break

for i,v in

enumerate(lstlen[maxindex:]):

if v< threshold and lstlen[maxindex+i+1]<10 and lstlen[maxindex+i+2]<10 and lstlen[maxindex+i+3]<10:

endindex =i

break

content =['

'+x.strip()+'

'for x in lst[startindex:endindex+maxindex] if len(x.strip())>0]

return

content

defrun(url):

ctthtml=getcontentfromweb(url)

title,content =filter_tags(ctthtml)

newcontent =getcontent(content,title,authorset)

ctt =''

.join(newcontent)

return title,ctt

基於文字密度的新聞正文抽取方法之Python實現

回顧以上的網頁分析,如果按照文字密度來找提取正文,那麼就是寫這麼乙個演算法,能夠從過濾html標籤後的文字中找到正文文字的起止行號,行號之間的文字就是網頁正文部分。還是從上面三個網頁的分析結果看,他們都有這麼乙個特性 正文部分的文字密度要高出非正文部分很多。我們按照這個特性就可以很容易將演算法實現,...

基於行塊分布函式的正文抽取

的正文抽取演算法思路 1 預處理 剔除網頁html標籤,去掉所有的空白符 n,r,t等 2 依據 n 分行,若某文字行的上下存在兩個空行,且此文本行長度小於閾值40,則刪除此文本行 3 設定三行為一行塊,計算每段行塊的長度 4 找出每個連續有字元的段落,並找到起點和終點 要求 行塊長度大於0 段落開...

基於行塊分布函式的通用網頁正文抽取

基於行塊分布函式的通用網頁正文抽取 線性時間 不建dom樹 與html標籤無關 對於web資訊檢索來說,網頁正文抽取是後續處理的關鍵。雖然使用正規表示式可以準確的抽取某一固定格式的頁面,但面對形形色色的html,使用規則處理難免捉襟見肘。能不能高效 準確的將乙個頁面的正文抽取出來,並做到在大規模網頁...