python截取指定关键字后面的内容 python jieba提取关键词_词频


目录:

1.什么是关键词?
2.TF-IDF关键词提取算法
3.算法实现

1.什么是关键词?

关键词是指能反映文本主题或者意思的词语,如论文中的Keyword字段。

关键词提取是文本挖掘领域一个很重要的部分,通过对文本提取的关键词可以窥探整个文本的主题思想,进一步应用于文本的推荐或文本的搜索。

常用的关键词提取算法:TF-IDF算法、TextRank算法

2.TF-IDF关键词提取算法

TF-IDF是关键词提取最基本、最简单易懂的方法。判断一个词再一篇文章中是否重要,一个最容易想到的衡量指标就是词频,重要的词往往在文章中出现的频率也非常高;但另一方面,不是出现次数越多的词就一定重要,因为有些词在各种文章中都频繁出现(例如:我们),那它的重要性肯定不如哪些只在某篇文章中频繁出现的词重要性强。从统计学的角度,就是给予那些不常见的词以较大的权重,而减少常见词的权重,最终得分较高的词语即为关键词。

TF和IDF计算公式如下:


python截取指定关键字后面的内容 python jieba提取关键词_中文分词_02


一个词IDF值的计算是根据语料库得出的,如果一个词在语料库中越常见,那么分母就越大,IDF就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。该词在语料库中越常见,IDF值越小。


python截取指定关键字后面的内容 python jieba提取关键词_jieba库词频统计_03


最终得到TF-IDF值:


python截取指定关键字后面的内容 python jieba提取关键词_词频_04


可以看出TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语料库中出现次数成反比。一个词的TF-IDF值非常高,说明这个词比较少见,但是它在这篇文章中多次出现,那么这个词就非常可能是我们需要的关键词。

以文章《中国的蜜蜂养殖》为例,“蜜蜂”和“养殖”两个词的TF-IDF值都非常高,作为这篇文章的关键词实际上看也是非常合适的。另外“中国”这个词虽然在文章中的词频并不低“蜜蜂”和“养殖”低,但因为它在整个语料库中经常出现,导致IDF值非常低,所以不会作为文章的关键词。

3.算法实现

Python的jieba库提供了基于TF-IDF算法。

首先来看看jieba库的关键词提取的效果:(其中text为待提取关键词的文本字符串,取自news_data)


python截取指定关键字后面的内容 python jieba提取关键词_python截取指定关键字后面的内容_05


python截取指定关键字后面的内容 python jieba提取关键词_中文分词_06


1、jieba.analyse.extract_tags(text)

完整代码位于

https://github.com/fxsjy/jieba/blob/master/jieba/analyse/tfidf.pygithub.com


关键代码如下:


def extract_tags(self, sentence, topK=20, withWeight=False, allowPOS=(), withFlag=False):
# (1)中文分词
    if allowPOS:
        allowPOS = frozenset(allowPOS)
        words = self.postokenizer.cut(sentence)
    else:
        words = self.tokenizer.cut(sentence)

# (2)计算词频TF 
    freq = {}
    for w in words:
        if allowPOS:
            if w.flag not in allowPOS:
                continue
            elif not withFlag:
                w = w.word
        wc = w.word if allowPOS and withFlag else w
        if len(wc.strip()) < 2 or wc.lower() in self.stop_words:
            continue
        freq[w] = freq.get(w, 0.0) + 1.0
    total = sum(freq.values())

# (3)计算IDF
    for k in freq:
        kw = k.word if allowPOS and withFlag else k
        freq[k] *= self.idf_freq.get(kw, self.median_idf) / total

# (4)排序得到关键词集合
    if withWeight:
        tags = sorted(freq.items(), key=itemgetter(1), reverse=True)
    else:
        tags = sorted(freq, key=freq.__getitem__, reverse=True)
    if topK:
        return tags[:topK]
    else:
        return tags


extract_tags()函数将原始文本作为输入,输出文本的关键词集合,代码大致分为四个部分:(1)中文分词 (2)计算词频TF (3)计算IDF (4)将所有词排序得到关键词集合。重点关注一下词频TF和IDF的计算,(2)部分代码简历一个字典freq,记录文本中所有词的出现次数。(3)部分代码计算IDF,前文提到IDF需要通过语料库计算,jieba.analyse中包含一个idf.txt。idf.txt中记录了所有词的IDF值,当然你可以使用自己的语料库idf.txt,详见fxsjy/jieba文档。


python截取指定关键字后面的内容 python jieba提取关键词_jieba库词频统计_07


总结:关键词提取在文本挖掘领域有着非常广泛的应用,因为文本领域的不同,长文本和短文本的文本类型的不同,每种关键词提取方法的效果也不尽相同,本文只介绍了一种方法,实际应用中需要对多种方法进行尝试挑选最合适效果最好的方法。