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数据分析--玩转文本挖掘