从爬取的文章 HTML 中提取出中文关键字

简介: 分2步。1.从 HTML 中提取出纯文本(去掉标签)import org.htmlparser.NodeFilter;import org.htmlparser.

分2步。

1.从 HTML 中提取出纯文本(去掉标签)

import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.beans.StringBean;
import org.htmlparser.filters.CssSelectorNodeFilter;
import org.htmlparser.util.NodeList;

public class HtmlUtil {

    public static String getText(String html, String id) {
        try {
            Parser parser = new Parser(html);
            NodeFilter filter = new CssSelectorNodeFilter("#" + id);
            NodeList nList = parser.extractAllNodesThatMatch(filter);
            return nList == null || nList.size() == 0 ? null : nList.elementAt(
                    0).toPlainTextString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static String getTextByClass(String html, String css_class) {
        try {
            Parser parser = new Parser(html);
            NodeFilter filter = new CssSelectorNodeFilter("." + css_class);
            NodeList nList = parser.extractAllNodesThatMatch(filter);
            return nList == null || nList.size() == 0 ? null : nList.elementAt(
                    0).toPlainTextString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 获取网页中纯文本信息
     *
     * @param html
     * @return
     * @throws Exception
     * @throws Exception
     */
    public static String getText(String html) throws Exception {
        StringBean bean = new StringBean();
        bean.setLinks(false);
        bean.setReplaceNonBreakingSpaces(true);
        bean.setCollapse(true);

        // 返回解析后的网页纯文本信息
        Parser parser = Parser.createParser(html, "utf-8");
        parser.visitAllNodesWith(bean);
        parser.reset();
        String text = bean.getStrings();
        String reg = "[^\u4e00-\u9fa5]";
        text = text.replaceAll(reg, " ");
        return text;
    }
}

2.从纯文本中提取出中文关键字(TextRank关键词提取)

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.dictionary.stopword.CoreStopWordDictionary;
import com.hankcs.hanlp.seg.common.Term;

import java.util.*;
import java.util.stream.Collectors;

/**
 * TextRank关键词提取
 *
 * @author hankcs
 */
public class TextRankKeyword {
    public static final int MAX_KEY_WORDS = 7;
    /**
     * 阻尼系数(DampingFactor),一般取值为0.85
     */
    static final float d = 0.618f;
    /**
     * 最大迭代次数
     */
    static final int max_iter = 2000;
    static final float min_diff = 0.001f;

    public TextRankKeyword() {
        // jdk bug : Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
        System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
    }


    public String getKeyword(String title, String content) {
        List<Term> termList = HanLP.segment(title + content);
        List<String> wordList = new ArrayList<String>();
        for (Term t : termList) {
            if (shouldInclude(t)) {
                wordList.add(t.word);
            }
        }
        Map<String, Set<String>> words = new HashMap<String, Set<String>>();
        Queue<String> que = new LinkedList<String>();
        for (String w : wordList) {
            if (!words.containsKey(w)) {
                words.put(w, new HashSet<String>());
            }
            que.offer(w);
            if (que.size() > 5) {
                que.poll();
            }

            for (String w1 : que) {
                for (String w2 : que) {
                    if (w1.equals(w2)) {
                        continue;
                    }

                    words.get(w1).add(w2);
                    words.get(w2).add(w1);
                }
            }
        }
        Map<String, Float> score = new HashMap<String, Float>();
        for (int i = 0; i < max_iter; ++i) {
            Map<String, Float> m = new HashMap<String, Float>();
            float max_diff = 0;
            for (Map.Entry<String, Set<String>> entry : words.entrySet()) {
                String key = entry.getKey();
                Set<String> value = entry.getValue();
                m.put(key, 1 - d);
                for (String other : value) {
                    int size = words.get(other).size();
                    if (key.equals(other) || size == 0) continue;
                    m.put(key, m.get(key) + d / size * (score.get(other) == null ? 0 : score.get(other)));
                }
                max_diff = Math.max(max_diff, Math.abs(m.get(key) - (score.get(key) == null ? 0 : score.get(key))));
            }
            score = m;
            if (max_diff <= min_diff) break;
        }
        List<Map.Entry<String, Float>> entryList = new ArrayList<Map.Entry<String, Float>>(score.entrySet());
        Collections.sort(entryList, (o1, o2) -> (o1.getValue() - o2.getValue() > 0 ? -1 : 1));

        List<Map.Entry<String, Float>> list = entryList.stream().filter(w -> w.getKey().length() > 1).collect(Collectors.toList());
        String result = "";
        int nKeyword = MAX_KEY_WORDS > list.size() ? list.size() : MAX_KEY_WORDS;
        for (int i = 0; i < nKeyword; ++i) {
            result += list.get(i).getKey() + ';';
        }
        System.out.println(result);
        return result;
    }

    /**
     * 是否应当将这个term纳入计算,词性属于名词、动词、副词、形容词
     *
     * @param term
     * @return 是否应当
     */
    public boolean shouldInclude(Term term) {
        return CoreStopWordDictionary.shouldInclude(term);
    }
}

完整工程源代码:

https://github.com/KotlinSpringBoot/saber

附: 完整爬取各大著名技术站点的博客文章的源代码。

相关文章
|
7月前
|
关系型数据库 MySQL
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
|
4月前
|
存储 移动开发 前端开发
HTML5时代来临,这些新特性你掌握了吗?一篇文章带你玩转Web前端技术潮流!
【8月更文挑战第26天】HTML5(简称H5)作为新一代Web标准,相比HTML4带来了诸多增强功能。
65 2
|
移动开发 JavaScript 前端开发
jsoup爬取HTML数据
jsoup是一个用于处理真实世界HTML的Java库。它提供了一个非常方便的API,用于获取URL、提取和操作数据,使用最好的HTML5 DOM方法和CSS选择器。
75 0
jsoup爬取HTML数据
|
7月前
|
JavaScript Java 测试技术
基于springboot+vue.js的基于HTML5的问卷调查系统附带文章和源代码设计说明文档ppt
基于springboot+vue.js的基于HTML5的问卷调查系统附带文章和源代码设计说明文档ppt
54 0
|
7月前
|
前端开发 JavaScript Java
HTML技术文章
HTML技术文章
|
7月前
|
移动开发 JavaScript 前端开发
APP的HTML5页面经过运营商网络被植入手机管家问题及分析,解决方案见新文章
APP的HTML5页面经过运营商网络被植入手机管家问题及分析,解决方案见新文章
61 0
|
7月前
|
JavaScript 前端开发 编译器
编程笔记 html5&css&js 077 Javascript 关键字
编程笔记 html5&css&js 077 Javascript 关键字
|
数据采集 监控 JavaScript
巧用简单工具:PHP使用simple_html_dom库助你轻松爬取JD.com
本文将介绍如何使用PHP语言和一个简单的第三方库simple_html_dom来爬取JD.com的商品信息。simple_html_dom是一个轻量级的HTML解析器,它可以方便地从HTML文档中提取元素和属性,而无需使用正则表达式或DOM操作。本文将通过一个实例来展示如何使用simple_html_dom库来爬取JD.com的商品名称、价格、评分和评论数,并将结果保存到CSV文件中。本文还将介绍如何使用代理IP技术来避免被目标网站封禁或限制。
巧用简单工具:PHP使用simple_html_dom库助你轻松爬取JD.com
|
7月前
|
前端开发 JavaScript 网络安全
【网络安全XSS必知 | 前端开发基础】一篇文章速学 HTML
【网络安全XSS必知 | 前端开发基础】一篇文章速学 HTML
96 0
|
JavaScript
vue使用v-html实现一段字符串中关键字(词)高亮效果
vue使用v-html实现一段字符串中关键字(词)高亮效果
249 0