当前位置:   article > 正文

关键词提取 TF-IDF算法与TextRank算法_gensim tfidf关键词

gensim tfidf关键词

自动提取关键词

用途:

  • 用核心信息代表原始文档
  • 在文本聚类、分类、自动摘要等领域中有着重要的作用

关键词提取:根据某种准则,从文档中抽取最重要的词作为关键词

  • 有监督:抽取出候选词并标记是否为关键词,然后训练相应的模型
  • 无监督:给词条打分,并基于最高分值抽取

1 无监督方式的分析思路–基于词频

分析思路1:按照词频高低进行提取

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

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

  • 如何确定词条在该文档中的重要性?

1.1 TF-IDF 算法

TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率),是一种用于资讯检索与资讯探勘的常用加权技术。

信息检索(IR)中最常用的一种文本关键信息表示法基本思想:

如果某个词在一篇文档中出现的频率TF高,并且在语料库中其他文档中很少出现,则认为这个词具有很好的类别区分能力

词频TF:Term Frequency,衡量一个term在文档中出现得有多频繁,平均而言出现越频繁的词,其重要性可能就越高

词频 ( T F ) = 某个词在文章中的出现次数 \text{词频}\left( TF \right) =\text{某个词在文章中的出现次数} 词频(TF)=某个词在文章中的出现次数

考虑到文章长度的差异,需要对词频做标准化

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

词频 ( T F ) 标准化 = 某个词在文章中的出现次数 文章的总词数 \text{词频}\left( TF \right) _{\text{标准化}}=\frac{\text{某个词在文章中的出现次数}}{\text{文章的总词数}} 词频(TF)标准化=文章的总词数某个词在文章中的出现次数

或者

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

词频 ( T F ) 标准化 = 某个词在文章中的出现次数 该文章出现次数最多的词的出现次数 \text{词频}\left( TF \right) _{\text{标准化}}=\frac{\text{某个词在文章中的出现次数}}{\text{该文章出现次数最多的词的出现次数}} 词频(TF)标准化=该文章出现次数最多的词的出现次数某个词在文章中的出现次数


逆文档频率IDF:Inverse Document Frequency,用于模拟在该语料的实际使用环境中,某一个term有多重要

有些词到处都出现,但是明显没什么用。比如各种停用词,过渡句用词之类的,因此把罕见的词的重要性(weight)调高,把常见词的重要性调低

IDF的具体算法

  • IDF(t) = log( 语料库中的文档总数 / (含有该term的文档总数+1) )
    ·

逆文档频率 ( I D F ) = log ⁡ ( 语料库的文档总数 包含该词的文档数 + 1 ) \text{逆文档频率}\left( IDF \right) =\log \left( \frac{\text{语料库的文档总数}}{\text{包含该词的文档数}+1} \right) 逆文档频率(IDF)=log(包含该词的文档数+1语料库的文档总数)

因 包含该词的文档数 为 0 ,所以需要加 1


TF-IDF = TF * IDF

T F − I D F = 词频 ( T F )   ×  逆文档频率 ( I D F ) TF-IDF=\text{词频}\left( TF \right) \ \times \ \text{逆文档频率}\left( IDF \right) TFIDF=词频(TF) × 逆文档频率(IDF)

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

关键词提取就是通过计算文档中每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。TF-IDF值越大,该特征词对这个文本的重要性越大,也即这个词成为一个关键词的概率就越大。

总结

在这里插入图片描述
图片来自:https://blog.csdn.net/miner_zhu/article/details/81566456


TF-IDF算法的优点

  • 简单快速,结果比较符合实际情况。

TF-IDF算法的缺点

  • 单纯以"词频"衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多
  • 无法考虑词与词之间的关系
  • 无法体现词的位置信息,出现位置靠前的词与出现位置靠后的词,都被视为重要性相同,这是不正确的。
    (一种解决方法是,对全文的第一段和每一段的第一句话,给予较大的权重。)

1.2 TF-IDF的具体实现

Jieba, NLTK, sklearn, gensim等程序包都可以实现TF-IDF的计算。除算法细节上会有差异外,更多的是数据输入/输出格式上的不同。

1.2.1 TD-IDF的Jieba包实现

输出结果会自动按照TF-IDF值降序排列,并且直接给出的是词条而不是字典ID,便于阅读使用。

可在计算TF-IDF时直接完成分词,并使用停用词表和自定义词库,非常方便。

有默认的IDF语料库,可以不训练模型,直接进行计算。

注意:Jieba 是以单个文本为单位进行分析。

jieba.analyse.extract_tags(
             sentence : 为待提取的文本
             topK = 20 :返回几个 TF/IDF 权重最大的关键词
             withWeight = False : 是否一并返回关键词权重值
             allowPOS = () : 仅包括指定词性的词,默认值为空,既不筛选
             )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

具体实现,例

在这里插入图片描述

import jieba
import jieba.analyse



# 应用自定义词典改善分词效果
'''
my_words = ['','','']    
for i in my_words:
    jieba.add_word(i)
'''

# 应用自定义词典改善分词效果
#jieba.load_userdict('词库.txt') # dict为自定义词典的路径

# 在TF-IDF计算中直接应用停用词表    
jieba.analyse.set_stop_words(r"C:\Users\Administrator\Desktop\停用词.txt")

s = """近年来,我市大力推动农村电商发展和电商扶贫工作,农村电商步入发展快车道。
2018年,全市农村网络零售额达164.4亿元,同比增长45.5%。其中,农产品网络零售额占
农村网络零售额34.5%,比2017年提高了7个百分点。巫山脆李、奉节脐橙和城口核桃等农
特产品,通过电商渠道卖到全国各地,一些区县还借助电商平台发展起“订单农业”,让
产业扶贫更有活力。2018年,全市14个国家级贫困区县实现农村产品网络零售额77亿元,
带动贫困户农产品销售额3.5亿元。全市11万户贫困户借助电商扶贫实现增收。据悉,我市
将加强农产品标准化、品牌化、规模化改造,推动“三品一标”“一村一品”等农产品网上
销售,升级建设一批重点网货生产基地,构建“大集群、小单元、冲单品”生产格局。到
2020年,每个贫困区县将重点培育2~3个拳头农产品品类,全市建成特色农产品网货生产加
工基地15个以上。此外,市商务委将加强农村快递统筹和整治,实行快递企业配送站点设施
共用等,探索农村物流协同配送机制,彻底打破物流对我市农村电商的瓶颈制约。预计到2020年,
我市贫困地区农村电商将实现电商服务、快递物流、冷链集配体系等全覆盖。"""

#jieba.analyse.extract_tags(s) 
jieba.analyse.extract_tags(s,topK=20)
#jieba.analyse.extract_tags(s,withWeight = True) #返回权重值
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

[‘电商’, ‘农村’, ‘农产品’, ‘零售额’, ‘我市’, ‘快递’, ‘区县’, ‘扶贫’, ‘全市’, ‘网络’, ‘2018’, ‘网货’, ‘2020’, ‘贫困户’, ‘物流’, ‘配送’, ‘贫困’, ‘借助’, ‘亿元’, ‘生产’]

上述使用的是 jieba 中默认的模型(TF-IDF权重)得出的结果

最终结果相对来说不算准确

可以在关键词提取时使用自定义逆向文件频率(IDF)语料库

jieba.analyse.set_idf_path(file_name)
  • 1

例如
在这里插入图片描述

新建TF-IDF模型实例

jieba.analyse.TFIDF(idf_path = None)

新建TFIDF模型实例
idf_path  : 读取已有的TFIDF频率文件(即已有模型)
使用该实例提取关键词:TFIDF实例.extract_tags()
  • 1
  • 2
  • 3
  • 4
  • 5

使用

# 使用自定义TF-IDF频率文件
jieba.analyse.set_idf_path("idf.txt.big")
TFres1 = jieba.analyse.extract_tags(s , withWeight = True)
TFres1[:10]
  • 1
  • 2
  • 3
  • 4

1.2.2 TD-IDF的sklearn实现

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

from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
import numpy as np
import os

os.chdir(r'C:\Users\Administrator\Desktop')
df = pd.read_excel('评论.xlsx')
df.head()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

# 加载停用词
stop_words = [] 
with open(r"C:\\Users\\Administrator\\Desktop\\停用词.txt", 'r',encoding='utf-8') as f:
   lines = f.readlines()
   for line in lines:
       stop_words.append(line.strip())
# stop_words[:10]


# 分词并去除停用词和短词
import jieba 

def my_cut(text): 
    return [w for w in jieba.cut(text) if w not in stop_words and len(w)>1]

txtlist = [ " ".join(my_cut(w)) for w in df['评论']] 
txtlist

# 文本向量化
vectorizer = CountVectorizer() 
X = vectorizer.fit_transform(txtlist) # 将文本中的词语转换为词频矩阵  

transformer = TfidfTransformer()  
tfidf = transformer.fit_transform(X)  #基于词频矩阵X计算TF-IDF值  
tfidf
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

在这里插入图片描述

tfidf.toarray() # 转换为数组
  • 1

在这里插入图片描述

tfidf.todense() # 转换为矩阵
  • 1

在这里插入图片描述

tfidf.todense().shape
  • 1

(965, 9329)

# 词条字典
print("字典长度:", len(vectorizer.vocabulary_))
vectorizer.vocabulary_
  • 1
  • 2
  • 3

vocabulary_:特征和特征在TD-IDF中位置的一个对应关系,vocabulary_的输出可以看出每个特征词和TD-IDF矩阵列的对应关系:

在这里插入图片描述
每列对应的词

# get_feature_names():返回特征列表
vectorizer.get_feature_names()
  • 1
  • 2

在这里插入图片描述

1.2.3 TD-IDF的gensim实现

  • 输出格式为list,目的也是为后续的建模分析服务。

  • 需要先使用背景语料库进行模型训练。

  • 结果中给出的是字典ID而不是具体词条,直接阅读结果比较困难。

gensim也提供了sklearn的API接口:sklearn_api.tfidf,可以在sklearn中直接使用。

gensim使用的是分词好的列表

sklearn使用的是分词后以空格隔开的长字符串

import pandas as pd
import numpy as np
import os
import jieba 

# 读取数据
os.chdir(r'C:\Users\Administrator\Desktop')
df = pd.read_excel('评论.xlsx')
df.head()


# 加载停用词
stop_words = [] 
with open(r"C:\\Users\\Administrator\\Desktop\\停用词.txt", 'r',encoding='utf-8') as f:
   lines = f.readlines()
   for line in lines:
       stop_words.append(line.strip())
# stop_words[:10]


# 分词并去除停用词和短词
def my_cut(text): 
    return [w for w in jieba.cut(text) if w not in stop_words and len(w)>1]

# 文档分词及预处理  
data = [my_cut(w) for w in df["评论"]]
data
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

在这里插入图片描述

from gensim import corpora, models  

# 生成文档对应的字典和bow稀疏向量
dictionary = corpora.Dictionary(data)  
corpus = [dictionary.doc2bow(text) for text in data] # 仍为list in list  
corpus
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

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

在这里插入图片描述

# 查看第一个文档的结果
corpus_tfidf[0] # 列出所需文档的TF-IDF计算结果
  • 1
  • 2

在这里插入图片描述

dictionary.token2id # 列出字典内容
  • 1

在这里插入图片描述

2 无监督方式的分析思路–基于图形

PageRank算法:Page&Brin

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

  • 如果一个PageRank值很高的网页链接到个其他网页,那么被链接网页的PageRank值会相应地因此而提高

一般用于网页排名

如果用于文档关键词的提取,就是从PageRank到TextRank

2.1 TextRank算法

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

基本原理

  • 将文档按照整句进行分割
  • 分词并清理,只保留指定词性的词条
  • 以整句为单位计算词条的共现矩阵
  • 按指定窗囗长度K,构建词条网络
  • 基于网络连接特征计算词条重要性
  • 排序并输出结果

在这里插入图片描述

2.2 TextRank算法的Jieba实现

jieba.analyse.textrank(
    sentence, topK=20, withWeight=False,
    allowPOS=('ns', 'n', 'vn', 'v')
) # 注意默认过滤词性
  • 1
  • 2
  • 3
  • 4

例.

import jieba
import jieba.analyse

text = ''.join(c for c in df['评论'])

keywords_textrank = jieba.analyse.textrank(text,topK=20,withWeight=False,allowPOS=('ns','n'))
print(keywords_textrank)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

至此

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/342895
推荐阅读
相关标签
  

闽ICP备14008679号