创新实训(8)——博客文章的数据清洗

我想让团队成员帮我抽取了几千条的博客文章数据,存在临时的数据库中,然后我尝试着进行处理,等我真正的处理成功之后,在集成到正式的环境中,进行博客内容的抽取工作。

博客文章的清洗

抽取到的文章携带了大量的html标签,我们需要返回没有html标签的纯文本,所以需要进行数据的清洗
(1)第一次尝试,使用正则表达式提取相关标签中的信息
在这里插入图片描述
但是效果并不好,会提取到字标签中的内容,比如文章里有代码,p标签里就会携带code标签,发现很多文本里面携带了代码。
在这里插入图片描述
(2)想办法将代码剔除,使用正则表达式,可以将文本中的字母和特殊字符剔除掉,只保留下中文文本
但是会将文本中有意义的单词剔除掉,而且文本的标点符号会丧失,可读性大大的减少

   public static String htmlRemoveTag(String inputString) {
        if (inputString == null)
            return null;
        String htmlStr = inputString; // 含html标签的字符串
        String textStr = "";
        java.util.regex.Pattern p_script;
        java.util.regex.Matcher m_script;
        java.util.regex.Pattern p_style;
        java.util.regex.Matcher m_style;
        java.util.regex.Pattern p_html;
        java.util.regex.Matcher m_html;
        try {
            //定义script的正则表达式{或<script[^>]*?>[\\s\\S]*?<\\/script>
            String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>";
            //定义style的正则表达式{或<style[^>]*?>[\\s\\S]*?<\\/style>
            String regEx_style = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>";
            String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式
            p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
            m_script = p_script.matcher(htmlStr);
            htmlStr = m_script.replaceAll(""); // 过滤script标签
            p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
            m_style = p_style.matcher(htmlStr);
            htmlStr = m_style.replaceAll(""); // 过滤style标签
            p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
            m_html = p_html.matcher(htmlStr);
            htmlStr = m_html.replaceAll(""); // 过滤html标签
            textStr = htmlStr;
            String after = textStr.replaceAll("[a-zA-z0-9<>$&^*%\t\n: /=\"',.{}~()\0_]","");
            textStr = after;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return textStr;// 返回文本字符串
    }

在这里插入图片描述
(3)最后找到了java爬虫经常使用的Jsoup来解析html文档,他可以提取出所需要标签的内容,经过观察发现,有用的文本都在p标签和h标签中,是需要用jsoup进行解析,然后输出对应标签的内容即可。这样既不会丢失文本信息,也不会混杂入代码等无用信息,虽然可能其他标签中还有少量文字,如tr,table,li,但是主要的内容基本已经提取出来了。

public class GetCleanedContent {
    private Document document;
    private String html = "";

    public GetCleanedContent(String html) {
        this.html = html;
        document = Jsoup.parse(html);
    }


    private String getPs() {

        //获得所有p标签
        Elements links = document.getElementsByTag("p");

//实例化stringbuffer
        StringBuffer buffer = new StringBuffer();
        for (Element link : links) {

//将文本提前出来
            buffer.append(link.text().trim());
        }
        return buffer.toString().trim();

    }
    private String getHs() {


        Elements links = document.getElementsByTag("h1");
        StringBuffer buffer = new StringBuffer();
        for (Element link : links) {

            buffer.append(link.text().trim());
        }
         links = document.getElementsByTag("h2");
         buffer = new StringBuffer();
        for (Element link : links) {


            buffer.append(link.text().trim());
        }

        links = document.getElementsByTag("h3");
        buffer = new StringBuffer();
        for (Element link : links) {


            buffer.append(link.text().trim());
        }
        links = document.getElementsByTag("h4");
        buffer = new StringBuffer();
        for (Element link : links) {


            buffer.append(link.text().trim());
        }
        links = document.getElementsByTag("h5");
        buffer = new StringBuffer();
        for (Element link : links) {


            buffer.append(link.text().trim());
        }
        links = document.getElementsByTag("h6");
        buffer = new StringBuffer();
        for (Element link : links) {


            buffer.append(link.text().trim());
        }
        return buffer.toString().trim();

    }
    private String getTrs() {


        Elements links = document.getElementsByTag("tr");
        StringBuffer buffer = new StringBuffer();
        for (Element link : links) {

            buffer.append(link.text().trim());
        }

        return buffer.toString().trim();

    }
    private String getDivs() {


        Elements links = document.getElementsByTag("div");
        StringBuffer buffer = new StringBuffer();
        for (Element link : links) {

            buffer.append(link.text().trim());
        }

        return buffer.toString().trim();

    }
    private String getLis() {


        Elements links = document.getElementsByTag("li");
        StringBuffer buffer = new StringBuffer();
        for (Element link : links) {

            buffer.append(link.text().trim());
        }

        return buffer.toString().trim();

    }
    public String parse() {
        String result = "";
        result += getPs();
//        result +=getDivs();
        result +=getHs();
//        result+=getLis();
//        result +=getTrs();
        return result;
    }
}

在这里插入图片描述

博客摘要的抽取

昨天实现了textRank算法,今天在训练seq2seq的模型,先使用textrank生成一个摘要尝试一下,等模型训练好之后在尝试生成试摘要。
使用得是昨天实现的textrank算法,效果如下:
在这里插入图片描述
未完待续~ 还有最重要的博客标签和分类没有进行抽取。

猜你喜欢

转载自blog.csdn.net/baidu_41871794/article/details/106677005
今日推荐