textrank关键词提取

  TextRank是在Google的PageRank算法启发下,针对文本里的句子设计的权重算法,目标是自动摘要。它利用投票的原理,让每一个单词给它的邻居(术语称窗口)投赞成票,票的权重取决于自己的票数。这是一个“先有鸡还是先有蛋”的悖论,PageRank采用矩阵迭代收敛的方式解决了这个悖论。

PageRank的计算公式:

S(Vi)=(1d)+djIn(Vi)1|Out(Vj)|S(Vj)

   S(Vi) 是网页i的中重要性(PR值)。 d 是阻尼系数,一般设置为0.85。In(Vi)是存在指向网页i的链接的网页集合。 Out(Vj) 是网页j中的链接存在的链接指向的网页的集合。 |Out(Vj)| 是集合中元素的个数。

  PageRank需要使用上面的公式多次迭代才能得到结果。初始时,可以设置每个网页的重要性为1。上面公式等号左边计算的结果是迭代后网页i的PR值,等号右边用到的PR值全是迭代前的。

TextRank的计算公式:

WS(Vi)=(1d)+dVjIn(Vi)WjiVkOut(Vj)wjkWS(Vj)

  TextRank 算法是一种用于文本的基于图的排序算法。其基本思想来源于谷歌的 PageRank算法, 通过把文本分割成若干组成单元(单词、句子)并建立图模型, 利用投票机制对文本中的重要成分进行排序, 仅利用单篇文档本身的信息即可实现关键词提取、文摘。和 LDA、HMM 等模型不同, TextRank不需要事先对多篇文档进行学习训练, 因其简洁有效而得到广泛应用。

TextRank实现步骤

1、文章分词: 对每一篇文章进行分词,分词系统主要由坤雁分词系统、ansj分词,结巴分词等。
2、分词结果数据清洗: 主要包括去停用词、去除符号字母数字等。
3、构建候选关键词图: 根据设定的词语选择窗口截取文本的分词结果,将每个词语作为候选关键词图的节点,截取的每一段文本中的词语作为相邻的边,以此构建候选关键词图。
4、关键词提取: 利用pagerank思想循环迭代候选关键词图, 每个节点的权重初始化化为1.0f,通过设定的迭代次数达到稳定后,对节点权重进行倒序排序,从而得到最重要的num个单词,作为候选关键词。

部分实现代码

生成单词窗口

for (String w : wordList){
    if (!words.containsKey(w)){
        words.put(w, new TreeSet<String>());
    }
    que.offer(w);
    if (que.size() > 5){
        que.poll();
    }
    for (String w1 : que){
        for (String w2 : que){
            if (w1.equals(w2)){
                continue;
            }
            words.get(w1).add(w2);
            words.get(w2).add(w1);
        }
    }
}

矩阵迭代

Map<String, Float> score = new HashMap<String, Float>();
for (int i = 0; i < max_iter; ++i){
    Map<String, Float> m = new HashMap<String, Float>();
    float max_diff = 0;
    for (Map.Entry<String, Set<String>> entry : words.entrySet()){
        String key = entry.getKey();
        Set<String> value = entry.getValue();
        m.put(key, 1 - d);
        for (String element : value){
            int size = words.get(element).size();
            if (key.equals(element) || size == 0) continue;
            m.put(key, m.get(key) + d / size * (score.get(element) == null ? 0 : score.get(element)));
        }
        max_diff = Math.max(max_diff, Math.abs(m.get(key) - (score.get(key) == null ? 0 : score.get(key))));
    }
    score = m;
    if (max_diff <= min_diff) break;
}

参考文献
1.http://www.tuicool.com/articles/rMZfey
2.http://www.hankcs.com/nlp/textrank-algorithm-to-extract-the-keywords-java-implementation.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值