用Py做文本分析5:关键词提取

1.关键词提取

关键词指的是原始文档的和核心信息,关键词提取在文本聚类、分类、自动摘要等领域中有着重要的作用。

针对一篇语段,在不加人工干预的情况下提取出其关键词

  • 首先进行分词处理
  • 关键词分配:事先给定关键词库,然后在文档中进行关键词检索
  • 关键词提取:根据某种规则,从文档中抽取最重要的词作为关键词
    • 有监督:抽取出候选词并标记是否为关键词,然后训练相应的模型
    • 无监督:给词条打分,并基于最高分抽取

无监督学习——基于词频
思路1:按照词频高低进行提取

  • 大量高频词并无多少意义(比如停用词)
  • 即使出现频率相同,常见词的价值也明显低于不常见词

思路2:按照词条在文档中的重要性进行提取

2.TF-IDF算法

2.1TF-IDF介绍

IF-IDF是信息检索中最常用的一种文本关键信息表示法,其基本的思想是如果某个词在一篇文档中出现的频率高,并且在语料库中其他文档中很少出现,则认为这个词具有很好的类别区分能力。

TF:Term Frequency,衡量一个term在文档中出现得有多频繁。平均而言出现越频繁的词,其重要性可能就越高。考虑到文章长度的差异,需要对词频做标准化:

  • TF(t)=(t出现在文档中的次数)/(文档中的term总数)
  • TF(t)=(t出现在文档中的次数)/(文档中出现最多的term的次数)

IDF:Inverse Document Frequency,逆文档概率,用于模拟在该语料的实际使用环境中,目标term的重要性。

  • 把罕见词的重要性调高,把常见词的重要性调低。
  • IDF(t)=log(语料库中的文档总数/(含有该term的文档总数+1))

TF-IDF:TF*IDF

  • TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语料库中出现的次数成反比

优点:

  • 简单快速
  • 结果比较符合实际情况
    缺点:
  • 单纯以“词频”衡量一个词的重要性,不够全面
  • 无法考虑词与词间的相互关系
  • 无法体现出词的位置信息
    • 一种解决方法是,对全文第一段和每一段第一句话,给予较大的权重

2.2TF-IDF具体实现

(1)jieba

  • 输出的结果会自动按照TF-IDF值降序排列,并且直接给出的是词条而非字典ID,便于阅读使用。
  • 可在计算TF-IDF时直接完成分词,并使用停用词表和自定义词库,很方便。
  • 有默认的IDF语料库,可以不训练模型,直接进行计算。
  • 以单个文本为单位进行分析。
jieba.analyse.extract_tags(
      sentence #带提取的文本
      topK = 20 #返回几个IF/IDF权重最大的关键词
      withWeight = False #是否一并返回关键词权重值
      allowPOS = () #仅包括制定词性的词,默认值为空,即不筛选
)
jieba.analyse.set_idf_path(file_name) #可以更换为自定义IDF语料库
jieba.analyse.set_stop_words(file_name) #在关键词提取时使用自定义停用词语料库
jieba.analyse.TFIDF(idf_path=None) #新建TFIDF实例
import jieba
import jieba.analyse

#使用默认的TFIDF模型进行分析
jieba.analyse.extract_tags(chapter.txt[1])

#查看关键词的TFIDF值,即权重
jieba.analyse.extract_tags(chapter.txt[1], withWeight = True)

#使用自定义词典改善分词效果
jieba.load_userdict('D:/Files/program data/nlp/PythonData/金庸小说词库.txt')

#在TFIDF计算中直接使用停用词表
jieba.analyse.set_stop_words('D:/Files/program data/nlp/PythonData/停用词.txt')

TFres = jieba.analyse.extract_tags(chapter.txt[1], withWeight = True)
TFres

#使用自定义TFIDF频率文件
jieba.analyse.set_idf_path('D:/Files/program data/nlp/PythonData/idf.txt.big')
TFres1 = jieba.analyse.extract_tags(chapter.txt[1], withWeight = True)
TFres1

(2)sklearn

  • 输出格式为矩阵,直接为后续的sklearn建模服务
  • 需要先使用背景语料库进行模型训练
  • 结果中给出的是字典ID而不是具体词条,直接阅读结果比较困难
import jieba

stoplist_path = 'D:/Files/program data/nlp/PythonData/停用词.txt'
stoplist = list(pd.read_csv(stoplist_path, names = ['w'], sep = 'aaa',
                           encoding = 'utf-8', engine = 'python').w)
def m_cut(intext):
    return [w for w in jieba.cut(intext)
           if w not in stoplist and len(w) >1]

from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer

txtlist = [' '.join(m_cut(w)) for w in chapter.txt]
vectorizer = CountVectorizer()
x = vectorizer.fit_transform(txtlist) #将文本中的词转换为词频矩阵

transformer = TfidfTransformer()
tfidf = transformer.fit_transform(x) #基于词频矩阵x计算TF-IDF值
tfidf

#转换为数组
tfidf.toarray()

#转换为矩阵
tfidf.todense()

#行列信息
tfidf.toarray().shape

#词条信息
print('字典长度:',len(vectorizer.vocabulary_))
vectorizer.vocabulary_

(3)gensim

  • 输出格式为list,目的也是为了后续的建模分析
  • 需要先使用背景语料库进行模型训练
  • 结果中给出的是字典ID而不是具体词条,直接阅读结果比较困难
#文档分词及预处理
chaplist = [m_cut(w) for w in chapter.txt]
chaplist

from gensim import corpora, models

#生成文档对应的字典和bow稀疏向量
dictionary = corpora.Dictionary(chaplist)
corpus = [dictionary.doc2bow(text) for text in chaplist]
corpus

tfidf_model = models.TfidfModel(corpus) #建立TF-IDF模型
corpus_tfidf = tfidf_model[corpus] #对所需文档计算TF-IDF结果
corpus_tfidf

#列出所需文档的TF-IDF计算结果(第3章)
corpus_tfidf[2]

#列出字典内容
dictionary.token2id

3.TextRank算法

前面介绍的TF-IDF属于无监督中基于词频的算法,TextRank算法是基于图形的算法。

TextRank算法的思想来源于PageRank算法:

  • 如果一个网页被很多其他网页链接到,说明这个网页比较重要,也就是PageRank值相对较高。
  • 如果一个PageRank值很高的网页链接到其他网页,那么被链接网页的PageRank值会相应地提高。

和基于词频的算法相比,TextRank进一步考虑了文档内词条间的语义关系。

  • 将文档按照整句进行分割
  • 分词并清理,只保留指定词性的词条
  • 以整句为单位计算词条的共线矩阵
  • 按指定窗口长度K,构建词条网络
  • 基于网络连接特征计算词条重要性
  • 排序并输出结果
jieba.analyse.textrank(
        sentence, topK=20, withWeight=False
        allowPOS=('ns','n','vn','v')
)#注意默认过滤词性
jieba.analyse.textrank(chapter.txt[1], topK=20, withWeight = True)

参考资料:
Python数据分析--玩转文本挖掘

你可能感兴趣的:(用Py做文本分析5:关键词提取)