推荐文章:任意网页正文内容主题词提取
优采云 发布时间: 2020-09-05 15:42任何网页正文内容主题词提取
前言
通过提取网页内容并进行文本分析,任意提取网页主体内容,即任意给出网页URL,进行主题抽取,得到网页内容的关键词作为网页标签。这些关键词和标记在流量分析内容建议中具有非常重要的意义。例如,如果我们进行数字营销并将页面用于用户流,我们可以知道什么吸引了用户以及用户的潜在需求是什么;此外,对于内容社区的用户画像/推荐系统,关键点也是文章 /页面的主题和标签。
此任务涉及的技术要点主要包括以下内容:
网络采集器。要分析网页的内容,必须首先根据URL提取网页的内容。文本提取。今天的网页非常复杂。除文本外,它们还收录许多广告,导航和信息流。我们需要消除干扰,仅提取网页文本。主题模型。获取正文后,您需要执行NLP提取主题关键字。网络爬虫
此处的Web采集器与常规采集器不同。它将简单得多。主要目的是获取原创网页的HTML。主要是为后续分析和挖掘打下基础。它属于数据采集的阶段。
在这里,我们使用Python的请求包。与Python随附的urllib相比,请求具有更用户友好的API和更好的鲁棒性。
import requests
r = request.get(url)
r.encoding='utf-8'
html = r.text
文本提取
通过研究已爬网的原创HTML,我们可以看到它非常负责和混乱,到处都是很多js代码,等等。我们首先需要解析HTML,尝试过滤出js代码,然后保留文本内容。
在这里,我们使用Python的BeautifulSoup软件包。该软件包被称为Python的伟大工件,并且解析HTML的效果非常好
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, features="html.parser")
for script in soup(["script", "style"]):
script.decompose()
text = soup.get_text()
我们想要的是网页的正文,而其他干扰内容,例如广告或导航栏,则需要尽可能地过滤掉。整个HTML的DOM树结构可以通过BeautifulSoup进行解析,但是每个网页的HTML编写方式不同,并且仅凭HTML解析就不能通用。因此,我们需要在HTML之外进行思考,并使用其他方法来提取网页的正文。一种非常优雅的方法是基于线块分布函数的算法cx提取器。
基于行块分布功能的常规网页正文提取:线性时间,无DOM树构造,与HTML标记无关
对于Web信息检索,网页正文提取是后续处理的关键。尽管正则表达式可以准确地以某种固定格式提取页面,但是面对各种HTML,使用规则来处理它是不可避免的。在大型网页中,是否可以高效,准确,通用地提取页面正文是与上层应用程序直接相关的难题。
作者提出了“基于行块分布函数的通用网页正文提取算法”,该算法首先将网页文本提取问题转化为页面的行块分布函数。此方法不需要构建Dom树,并且不会受到条件不佳的HTML的负担。 (实际上,它与HTML标签无关)。通过线性时间建立的线块分布函数图,可以直接,准确地定位网页文本。同时,统计和规则的组合被用来处理通用性问题。作者认为,简单的事情应该永远是解决这个永恒真理的最简单方法。整个算法实现代码少于100行。但是,根据法律,这一数额并不过分。
上图是从特定页面获得的线块分布函数曲线。该网页的文本区域是从145到182行,即分布函数图收录了价值最高且连续的区域。该区域通常收录膨胀点和下垂点。因此,提取网页文本的问题被转化为行动搜索。块分布函数上的凸点和凸点的两个边缘节点。在这里,我们使用此算法的Python实现GitHub-chrislinan / cx-extractor-python:
from CxExtractor import CxExtractor
cx = CxExtractor(threshold=40)
text = cx.getText(text)
texts = text.split('\n')
主题模型
获得网页主体的文本后,您需要提取主体关键词。有几种常见做法:
TFIDF文本排名LSI / LDA
我们首先采用TFIDF方法。
TFIDF(术语频率逆文档频率)是一种用于信息检索和数据挖掘的常用加权技术。词频(TF)=单词在文本中出现的次数/文本中单词的总数逆文档频率(IDF)= log(语料库中所有文档的总数/(收录单词的文档数量) + 1))我们传递TF(即文本中单词的频率)以增加主题中单词的权重,然后使用IDF值(即反向文档频率)来降低普通单词的主题权重。TF* IDF也得到我们想要关键字的权重。
要做TFIDF,第一步是分词。分词的效果取决于字典的结构,并且对后续关键词的提取产生巨大影响。首先,必须基于分析的行业主题建立专用词典,然后必须维护停用词词典。有了字典后,就可以使用Python分词工具jieba进行分词了。
import jieba
jieba.load_userdict('./dict.txt') #自定义词典
stopwords = set([line.strip() for line in open('stopwords.txt', 'r', encoding='utf-8').readlines()]) #停用词典
word_lists = []
for text in texts:
word_lists += (list(jieba.cut(text, cut_all=False)))
word_lists = [w for w in word_lists if not is_stop_word(w)]
分词完成后,我们可以计算TFIDF。可以通过特殊的机器学习包(例如gensim和scikit-learn)来完成。捷霸本身也提供此功能。在这里,我们直接使用解霸。
import jieba.analyse
keywords = jieba.analyse.extract_tags(' '.join(word_lists),
topK=20,
withWeight=True,
allowPOS=['n', 'ns', 'nr', 'nt', 'nz'])
请注意,存在一个参数allowPOS,该参数已通过词性过滤。需要根据实际业务需求进行设置。
词性标记(POS标记)是一种语料库语言学中的文本数据处理技术,可以根据词义的含义和上下文内容在词库中标记词的词性。常见注释示例:
n名词
nr人名
ns地名
nt组织
nz其他专有名称
形容词
v动词
服务
至此,我们的关键词提取结束了。为了方便其他学生使用,我们可以使用Flask制作一个静态的api,输入是URL,输出是提取的关键词并进行排序。
摘要
在此文章中,我们完成了从任何网页URL提取主体主题关键词的功能。在主题模型中,使用通用的TFIDF算法对其进行求解,并且可以将原型快速提供给业务端。将来,我们将继续优化并使用更多算法来进一步提高效果。