关键词提取和文本摘要算法TextRank详解及实战
写在前面
最近一直没有更新文章,实在惭愧。伴随着小老弟的职业方向由风控转向了NLP,后面的文章也会集中在NLP领域,希望大家能够继续支持~
导读
本文围绕原理和特点介绍了关键词提取和文本摘要算法TextRank,并给出了实现代码和算法效果。
TextRank主要有关键词提取和文本摘要两个功能,在Jieba分词里也有集成,在介绍TextRank的原理之前,必须介绍下PageRank,理解了PageRank,也就理解了TextRank的精髓。
PageRank
PageRank算法用于解决互联网网页的价值排序问题,对于某个关键词的搜索,往往会有很多网页与之相关,如何对这些网站进行排序然后返回给用户最有”价值“的网站?最直观的,对每个网页进行“打分”,而打分标准至关重要。
从公式中可以看到这是一个迭代公式,所以存在“先有鸡还是先有蛋”的问题,对于这个问题,解决办法是给每一个节点一个初始值,一般是1/N,N即N个网页。
小老弟就不挨着算了,可以看到这样计算是非常麻烦的,同时对于这5个网页之间的关系表示,也非常麻烦,很不优雅,很不数学,所以就要引入一个新的概念-邻接矩阵(Adjacency Matrix)。
首先介绍一个词:图(Graph)。做知识图谱的肯定很了解它,当然,随着相关理论的发展,图论越来越多的出现在了机器学习和深度学习的各个领域,并且取得了很好的效果。
这里就进行简单的介绍,所谓“图”,由节点(node)和边(edge)构成,在这里,节点就是网页,两网页间是否存在边则由两网页是否存在超链接决定。
前面的图中,可以认为是A-E 5个网页构成的图,节点与节点之间存在着边,图中存在箭头,此时的图称为“有向图”。
B到C的箭头表示B网页有到C网页的链接,而A、B之间的箭头表示A、B网页之间相互链接。
此外,虽然前面说W矩阵是概率转移矩阵,但它并不真正满足概率转移矩阵的定义:
矩阵各元素都是非负的,并且各行(列)元素之和等于1,在一定条件下是互相转移的。
同时,求S的过程,实际是一个马尔科夫收敛过程,而马尔科夫收敛,也需要满足一定的条件,首先必须满足转移矩阵的定义,其次转移矩阵不可约,且非周期。转移矩阵不可约指的是每一个状态都可来自任意的其它状态,也就是任意两个网页都可以通过若干中间网页链接。周期指的是存在一个最小的正整数 k,使得从某状态 i 出发又回到状态 i 的所有路径的长度都是 k 的整数倍,也就是DeadEnds问题,这里由于d的存在,也使得非周期性得到满足。
关键词提取任务
在这个任务中,词就是Graph中的节点,而词与词之间的边,则利用“共现”关系来确定。所谓“共现”,就是共同出现,即在一个给定大小的滑动窗口内的词,认为是共同出现的,而这些单词间也就存在着边,举例:
“淡黄的长裙,蓬松的头发
牵着我的手看最新展出的油画”
分词后:
淡黄 长裙 蓬松 头发
牵 我 手 看 最新 展出 油画
给定窗口为2,依次滑动:
淡黄 长裙
长裙 蓬松
蓬松 头发
牵 我
我 手
。。。
不难发现,相对于PageRank里的无权有向图,这里建立的是无权无向图,原论文中对于关键词提取任务主要也是构建的无向无权图,对于有向图,论文提到是基于词的前后顺序角度去考虑,即给定窗口,比如对于“长裙”来说,“淡黄”与它之间是入边,而“蓬松”与它之间是出边,但是效果都要比无向图差。
文本摘要任务
当然,也可以使用其他相似度计算方法,比如在有的改进的TextRank方法中,会使用余弦相似度,即先把两个句子分词,词向量化后,利用词向量加和求平均的方式计算句向量,然后再计算两个句子的余弦相似度。
同样,也进行标准化处理,实际上,标准化处理后的权重,就是式子(5)中对应的权重。仍然可以利用矩阵计算公式(4)进行迭代计算。
总结
TextRank的论文中测试了很多种方法,结合实际来看,TextRank的优缺点总结如下:
优点:
1) 无监督方式,无需构造数据集训练。
2) 算法原理简单且部署简单。
3) 继承了PageRank的思想,效果相对较好,相对于TF-IDF方法,可以更充分的利用文本元素之间的关系。
缺点:
1) 结果受分词、文本清洗影响较大,即对于某些停用词的保留与否,直接影响最终结果。
2) 虽然与TF-IDF比,不止利用了词频,但是仍然受高频词的影响,因此,需要结合词性和词频进行筛选,以达到更好效果,但词性标注显然又是一个问题。
实战
至此,TextRank介绍完毕,在实操过程中,小老弟发现网上的代码很多是基于networkx包里的pagerank方法进行的计算,与论文公式计算的结果有出入,本着“纸上得来终觉浅“的原则,小老弟动手写了一下TextRank。项目主要结构如下:
-TextRank
--textPro.py : 文本处理,分句分词去停用词,根据词性过滤词。
--textRank.py:实现抽取N个关键词和N个关键句。
--utils.py:共现矩阵的构造,值的计算等。
--const.py:某些常量
获取代码
关注公众号,发送“textrank”,获取相关代码和论文。也可至GitHub:https://github.com/abner-wong/textrank
以上就是本篇文章【关键词提取_关键词提取和文本摘要算法TextRank详解及实战】的全部内容了,欢迎阅览 ! 文章地址:http://nhjcxspj.xhstdz.com/news/166.html 资讯 企业新闻 行情 企业黄页 同类资讯 首页 网站地图 返回首页 物流园资讯移动站 http://yishengsujiao.xhstdz.com/ , 查看更多