资讯专栏INFORMATION COLUMN

textrank-jieba 算法复现

imingyu / 769人阅读

摘要:根据算法的思路,手动复现算法。根据窗口大小,组合共现词和频率,频率代表共现权重。正反双向共现词。根据每个词的权重的迭代公式,采用冒泡排序的方法,将一个词的所有共现词的权重代入公式。迭代次,使每个词的权重收敛。根据权重排序,输出。

根据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 wmax_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]



文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41618.html

相关文章

  • 漫话:如何给女朋友解释灭霸的指响并不是真随机"消灭"半数宇宙人口的?

    摘要:软件实现的是伪随机数。有限状态机不能产生真正的随机数的。复联中,灭霸打了指响之后,复仇者联盟中存活和死亡的名单其实并不是随机的。可见,灭霸的指响抹除过程并不是随机的。综上,灭霸的指响抹除过程不符合随机性不可预测性以及不可复现性。showImg(https://user-gold-cdn.xitu.io/2019/5/7/16a91fc63239db4d);周末,陪女朋友去电影院看了《复仇者联...

    WalkerXu 评论0 收藏0
  • 观远AI实战 | 机器学习系统的工程实践

    摘要:机器学习作为时下最为火热的技术之一受到了广泛的关注。文中给出的个建议都是针对机器学习系统的,没有包含通用软件工程里那些单元测试,发布流程等内容,在实践中这些传统最佳实践也同样非常重要。 图片描述 「观远AI实战」栏目文章由观远数据算法天团倾力打造,观小编整理编辑。这里将不定期推送关于机器学习,数据挖掘,特征重要性等干货分享。本文8千多字,约需要16分钟阅读时间。 机器学习作为时下最为火...

    codergarden 评论0 收藏0
  • 某查询企业信息平台的接口破解记录

    摘要:此次破解的背景是一个朋友希望定期同步某个公司的工商信息,评估和测试了下。相对比较可能的就是启宝的接口了。本地实现小结这次的破解启宝,是一次难得的经验积累。从全网其他的破解方法,以及自己如何一步一步调试,最终破解出生成算法。这只是一次记录。 此次破解的背景是:一个朋友希望定期同步某个公司的工商信息,评估和测试了下。相对比较可能的就是启*宝的接口了。通过一天的努力,终于有了点底了。特做记录...

    Kosmos 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<