《Term Weighting Approaches in Automatic Text Retrieval》
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。其计算公式如下:
其中, TF表示词频(Term Frequency) , IDF表示逆向文件频率(Inverse Document Frequency) 。 TF表示词在文档d中出现的频率 ,而IDF的主要思想是:如果包含词t的文档越少,IDF越大,则说明词条t具有很好的类别区分能力。
词频(TF) 指的是某一个给定的词语在该文件中出现的频率。这个数字是对 词数 (term count)的归一化,以防止它偏向长的文件。对于在某一特定文件里的词语来说,它的重要性可表示为:
其中分子是该词在文件中的出现次数,而分母则是在文件中所有字词的出现次数之和
逆向文件频率(IDF) 指的是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到:
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。其计算公式如下:
TF-IDF算法基于假设 :对区别文档最有意义的词语应该是那些在文档中出现频率高,而在整个文档集合的其他文档中出现频率少的词语,因此引入TF词频作为测度,就可以体现同类文本的特点;另外考虑到单词区别不同类别的能力,TF-IDF法认为一个单词出现的文本频数越小,它区别不同类别文本的能力就越大,因此引入了逆文本频度IDF的概念,以TF和IDF的乘积作为特征空间坐标系的取值测度,完成对TF权重的调整,其目的在于突出重要单词,抑制次要单词。 本质上IDF是一种试图抑制噪音的加权 ,且单纯认为文本频数小的单词就越重要,文本频数大的单词就越无用,显然并不完全正确。IDF的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好地完成对权值调整的功能,所以TF-IDF法的精度并不是很高。此外,在TF-IDF算法中并没有体现出单词的位置信息,特征词在不同的位置对文章内容的反映程度不同,其权重的计算方法也应不同。
使用TF_IDF模型实现文本摘要任务,具体思想如下 :
《TextRank: Bringing Order into Texts》
最经典的TextRank通过将文本建模成无向全连接图结构,在图上利用PageRank迭代计算每个节点的重要性分数,从而能够提取关键节点。对于关键词提取而言, 图上的每个节点即为文档的词,边则代表词和词之间的共现关系,即在长度为N的滑动窗口内部的所有词认为是存在共现关系的 ,这些词也就相互之间有边连接。这里构造的图是无边权的,计算节点V_i的PageRank分数的方法如下式,d的存在目的是为了使模型有一定的概率跳到图上其它随机点上,避免孤立点计算出现死循环,一般取d=085,初始节点分数均为1。注意下式是迭代计算的,一般设为20次:
对于关键句提取而言,图上的节点代表文档中的句子,边权则用下式计算,其中S_i,S_j为两个句子,w_k代表句子中的词,也即节点边权定义为和两个句子词重叠率成正比,之所以还要除以句子长度的对数之和, 是考虑到越长的句子越可能出现重叠的词 :
关键句提取中TextRank方法建立的图为带边权的图,因而以下式计算PageRank分数,这里w_{ij}即为节点V_i,V_j之间的边权大小,d的规定同上:
故,基于上述方法可知, TextRank方法是无监督的不需要训练
这里使用 sklearn 实现,使用TextRank抽取文档中的关键句,实现无监督提取文本摘要
A Robustly Optimized BERT Pretraining Approach
Roberta本质上是一个调到最优的bert模型。chinese-roberta-wwm-ext针对中文任务的特点,对roberta的训练策略进行了进一步的优化
整体改进 :
输入 :原始文本是一个句子,如“使用语言模型来预测下一个词的probability”,经过分词和随机mask后,会得到预处理文本“使 用 语 言 [MASK] [MASK] 来 [MASK] [MASK] 下 一 个 词 的 [MASK] [MASK] [MASK]”,这里采用了全词掩码策略
输出 :对[MASK]位置的词进行预测,输出概率值
预训练过程 :集成了RoBERTa和BERT-wwm的优点,对两者进行了一个自然的结合。 和之前本目录中的模型之间的区别如下:
Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
mT5是T5的多语言变体 ,已在包含101中语言的新的基于Common Crawl的数据集中进行了预训练。mT5的模型架构和训练过程与T5紧密相似,其改进点在于:使用GeGLU非线性(Shazeer,2020年)激活函数,在更大模型中缩放dmodel而不是改变dff, 对无标签数据进行预训练而没有dropout等措施。
本项目直接加载降级处理后的mT5模型(hugging Face库中对应的版本为:csebuetnlp/mT5_multilingual_XLSum), 输入文本通过tokenizer进行分词得到对应的token id (支持最大长度为512),然后调用generate函数,将编码的输入文本进行解码,目前项目在解码过程中的超参数设置如下:支持最大长度max_length=70, 解码所用的beam search所保留的beam值为4。然后将得到的generate token ids经过tokenizer解码生成具体预测的文本。
ROUGE英文全称 Recall-Oriented Understudy for Gisting Evaluation ,专注于 召回率而非精度 。N指的是N-gram,它会查看有多少个参考译句中的n元词组出现在了输出之中
公式的分母是统计在参考译文中N-gram的个数,而分子是统计参考译文与机器译文共有的N-gram个数。
对两个生成句和参考句(word piece进行tokenize)分别用bert提取特征,然后对2个句子的每一个词分别计算内积,可以得到一个相似性矩阵。基于这个矩阵,我们可以分别对参考句和生成句做一个最大相似性得分的累加然后归一化,得到bertscore的precision,recall和F1:
给测试集的句子赋予较高几率值的语言模型较好,当语言模型训练完以后,测试集中的句子都是正常的句子,那么训练好的模型就是在测试集上的几率越高越好,对于句子s
它的概率为:
困惑度与测试集上的句子概率相关,其基本思想是: 给测试集的句子赋予较高概率值的语言模型较好,当语言模型训练完之后,测试集中的句子都是正常的句子,那么训练好的模型就是在测试集上的概率越高越好 ,公式如下:
Intel Developer Forum(英特尔开发者论坛,简称IDF)是由英特尔公司主办的技术讲座,在美国、中国等7个地区举办,每年分秋冬举办两次。IDF主要由主题演讲、技术专题讲座以及技术展示组成,主题演讲的演讲者均是英特尔的高层人士,演讲的题目都具有相当的前瞻性,作为一家在处理器、网络处理器等领域处于领先地位的公司,IDF的确是让业界获悉英特尔最新动向的最佳场合。
本文内容主要摘自python machine learning 2nd edition
1、假设我们有以下三个文本
• 'The sun is shining'
• 'The weather is sweet'
• 'The sun is shining, the weather is sweet, and one and one is two
2、利用CountVectorizer类得到如下字典
{'and': 0,'two': 7,'shining': 3,'one': 2,'sun': 4,'weather': 8,'the': 6,'sweet': 5, 'is': 1 }
3、将步骤1的文档转换为矩阵
[[0 1 0 1 1 0 1 0 0]
[0 1 0 0 0 1 1 0 1]
[2 3 2 1 1 1 2 1 1]]
4计算tf-idf值
我们以is为例进行计算,is对应的是矩阵第二列。
tf值,表示term在该文本中出现的次数,这里即is在文本3出现的次数,很容易看出是3
idf值,sklearn做了小小的改动,公式是 (1+log ) 的意思就是文本总数(number of document),df(d,t)表示包含is 的文件数目,很明显,这里也是3这样,计算的结果为3(1+log )=3
需要注意的是,sklearn对结果进行了正则化处理。
最终得到的结果为
[[ 0 043 0 056 056 0 043 0 0 ]
[ 0 043 0 0 0 056 043 0 056]
[ 05 045 05 019 019 019 03 025 019]]
每一行的平方和均为1,这是l2正则化处理的结果。
另外可以看出,原先is的词频是 1 1 3,最终tf-idf值是043 043 045 。
one-hot 和 TF-IDF 是提取文本特征的最为常见的方法,下文主要介绍它们主要的思想以及优缺点。
11 one-hot编码
one-hot 编码,又称独热编码、一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。举个例子,假设我们有三个样本(行),每个样本有三个特征(列):
上表中我们已经对每个特征进行了普通的数字编码:我们的feature_1有两种可能的取值,比如是男/女,这里男用0表示,女用1表示。那么one-hot编码是怎么搞的呢?
我们再拿feature_2来说明:这里feature_2 有4种取值(状态),我们就用4个状态位来表示这个特征,one-hot编码就是保证每个样本中的单个特征只有1位处于状态1,其他的都是0。
对于两种状态、三种状态、甚至更多状态都是这样表示,所以我们可以得到这些样本特征的新表示:
one-hot 编码将每个状态位都看成一个特征。于是我们可以得到它们的特征向量分别为:
12 one-hot在提取文本特征上的应用
one-hot 在特征提取上属于词袋模型(bag of words)。关于如何使用 one-hot 抽取文本特征向量我们通过以下例子来说明。假设我们的语料库中有三段话:
我爱中国
爸爸妈妈爱我
爸爸妈妈爱中国
我们首先对语料库分离并获取其中所有的词,然后对每个此进行编号:
1 我; 2 爱; 3 爸爸; 4 妈妈;5 中国
然后使用 one-hot 对每段话提取特征向量:
因此我们得到了最终的特征向量为
优缺点分析:
优点 :
缺点 :
sklearn实现one hot encode
注意: 假如要进行编码的数据没有出现在对应列中将会出现错误
IF-IDF 是信息检索(IR)中最常用的一种文本表示法。算法的思想很简单,就是统计每个词出现的 词频(TF) ,然后再为其附上一个 权值参数(IDF) 。举个例子:
现在假设我们要统计一篇文档中的前10个关键词,应该怎么下手?首先想到的是统计一下文档中每个词出现的频率(TF),词频越高,这个词就越重要。但是统计完你可能会发现你得到的关键词基本都是“的”、“是”、“为”这样没有实际意义的词(停用词),这个问题怎么解决呢?你可能会想到为每个词都加一个权重,像这种”停用词“就加一个很小的权重(甚至是置为0),这个权重就是IDF。下面再来看看公式:
优缺点分析
优点:简单快速,结果比较符合实际
缺点:单纯考虑词频,忽略了词与词的位置信息以及词与词之间的相互关系。
sklearn 实现 tfidf
算
⾃然语⾔处理(⼀)--关键词提取
最近学习使⽤了传统的⾃然语⾔处理技术进⾏关键词的提取,接下来我介绍⼀下两种常⽤的算法:TFIDF和TextRank。⽬前BiLSTM 也可以⽤于提取⽂本关键词,有空再学。
1TF-IDF
TF-IDF(term frequency-inverse document frequency)是⼀种⽤于信息检索与数据挖掘的常⽤加权技术。TF-IDF是⼀种统计⽅法,⽤来评估⼀个字词对于⼀个⽂件集或语料库中的⼀份⽂件的重要程度。
⾸先解释⼀下TF-IDF的意思:
TF(term frequency):词语在⼀篇⽂章中出现的频率
IDF(inverse document frequency):反⽂档频率,与词语在其他⽂档中出现的频率负相关
TF-IDF的主要思想是:如果某个词或短语在⼀篇⽂章中出现的频率⾼,即TF值⾼;并且在其他⽂章中很少出现,即IDF值⾼,那么认为这个词或短语具有很好的类别区分能⼒,适合作为该⽂章的关键词。
TF-IDF的具体计算公式为:
⽂档中词的tfidf值越⾼,便认为该词越可以代表该⽂档的主题。TF-IDF算法的python实现如下,同时jieba库中也实现了TF-IDF,有兴趣的话也可以去了解⼀下。
# TF-IDf算法python实现
import re
import math
# 获取⼀个⽂档中每个词的TF值,doc参数保存⽂档中的句⼦列表,返回单词与其tf值的字典
# ⾸先对⽂档中的单词进⾏切分,然后统计每个词的词频
def GetWordTF(doc):
words_count =0# 单词总数
words_map ={}# 单词与单词数的映射
tf_map ={}# tf值映射词典,格式: tf_map[word] = tf_word
for sentence in doc:# 遍历⽂档中的每个句⼦
# 单词的切分⽅式可以根据所给的数据格式进⾏修改
# 我将提取英⽂句⼦中的每个单词,使⽤正则表达式提取并去除空字符串
words_arr =[word for word in resplit(r'\W+',sentence)if word]
words_count +=len(words_arr)# 统计有效词的总长度
for word in words_arr:# 遍历每⼀个词并进⾏统计单词数
words_map[word]= words_mapget(word,0)+1
for key,val in words_mapitems():# 计算每个单词的tf值
tf_map[key]= val / words_count
return tf_map
# 获取⽂档每个单词在⽂档集docSet中的IDF值映射
def GetWordIDF(tfMap,docSet):
docs_num =len(docSet)# ⽂档集中⽂档的总数
word_doc_num ={}# 包含word的⽂档数,格式为word_doc_num[word] = num of doc that contains word
idf_map ={}# idf值映射字典,格式idf_map[word] = idf_word
for key,val in tfMapitems():# 遍历⽂档中出现的单词
for doc in docSet:# 遍历每个⽂档,检查该⽂档中是否出现了单词key
for sentence in doc:# 遍历⽂档中的每个句⼦
words_arr =[word for word in resplit(r'\W+', sentence)if word]# 提取句⼦中的每个单词
if key in words_arr:# 如果该⽂档中有该词,则统计
word_doc_num[key]= word_doc_numget(key,0)+1
break
for key,val in word_doc_numitems():# 计算每个单词的idf值
idf_map[key]= mathlog(docs_num / val)
return idf_map
# 使⽤TFIDF算法获取⽂档的前topNum个关键词,其中每个⽂档是以列表表⽰的,列表项为⽂档的⼀个句⼦
def GetKeywordsByTFIDF(entityDescriptionList,docSet,topNum):
tf_map = GetWordTF(entityDescriptionList)# 获取每个单词的tf值
idf_map = GetWordIDF(tf_map,docSet)# 获取每个单词的idf值
tfidf_map ={}
for key,val in tf_mapitems():# 计算每个词的tfidf值
tfidf_map[key]= tf_map[key] idf_map[key]
tfidf_sorted_list =sorted(tfidf_mapitems(),key =lambda x:x[1],reverse=True)# 将字典按值从⼤到⼩排序
if topNum >len(tfidf_sorted_list):# 保证topNum不⼤于⽂档中词的总数
topNum =len(tfidf_sorted_list)
keywords =[]# 保存⽂档的前topNum个关键字
for i in range(topNum):
keywordsappend(tfidf_sorted_list[i][0])# 关键字保存在元组的第0个元素中
return keywords
2TextRank
TF-IDF算法对于有多段⽂本的关键词提取⾮常有效,但是对于单篇或⽂档集较少的⽂本则表现得不很好。对于单篇⽂档,可以使⽤TextRank算法实现关键词提取。
TextRank是⼀种基于图排序的算法,思想源于⾕歌的PageRank算法,通过把⽂本分割为若⼲组成单元(单词、句⼦)并建⽴图模型,利⽤投票机制对⽂本中的重要成分进⾏排序,仅利⽤单篇⽂档本⾝的信息即可实现关键词提取。
TextRank利⽤投票的原理,让每⼀个单词给它的邻居投赞成票,票的权重取决于⾃⼰的票数。假设每⼀个词是⼀个顶点(Vertex),那么所有的词就构成了⼀个⽹络,这个⽹络⾥⾯每个顶点会有指向其他顶点的边,也会有其他顶点指向⾃⼰的边。通过计算每个顶点所连接的指向⾃⼰的顶点的权重和,最终得到该顶点的权重值。
TextRank存在的主要问题是初始值的确定,为了后续计算的简便性,这⾥会给初值赋为⼀个⾮0值。同时,引⼊了⼀个阻尼系数的概念,该参数表⽰从某⼀个指定的顶点,到任意⼀个其他顶点的概率。TextRank的具体公式如下:
于是,使⽤TextRank算法提取关键词时,⾸先需要把图构建出来。图的节点就是单词,⾄于边可以利⽤n-gram的思路,认为某个单词只与它附近的n个单词有关,即与它附近的n个词对应的节点连⼀条⽆向边。也可以做⼀些其他 *** 作,⽐如把某类词性的词删掉,⼀些⾃定义词删掉,只保留⼀部分单词等。我的代码实现中,假设每个长为k的滑动窗⼝中的任意两个单词对应的节点之间存在⼀条⽆向⽆权边。当构图成功后,就可以使⽤上述公式进⾏迭代求解了。Python实现的代码如下:
# 使⽤TextRank算法实现关键词提取,返回关键词列表,参数含义如下:
# sentence 保存待提取关键字的句⼦
# windowLength 保存滑动窗⼝的⼤⼩
# topNum 表⽰需要返回排名前topNum的关键词
# d 表⽰textrank算法的阻尼系数,默认为085
# maxIter 表⽰算法最⼤迭代次数
# minDiff 迭代后变化值⼩于minDiff时也停⽌迭代
def GetKeywordsByTextRank(sentence,windowLength,topNum=3,d=085,maxIter=10000,minDiff=00001):
# 单词的切分⽅式可以根据所给的数据格式进⾏修改
# 我将提取英⽂句⼦中的每个单词,使⽤正则表达式提取并去除空字符串
words_arr =[word for word in resplit(r'\W+', sentence)if word]
words_num =len(words_arr)# 句⼦的长度
word_graph ={}# 保存每个单词的连接状态,格式为word_graph[word] = [与该词存在边的单词的集合]
textrank_map ={}# 保存每个textrank值的字典,格式为textrank_map[word] = textrank value of the word
textrank_map_t ={}# ⽤于保存前⼀次迭代的tankrank结果
for words_index in range(words_num):# 遍历句⼦中的每个单词,开始根据给定的窗⼝值构图
textrank_map[words_arr[words_index]]=1- d # 为每个词初始化⼀个textrank值
window_lower =max(0, words_index - windowLength)# 滑动窗⼝的下边界
window_upper =min(words_num, words_index + windowLength)# 滑动窗⼝的上边界
for window_index in range(window_lower,window_upper):# 遍历窗⼝中的单词,构建单词的连接关系
if window_index == words_index:# ⾃⼰与⾃⼰认为没有边
continue
if not words_arr[window_index]in word_graphget(words_arr[words_index],[]):# 检查两词节点之间是否有边
if word_graphget(words_arr[words_index],0)==0:# 检查该词的边集是否为空
word_graph[words_arr[words_index]]=[words_arr[window_index]]# 为空则⽣成包含该点的边集
else:
word_graph[words_arr[words_index]]append(words_arr[window_index])# 将该边添加到边集中
for iter_i in range(maxIter):# 利⽤textrank计算公式迭代计算
max_diff =0# 表⽰迭代前后两次的变化
for word,neibor_list in word_graphitems():# 遍历每个单词
for con_word in neibor_list:# 遍历与每个单词存在相邻关系的单词
con_word_out_len =len(word_graph[con_word])# 计算当前节点连接的节点个数
if word == con_word or con_word_out_len ==0:
continue# 如果是该节点本⾝或⽆连出节点则不更新
# 使⽤公式对textrank值进⾏更新
textrank_map[word]=1- d + d textrank_map_tget(con_word,0)/con_word_out_len
max_diff =max(max_diff,abs(textrank_map[word]-textrank_map_tget(word,0)))
for word,val in textrank_mapitems():
textrank_map_t[word]= val
if(max_diff < minDiff):# 各个单词节点的textrank值如果均⽆明显变化,则可结束迭代
break
textrank_sorted_list =sorted(textrank_mapitems(),key=lambda x:x[1],reverse=True)# 按照textrank值从⼤到⼩排序
if topNum >len(textrank_sorted_list):# 保证topNum不⼤于⽂档中词的总数
topNum =len(textrank_sorted_list)
if topNum <1:# 保证topNum⼤于0
topNum =1
keywords =[]# 保存将要返回的关键词
for i in range(topNum):
keywordsappend(textrank_sorted_list[i][0])
return keywords
可以看出TextRank算法对于⼀段⽂本中多次出现的词,会赋予更⼤的权重,因为它连出的节点更多,所以当各个节点初始权重⼀致时,则最终出现次数最多的词权重就会更⼤。这也会使该算法对类似于“的”、“你、我、他”等常⽤词,会出现⽐较⼤的误差。对于这种情况,可以在最开始构建边时进⾏处理,去掉⼀些停⽤词或者选择⾃⼰需要的词性的词,从⽽得出实际有⽤的词语。
后记:前端暂时不⽀持Latex,公式我只能贴图了。深度学习最近⽐较流⾏,还有很多需要学的呀!
百度文库VIP已帮您省69元现在恢复最低仅需03元/天
立即续费
自然语言处理(一)--关键词提取
⾃然语⾔处理(⼀)--关键词提取
最近学习使⽤了传统的⾃然语⾔处理技术进⾏关键词的提取,接下来我介绍⼀下两种常⽤的算法:TFIDF和TextRank。⽬前BiLSTM 也可以⽤于提取⽂本关键词,有空再学。
1TF-IDF
TF-IDF(term frequency-inverse document frequency)是⼀种⽤于信息检索与数据挖掘的常⽤加权技术。TF-IDF是⼀种统计⽅法,⽤来评估⼀个字词对于⼀个⽂件集或语料库中的⼀份⽂件的重要程度。
以上就是关于文本摘要方法全部的内容,包括:文本摘要方法、IT知识普及:什么是IDF、TF-IDF计算过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)