zoukankan      html  css  js  c++  java
  • 实战关键词提取

    我要把人生变成科学的梦,然后再把梦变成现实。——居里夫人

    概述

    关键词是代表文章重要内容的一组词,在文献检索、自动文摘、文本聚类/分类等方面有着重要的应用。现实中大量的文本不包含关键词,这使得便捷得获取文本信息更困难,所以自动提取关键词技术具有重要的价值和意义。

    关键词提取分类

    • 有监督
    • 无监督

    有监督虽然精度高,但需要维护一个内容丰富的词表,需要大量的标注数据,人工成本过高。

    无监督不需要标注数据,因此这类算法在关键词提取领域应用更多。比如TF-IDF算法、TextRank算法和主题模型LDA算法等。

    TF-IDF算法

    TF-IDF(Term Frequency - Inverse Document Frequency)是一种基于统计的计算方法,常用于反映一个词对于语料中某篇文档的重要性。

    TF是词频(Term Frequency),IDF是逆文本频率指数(Inverse Document Frequency)。TF-IDF 的主要思想就是:如果某个词在一篇文档中出现的频率高,也即 TF 高;并且在语料库中其他文档中很少出现,即DF低,也即IDF高,则认为这个词具有很好的类别区分能力。

    TF 为词频(Term Frequency),表示词 t 在文档 d 中出现的频率,计算公式:

    其中,分子是该词在文件中的出现次数,而分母则是在文件中所有字词的出现次数之和。

    IDF 为逆文档频率(Inverse Document Frequency),表示语料库中包含词 t 的文档的数目的倒数,计算公式:

    其中,|D|:语料库中的文件总数,|{j:ti∈dj}| 包含词 ti 的文件数目,如果该词语不在语料库中,就会导致被除数为零,因此一般情况下使用 1+|{j:ti∈dj}|。

    然后再计算TF与IDF的乘积:

    因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。比如:有些词“的”,“了”,“地”等出现在每篇文章中都比较多,但是不具有区分文章类别的能力。

    TextRank算法

    TextRank算法脱离语料库,仅对单篇文档进行分析就可以提取该文档的关键词,此算法最早应用于文档的自动摘要,基于句子维度的分析,利用TextRank对每个句子进行打分,挑选出分数最高的n个句子作为文档的关键句,以达到自动摘要的效果。

    TextRank基本思想来源于Google创始人拉里·佩奇和谢尔盖·布林1997年构建的PageRank算法。核心思想将文本中的词看作图中的节点,通过边相互连接,这里就形成了图,不同的节点会有不同的权重,权重高的节点可以作为关键词。

    PageRank思想:

    • 链接数量。一个网页被越多的其他网页链接,说明这个网页越重要。
    • 链接质量。一个网页被一个越高权重的网页链接,也能表明这个网页越重要。

    TextRank用PageRank的思想来解释它:

    • 一个单词被很多单词指向的话,则说明这个单词比较重要。
    • 一个单词被很高TextRank值的单词指向,则这个单词的TextRank值会相应地提高。

    公式如下:

    TextRank中一个单词i的权重取决于在i相连的各个点j组成的(j,i)这条边的权重,以及j这个点到其他边的权重之和,阻尼系数 d 一般取 0.85。

    TextRank关键词提取步骤:

    1. 把给定的文本按照完整句子进行分割。
    2. 对每个句子,进行分词和词性标注处理,并过滤掉停用词,只保留指定词性的单词,如名词、动词等。
    3. 构建关键词图 G = (V,E),其中V 为节点集,由步骤2中生成的候选关键词组成,然后采用共现关系构造任两点之间的边,两个节点之间存在边仅当它们对应的词汇在长度为 K 的窗口中共现,K 表示窗口大小。
    4. 根据TextRank公式,迭代收敛,选出权重topK个词为关键词。
    5. 由步骤4得到最重要的k个单词,在原始文本中进行标记,若形成相邻词组,则组合成多词关键词。

    基于 LDA 主题模型进行关键词提取

    大多数情况,TF-IDF算法和TextRank算法就能满足,但某些场景不能从字面意思提取出关键词,比如:一篇讲健康饮食的,里面介绍了各种水果、蔬菜等对身体的好处,但全篇未显式的出现健康二字,这种情况前面的两种算法显然不能提取出健康这个隐含的主题信息,这时候主题模型就派上用场了。

    LDA(隐含狄利克雷分布)是由David Blei等人在2003年提出的,理论基础为贝叶斯理论,LDA根据词的共现信息的分析,拟合出词——文档——主题的分布,进而将词、文本都映射到一个语义空间中。

    实战

    1. jieba 已经实现了基于 TF-IDF 算法的关键词抽取,如下:
    import jieba.analyse
    
    text = '城市绿化是栽种植物以改善城市环境的活动。 城市绿化作为城市生态系统中的还原组织 城市生态系统具有受到外来干扰和破坏而恢复原状的能力,就是通常所说的城市生态系统的还原功能。'
    
    #获取关键词
    tags = jieba.analyse.extract_tags(text, topK=3)
    print(u"关键词:")
    print(" ".join(tags))
    

    执行结果:

    关键词:
    生态系统 城市绿化 城市
    
    1. jieba也已经实现了基于 TextRank算法的关键词抽取,如下:
    import jieba.analyse
    
    text = '城市绿化是栽种植物以改善城市环境的活动。 城市绿化作为城市生态系统中的还原组织 城市生态系统具有受到外来干扰和破坏而恢复原状的能力,就是通常所说的城市生态系统的还原功能。'
    result = "  ".join(jieba.analyse.textrank(text, topK=3, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')))
    print(u"关键词:")
    print(result)
    

    执行结果:

    关键词:
    城市  破坏  还原
    
    1. 通过 Gensim 库完成基于 LDA 的关键字提取,如下:
    import jieba
    import jieba.analyse as analyse
    import gensim
    from gensim import corpora, models, similarities
    
    text = '城市绿化是栽种植物以改善城市环境的活动。 城市绿化作为城市生态系统中的还原组织 城市生态系统具有受到外来干扰和破坏而恢复原状的能力,就是通常所说的城市生态系统的还原功能。'
    # 停用词
    stop_word = ['的', '。', '是', ' ']
    # 分词
    sentences=[]
    segs=jieba.lcut(text)
    segs = list(filter(lambda x:x not in stop_word, segs))
    sentences.append(segs)
    # 构建词袋模型
    dictionary = corpora.Dictionary(sentences)
    corpus = [dictionary.doc2bow(sentence) for sentence in sentences]
    # lda模型,num_topics是主题的个数
    lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=8)
    print(lda.print_topic(1, topn=3))
    

    执行结果:

    0.037*"城市" + 0.037*"城市绿化" + 0.037*"生态系统"
    

  • 相关阅读:
    反转链表 16
    CodeForces 701A Cards
    hdu 1087 Super Jumping! Jumping! Jumping!(动态规划)
    hdu 1241 Oil Deposits(水一发,自我的DFS)
    CodeForces 703B(容斥定理)
    poj 1067 取石子游戏(威佐夫博奕(Wythoff Game))
    ACM 马拦过河卒(动态规划)
    hdu 1005 Number Sequence
    51nod 1170 1770 数数字(数学技巧)
    hdu 2160 母猪的故事(睡前随机水一发)(斐波那契数列)
  • 原文地址:https://www.cnblogs.com/zeppelin/p/11444166.html
Copyright © 2011-2022 走看看