textrank-jieba 算法复现

字节踏雪使
• 阅读 3332

根据jieba textrank算法的思路,手动复现textrank算法。
思路:1.分词,确定窗口大小。

 2.根据窗口大小,组合共现词和频率,频率代表共现权重。
      trick:正反双向共现词。
 3.根据textrank 每个词的权重的迭代公式,采用冒泡排序的方法,将一个词的所有共现词的权重代入公式。
 4.迭代10次,使每个词的权重收敛。
 5.根据权重排序,输出top words。
import collections
import sys
import jieba
import jieba.posseg as psg
from operator import itemgetter


class UndirectWeightedGraph:
    d=0.85
    def __init__(self):
        self.edges=collections.defaultdict(list)
    def add_edge(self,start,end,weight):
        self.edges[start].append((start,end,weight))
        self.edges[end].append((end,start,weight))
    def rank(self):
        ws=collections.defaultdict(float)
        outSum=collections.defaultdict(float)

        wsdef=1.0/(len(self.edges) or 1.0)
        for n,elem in self.edges.items():
            outSum[n]=sum([e[2] for e in elem])
            ws[n]=wsdef

        for epoch in range(10):
            for n,elems in self.edges.items():
                s=0
                for elem in elems:
                   s+=elem[2]/outSum[elem[1]]*ws[elem[1]]
                ws[n]=s

        min_rank,max_rank=sys.float_info[0],sys.float_info[3]
        for n,w in ws.items():
            if w<min_rank:
                min_rank=w
            if w>max_rank:
                max_rank=w

        for n,w in ws.items():
            ws[n]=((n-min_rank)/10.0)/((max_rank-min_rank)/10.0)
        return ws

class TextRank(object):
    def __init__(self):
        self.stopwords=[]
        self.pos_filter=[]
        self.span=5
    def pairfilter(self,wp):
        return wp.flag in self.pos_filter and len(wp.word)>=2 and wp.word.lower not in self.stopwords
    def textrank(self,sentence,topk=20):
        uwg=UndirectWeightedGraph()
        words=psg.lcut(sentence)
        wm=collections.defaultdict(int)
        for word_index,wp in enumerate(words):
            if self.pairfilter(wp):
                for index_assit in range(word_index+1,word_index+5):
                    if index_assit>=len(words):
                        break
                    if not self.pairfilter(words[index_assit]):
                        continue
                    wm[(wp,words[index_assit])]+=1
                    # uwg.add_edge(wp.word,words[index_assit].word,1)
        for words_tuple,w in wm.items():
            uwg.add_edge(words_tuple[0],words_tuple[1],w)
        g=uwg.rank()
        g=sorted(g.items(),key=itemgetter(1),reverse=True)
        return g[:topk]



点赞
收藏
评论区
推荐文章
android系统稳定分析
分析Android问题时,经常会遇到一些稳定性问题。什么是稳定性问题呢,我归结有以下特点,非必现问题,或没有找到复现路径的问题。其实没有非必现问题,只有找不到复现方法。系统越复杂这类问题越多,因为软件路径太多了。应用的死机重启。这类问题不能简单的归结为应用问题,毕竟应用是跑在系统上的。当应用开发人员无法分析出问题时,可能就会认为是稳定性问题。系统死机重启。A
Wesley13 Wesley13
3年前
java中比较两个时间的差值
项目背景1.某篇文稿的发布时间是publishDate,例如:2020072118:00:41。2.现要求判断该篇文稿的发布时间是否在近30天之内。publicstaticlongdayDiff(DatecurrentDate,DatepublishDate){LongcurrentTimecurrentDat
Wesley13 Wesley13
3年前
java算法
  递推算法是常用的算法思想,在数学计算等方面有着广泛的应用。递推算法适合有着明显公式的规律场合。一、递推算法基本思想  递推算法是一种理性思维模式的代表,其根据已有的数据和关系,逐步推导而得到结果。递推算法的执行过程如下:1.根据已知结果和关系,求解中间结果。2.判断是否达到要求,如果没有达到。则继续根
Stella981 Stella981
3年前
RokectMQ 顺序性 和分布式事务
1.顺序性是根据参数的id来使其同时投递到统一队列上。//RocketMQ通过MessageQueueSelector中实现的算法来确定消息发送到哪一个队列上//RocketMQ默认提供了两种MessageQueueSelector实现:随机/Hash//当然你可以根据业务实现自己的MessageQueueSelecto
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
Elasticsearch安装使用ik中文分词
序言Elasticsearch默认提供的分词器,会把每个汉字分开,而不是我们想要的根据关键词来分词。例如:curlXPOST"http://localhost:9200/test/_analyze?analyzerstandard&prettytrue&text我是中国人"我们会得到这样的结果:{tok
Easter79 Easter79
3年前
Storyboard中的UIScrollView使用自动布局,使其能够滚动
在使用storyboard和xib时,我们经常要用到ScrollView,还有自动布局AutoLayout,但是ScrollView和AutoLayout结合使用,相对来说有点复杂。根据实践,我说一下我的理解,在故事板或xib中,ScrollView是根据其下面的一个View的大小来确定ContentSize的大小。看一下效果!(http://
17个机器学习的常用算法!
根据数据类型的不同,对一个问题的建模有不同的方式。在机器学习或者人工智能领域,人们首先会考虑算法的学习方式。在机器学习领域,有几种主要的学习方式。将算法按照学习方式分类是一个不错的想法,这样可以让人们在建模和算法选择的时候考虑能根据输入数据来选择最合适的算法来获得最好的结果。1.监督式学习:2.非监督式学习:在非监督式学习中,数据并不被特别标识,学习模
常用限流算法详解
一、有哪些常用的限流算法1.固定窗口限流;2.滑动窗口限流;3.漏桶算法限流;4.令牌桶算法限流。二、4种限流算法介绍1.固定窗口限流举例说明:假设时间窗口大小为5s,则0到5s为第一个窗口,5到10s为第二个窗
流浪剑客 流浪剑客
1年前
Macos多窗口布局软件:Mosaic for Mac
是一款窗口布局管理工具,旨在帮助用户重新定位和调整macOS应用程序的大小,将多窗口混沌转化为高效的工具套件。它拥有你能想到的所有关于窗口尺寸定位的功能,并附加了通过iOS设备远程控制窗口定位的功能。MosaicforMac可以轻松地创建拼贴画,包括根据
一种融合指代消解序列标注方法在中文人名识别上的应用(下)
二、使用了BERT模型和指代消解算法:加入BERT语言预处理模型,获取到高质量动态词向量。融入指代消解算法,根据指代词找出符合要求的子串/短语。【2】融入指代消解算法,根据指代词找出符合要求的子串/短语指代消解算法如图2所示,简单来说,就是考虑文档中子串/