如何做到任意网页页面进行关键词抓取呢?(图)

优采云 发布时间: 2021-08-02 23:12

  

如何做到任意网页页面进行关键词抓取呢?(图)

  

  一般来说,一段文字需要使用NLP技术进行关键词爬取是很常见的。但是如何在任何网页上进行关键词 抓取?

  前言

  网页正文内容的主题抽取,即任意给出一个网页url,通过抓取网页内容和文字分析,得到网页内容的关键词作为网页的标签。这些关键词 和标签对于流量分析和内容推荐非常重要。比如我们做数字营销,用页面做用户流,我们可以知道什么在吸引用户,用户的潜在需求是什么;另外,对于内容社区的用户画像/推荐系统,重点也是文章/页面的主题和标签。

  本次任务涉及的技术要点主要有以下几点:

  1.网络爬虫。要分析网页的内容,首先必须根据网址提取网页的内容。 2.文本提取。今天的网页非常复杂。除了文字,它们还收录大量的广告、导航、信息流等,我们需要去除干扰,只提取网页的文字。 3.主题模型。得到正文后,需要做NLP提取主题关键词。

  网络爬虫

  这里的网络爬虫和一般的爬虫不一样。会简单很多。主要是抓取原创网页的HTML。主要是为后续的分析挖掘打下基础。属于数据采集阶段。这里我们使用 Python 的 requests 包。与 Python 自带的 urllib 相比,requests 具有更人性化的 API 和更好的健壮性。

  import requestsr = request.get(url)r.encoding="utf-8"html = r.text

  文本提取

  通过研究爬下来的原创HTML,可以看出它非常负责和凌乱,充斥着大量的js代码等。我们首先需要解析HTML,尝试过滤掉js代码,然后离开文本内容。这里我们使用 Python 的 BeautifulSoup 包。这个包堪称Python的一大神器,解析HTML的效果非常好

  from bs4 import BeautifulSoupsoup = BeautifulSoup(html, features="html.parser")for script in soup(["script", "style"]): script.decompose()text = soup.get_text()

  我们要的是网页的正文内容,其他干扰内容如广告、导航栏等需要尽量过滤掉。整个HTML的DOM树结构都可以通过BeautifulSoup来解析,但是每个网页的HTML写法都不一样,单靠HTML解析是不可能做到通用的。因此,我们需要跳出HTML思维,使用其他方法来提取网页正文。这里一个非常优雅的方法是“基于行块分布函数”的 cx-extractor 算法。

  基于行块分布函数的一般网页文本提取:线性时间,无DOM树,与HTML标签无关。对于网络信息检索,网页文本提取是后续处理的关键。虽然使用正则表达式可以准确地提取出某种固定格式的页面,但是面对各种HTML,使用规则来处理是不可避免的。能否高效准确地提取出页面主体并普遍应用于*敏*感*词*网页,是一个直接关系到上层应用的难题。作者[1]提出了“基于行块分布函数的通用网页文本提取算法”[2],首先将网页文本提取问题转化为页面的行块分布函数。这种方法不需要建立Dom树,也不是病态的。厌倦了 HTML(其实和 HTML 标签无关)。通过线性时间建立的线块分布函数图,可以直接准确定位网页正文。同时采用统计和规则相结合的方法来处理通用性问题。笔者认为,简单的事情,总应该用最简单的方法解决。整个算法实现代码不到一百行。但是数量不能太多,是有规律的。

  

  上图是在某个页面上得到的线块分布函数曲线。网页的文本区域从145到182行,即分布函数图收录最有价值且连续的区域。这个区域通常收录一个膨胀点和一个下垂点。因此,提取网页文本的问题转化为搜索动作。块分布函数上的膨胀点和凹陷点的两个边缘节点。这里我们使用这个算法的 Python 实现。 GitHub-chrislinan/cx-extractor-python: 基于行块分布函数的通用网页文本提取算法Python版的实现,增加了英文支持/网页内容提取算法,支持中英文[3]

  from CxExtractor import CxExtractorcx = CxExtractor(threshold=40)text = cx.getText(text)texts = text.split("\n")

  主题模型

  获得网页正文内容的文本后,需要提取正文主题关键词。有 3 种常见做法:

  1.TFIDF2.Text-Rank3.LSI/LDA 这里我们首先采用TFIDF方法。

  TFIDF(词频逆文档频率)是一种常用的信息检索和数据挖掘加权技术。词频(TF)=一个词在文本中出现的次数/文本中的总词数 逆文档频率(IDF)=log(语料库中所有文档的总数/(收录一个词的文档数) +1)) 我们通过TF,即文本中某个词的频率,来增加该词在主题中的权重,然后我们使用IDF值,即反向文档频率来降低常用词的主题权重。TF*IDF也得到我们想要的主题词的权重。

  要做TFIDF,第一步就是分词。分词的效果取决于词典的构建,对后续的关键词抽取影响巨大。首先,必须根据所分析的行业主题建立一个专用词典,然后必须维护一个停用词词典。 、 有了字典,我们就可以使用Python分词神器jieba进行分词处理了。

  import jiebajieba.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.analysekeywords = jieba.analyse.extract_tags(" ".join(word_lists), topK=20, withWeight=True, allowPOS=["n", "ns", "nr", "nt", "nz"])

  注意有一个参数allowPOS,是通过词性过滤的。这个需要根据实际业务需要设置。

  词性标注(词性标注)是语料库语言学中的一种文本数据处理技术,它根据词的含义和上下文内容标记语料库中单词的词性。常用标注示例: n 名词 nr 人名 ns 地名 nt 组织组 nz 其他专有名词 a 形容词 v 动词

  服务

  到此,我们的关键词 提取结束。为了方便其他同学使用,我们可以用Flask做一个restful api,输入是URL,输出是提取出来的关键词并排序。

  总结

  在这个文章中,我们已经完成了从任意网页URL中提取正文主体关键词的功能。在主题模型中,采用常见的TFIDF算法进行求解,可以快速提供原型供业务端使用。未来我们会继续优化,使用更多的算法来进一步提升效果。

  参考资料

  [1]作者:[2]《基于行块分布函数的通用网页文本提取算法》:%E5%9F%BA%E4%BA%8E%E8%A1%8C%E5%9D%97 % E5%88%86%E5%B8%83%E5%87%BD%E6%95%B0%E7%9A%84%E9%80%9A%E7%94%A8%E7%BD%91%E9 % A1%B5%E6%AD%A3%E6%96%87%E6%8A%BD%E5%8F%96%E7%AE%97%E6%B3%95.pdf[3]GitHub-chrislinan /cx-extractor-python:基于行块分布函数的通用网页文本提取算法Python版的实现,增加了英文支持/网页内容提取算法,支持中英文:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线