zoukankan      html  css  js  c++  java
  • 基于文本密度的新闻正文抽取方法之Python实现

    参考文章链接: http://www.cnblogs.com/jasondan/p/3497757.html 

            http://d.wanfangdata.com.cn/Patent/CN201410007832.6/

        

    基于网页分析构思出的正文提取算法

    回顾以上的网页分析,如果按照文本密度来找提取正文,那么就是写这么一个算法,能够从过滤html标签后的文本中找到正文文本的起止行号,行号之间的文本就是网页正文部分。

    还是从上面三个网页的分析结果看,他们都有这么一个特性:正文部分的文本密度要高出非正文部分很多。我们按照这个特性就可以很容易将算法实现,那就是基于阈(读音:yu)值去分析正文所在的位置。

    那么接下来就需要解决一些问题:

    • 如何确定阈值?
    • 如何分析,一行行的分析?还是?

    阈值的确定可以通过统计分析得出一个比较好的值,我在实际处理过程中,发现这个值取180是比较合适的,也就是分析文本的时候,如果所分析的文本超过了180,那么就可以认为到达了正文部分。

    再有就是如何分析的问题,这个其实比较容易确定,一行行的分析效果肯定不好,如果在按行分析的过程中往下在分析几行作为一次分析效果比较好。也就是一次性分析上5行左右,将字符累加起来,看看有没有达到设定的阈值,如果达到了,那么认为已经进入正文部分了。

    import re
    from bs4 import BeautifulSoup,Comment
    import requests
    
    authorset ={'责任编辑','作者'}
    
    def getcontentfromweb(src):
        obj = requests.get(src)
        return obj.text
    
    def filter_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
    
    def getcontent(lst,title,authorset):
        lstlen = [len(x) for x in lst]
        threshold=50
        startindex = 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 =['<p>'+x.strip()+'</p>' for x in lst[startindex:endindex+maxindex] if len(x.strip())>0]
        return content
    
    def run(url):
        ctthtml=getcontentfromweb(url)
        title,content =filter_tags(ctthtml)
        newcontent =getcontent(content,title,authorset)
        ctt =''.join(newcontent)
        return title,ctt
    http://www.aisir.cn/
  • 相关阅读:
    字符输入输出
    每日一例
    每日一例
    结构
    指针数组的初始化
    装箱,拆箱,正则表达式
    数据类型的转换
    怎样让程序不断执行
    SQL练习1关于插入删除,修改,单表查询
    SQLSERVER 总结1
  • 原文地址:https://www.cnblogs.com/aisir/p/6142323.html
Copyright © 2011-2022 走看看