从爬取的文章 HTML 中提取出中文关键字
分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
附: 完整爬取各大著名技术站点的博客文章的源代码。
从爬取的文章 HTML 中提取出中文关键字相关推荐
- 爬取微信文章,用70行代码爬取了搜狗上666篇文章
因为再看崔庆才的教程,刚好看到爬取微信文章,所以就想着自己试试.打开搜狗发现,搜狗的微信文章页面网页布局有了变化(准确来说是简单了一点). 所以分析了一下,用了70行代码实现了爬取上面['搞笑', ' ...
- copy outerHTML、python爬取csdn文章、一键打包个人csdn文章保存到本地
文章目录 1copy outerHTML复制网站源码法 1.1复制源码 1.2 遇到的问题 2 python爬取CSDN博客文章(保存为html,txt,md) 2.1 安装依赖 2.2 完整代码 3 ...
- Python爬取了《雪中悍刀行》数据,数据可视化分析
Python爬取了<雪中悍刀行>数据,数据可视化分析 如何查找视频id 项目结构 制作词云图 制作最近评论数条形图与折线图 制作每小时评论条形图与折线图 制作最近评论数饼图 制作每小时评论 ...
- python贴吧爬虫-Python 爬虫练习: 爬取百度贴吧中的图片
背景:最近开始看一些Python爬虫相关的知识,就在网上找了一些简单已与练习的一些爬虫脚本 实现功能:1,读取用户想要爬取的贴吧 2,读取用户先要爬取某个贴吧的页数范围 3,爬取每个贴吧中用户输入的页 ...
- Python爬虫:输入公司名称,爬取企查查网站中的公司信息
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于Python爬虫数据分析挖掘 ,作者:李运辰 根据输入的公司名称来爬取企查查网 ...
- 案例:爬取豆瓣电影Top250中的电影信息
案例:爬取豆瓣电影Top250中的电影信息 豆瓣电影Top250首页 分析请求地址 在豆瓣电影Top250首页的底部可以确定电影信息一共有10页内容,每页25个电影信息,如下图: 切换页面,可以看到浏 ...
- 爬取腾讯新闻中省份疫情数据到Mysql数据库
爬取腾讯新闻中省份疫情数据到Mysql数据库 本人是一个中职学生,第一次发表自己所学到技术-- 本篇文章所用到的语言及工具等: python 3.8 pycharm Mysql Navicat Pre ...
- 教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇
文章目录 1:网络爬虫介绍 2:HttpClients类介绍 2.1 HttpGet参数问题 2.2 HttpPost参数问题 2.3 连接池技术问题 3:Jsoup介绍 4:动手实践如何抓取网页上数 ...
- Python爬取豆瓣Top250电影中2000年后上映的影片信息
Python爬取豆瓣Top250电影中2000年后上映的影片信息 前言 双十一前加在京东购物车的一个东西,价格330,Plus会员用券后差不多310.双十一当天打开看了下399,还得去抢满300减10 ...
最新文章
- python 3.5 3.6 3.7_选择 Python3.6 还是 Python 3.7
- jzoj6305-最小值【线段树,dp,双端链表】
- opencv 二值化_Python-OpenCV获取图像轮廓的图像处理方法
- 疫情与资本寒冬双重危机下,智领云为何能拿到数千万融资?
- .net byte转java byte_CVE20200688的武器化与.net反序列化漏洞那些事
- 避免unicode字符被截断的方法
- jenkins持续化集成中注意的3个小问题
- 空间变量php,PHP名称空间可以包含变量吗?
- 第三方支付易宝支付的具体实现
- linux gmac驱动分析,以太网驱动流程浅析(一)-ifconfig主要流程
- 物联网技术,主要应用在哪些领域?
- java上下载的ex表格打不开怎么回事_Java 下载 Excel文件打不开
- WP博客几款好看的图片类模板分享
- Hack The Box - Access Writeup
- 一键非自锁开关电路设计
- 虚拟机安装Ubuntu16.04.6
- c++windows openSSL编译(ActivePerl-5.28.msi+openssl-1.1.1k)
- 电源附近的电容的作用分析
- 计算机科学专业的五种高薪职业选择,看看你适合哪种?
- LATEX——两张图并列排列/双栏模板中图片通栏并列布局