赞
踩
自动提取关键词
用途:
关键词提取:根据某种准则,从文档中抽取最重要的词作为关键词
分析思路1:按照词频高低进行提取
分析思路2:按照词条在文档中的重要性进行提取
TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率),是一种用于资讯检索与资讯探勘的常用加权技术。
信息检索(IR)中最常用的一种文本关键信息表示法基本思想:
如果某个词在一篇文档中出现的频率TF高,并且在语料库中其他文档中很少出现,则认为这个词具有很好的类别区分能力
词频TF:Term Frequency,衡量一个term在文档中出现得有多频繁,平均而言出现越频繁的词,其重要性可能就越高
词频 ( T F ) = 某个词在文章中的出现次数 \text{词频}\left( TF \right) =\text{某个词在文章中的出现次数} 词频(TF)=某个词在文章中的出现次数
考虑到文章长度的差异,需要对词频做标准化
词频 ( T F ) 标准化 = 某个词在文章中的出现次数 文章的总词数 \text{词频}\left( TF \right) _{\text{标准化}}=\frac{\text{某个词在文章中的出现次数}}{\text{文章的总词数}} 词频(TF)标准化=文章的总词数某个词在文章中的出现次数
或者
词频 ( T F ) 标准化 = 某个词在文章中的出现次数 该文章出现次数最多的词的出现次数 \text{词频}\left( TF \right) _{\text{标准化}}=\frac{\text{某个词在文章中的出现次数}}{\text{该文章出现次数最多的词的出现次数}} 词频(TF)标准化=该文章出现次数最多的词的出现次数某个词在文章中的出现次数
逆文档频率IDF:Inverse Document Frequency,用于模拟在该语料的实际使用环境中,某一个term有多重要
有些词到处都出现,但是明显没什么用。比如各种停用词,过渡句用词之类的,因此把罕见的词的重要性(weight)调高,把常见词的重要性调低
IDF的具体算法
逆文档频率 ( 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) TF−IDF=词频(TF) × 逆文档频率(IDF)
TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语料中的出现次数成反比
关键词提取就是通过计算文档中每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。TF-IDF值越大,该特征词对这个文本的重要性越大,也即这个词成为一个关键词的概率就越大。
总结
图片来自:https://blog.csdn.net/miner_zhu/article/details/81566456
TF-IDF算法的优点
TF-IDF算法的缺点
Jieba, NLTK, sklearn, gensim等程序包都可以实现TF-IDF的计算。除算法细节上会有差异外,更多的是数据输入/输出格式上的不同。
输出结果会自动按照TF-IDF值降序排列,并且直接给出的是词条而不是字典ID,便于阅读使用。
可在计算TF-IDF时直接完成分词,并使用停用词表和自定义词库,非常方便。
有默认的IDF语料库,可以不训练模型,直接进行计算。
注意:Jieba 是以单个文本为单位进行分析。
jieba.analyse.extract_tags(
sentence : 为待提取的文本
topK = 20 :返回几个 TF/IDF 权重最大的关键词
withWeight = False : 是否一并返回关键词权重值
allowPOS = () : 仅包括指定词性的词,默认值为空,既不筛选
)
具体实现,例
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) #返回权重值
[‘电商’, ‘农村’, ‘农产品’, ‘零售额’, ‘我市’, ‘快递’, ‘区县’, ‘扶贫’, ‘全市’, ‘网络’, ‘2018’, ‘网货’, ‘2020’, ‘贫困户’, ‘物流’, ‘配送’, ‘贫困’, ‘借助’, ‘亿元’, ‘生产’]
上述使用的是 jieba 中默认的模型(TF-IDF权重)得出的结果
最终结果相对来说不算准确
可以在关键词提取时使用自定义逆向文件频率(IDF)语料库
jieba.analyse.set_idf_path(file_name)
例如
新建TF-IDF模型实例
jieba.analyse.TFIDF(idf_path = None)
新建TFIDF模型实例
idf_path : 读取已有的TFIDF频率文件(即已有模型)
使用该实例提取关键词:TFIDF实例.extract_tags()
使用
# 使用自定义TF-IDF频率文件
jieba.analyse.set_idf_path("idf.txt.big")
TFres1 = jieba.analyse.extract_tags(s , withWeight = True)
TFres1[:10]
class sklearn.feature_extraction.text.TfidfTransformer()
例
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()
# 加载停用词 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
tfidf.toarray() # 转换为数组
tfidf.todense() # 转换为矩阵
tfidf.todense().shape
(965, 9329)
# 词条字典
print("字典长度:", len(vectorizer.vocabulary_))
vectorizer.vocabulary_
vocabulary_:特征和特征在TD-IDF中位置的一个对应关系,vocabulary_的输出可以看出每个特征词和TD-IDF矩阵列的对应关系:
每列对应的词
# get_feature_names():返回特征列表
vectorizer.get_feature_names()
输出格式为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
from gensim import corpora, models
# 生成文档对应的字典和bow稀疏向量
dictionary = corpora.Dictionary(data)
corpus = [dictionary.doc2bow(text) for text in data] # 仍为list in list
corpus
tfidf_model = models.TfidfModel(corpus) # 建立TF-IDF模型
corpus_tfidf = tfidf_model[corpus] # 对所需文档计算TF-IDF结果
corpus_tfidf
# 查看第一个文档的结果
corpus_tfidf[0] # 列出所需文档的TF-IDF计算结果
dictionary.token2id # 列出字典内容
PageRank算法:Page&Brin
如果一个网页被很多其他网页链接到,说明这个网页比较重要,也就是PageRank值会相对较高
如果一个PageRank值很高的网页链接到个其他网页,那么被链接网页的PageRank值会相应地因此而提高
一般用于网页排名
如果用于文档关键词的提取,就是从PageRank到TextRank
和基于词频相比,TextRank进一步考虑了文档内词条间的语义关系
基本原理
jieba.analyse.textrank(
sentence, topK=20, withWeight=False,
allowPOS=('ns', 'n', 'vn', 'v')
) # 注意默认过滤词性
例.
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)
至此
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。