- 对每个句子进行分词和词性标注处理
- 过滤掉除指定词性外的其他单词,过滤掉出现在停用词表的单词,过滤掉长度小于2的单词
- 将剩下的单词中循环选择一个单词,将其与其后面4个单词分别组合成4条边。
例如:[‘有’,‘媒体’, ‘曝光’,‘高圆圆’, ‘和’, ‘赵又廷’,‘现身’, ‘台北’, ‘桃园’,‘机场’,‘的’, ‘照片’]对于‘媒体‘这个单词,就有(‘媒体’, ‘曝光’)、(‘媒体’, ‘圆’)、(‘媒体’, ‘和’)、(‘媒体’, ‘赵又廷’)4条边,且每条边权值为1,当这条边在之后再次出现时,权值再在基础上加1.
- 有了这些数据后,我们就可以构建出候选关键词图,图的概念有基础的人可能会很好理解,不理解其实也没关系,按上面例子,你只用知道这一步我们把2个单词组成的边,和其权值记录了下来。
- 这样我们就可以套用TextRank的公式,迭代传播各节点的权值,直至收敛。
- 对结果中的Rank值进行倒序排序,筛选出前面的几个单词,就是我们需要的关键词了。
实现代码:
#encoding=utf-8
from __future__ import unicode_literals
import sys
sys.path.append("../")
import jieba
import jieba.posseg
import jieba.analyse
s = "线程是程序执行时的最小单位,它是进程的一个执行流,\
是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,\
线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。\
线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。\
同样多线程也可以实现并发操作,每个请求分配一个线程来处理。"
print('-'*40)
print(' TextRank关键词提取')
print('-'*40)
for x, w in jieba.analyse.textrank(s, withWeight=True):
print('%s %s' % (x, w))
运行结果: