关键词提取(keyword extraction)技术

1 统计方法(Statistical Method)

基于统计方法的核心思想就是计算文本中每个term的分值,有了分值,就可以对所有的term进行排序,然后获取top n个分值最大的term作为文本的关键词。不同的统计方法计算每个term的分值方式不同。

1.1 TF

Term-Frequency(TF)词频是最简单的一种方法,通过词在文档里出现的频率进行分值计算。虽然方法简单,却是一种很有效的方法获取文档中的重要主题topics。每个term的分值计算如下:
t f w o r d = N w o r d N a l l tf_{word} = \frac{N_{word}}{N_{all}} tfword=NallNword
其中, N w o r d N_{word} Nword表示该词在文本中出现的次数, N a l l N_{all} Nall表示整个文本的单词频率数。
基于词频的主要问题在于,没有考虑结构化和语义信息,同时也不能区分同义词,而且有些停用词在所有文档出现的频率都很高

1.2 TFIDF

TF-IDF是一种很简单但却很有效的方法,计算文本中的每个term会考虑两个因素。一是term本身在文档中的词频,这就是上小结提到的TF,另一个是倒文本频率(Inverse Document Frequency)IDF,这个指标衡量的是有多少文本包含了该term。IDF主要用来惩罚那些在很多文本中都有出现的term,往往这些term都是一些无关紧要的停用词等。
TF-IDF的数学公式如下:
t f i d f w o r d = t f w o r d ∗ l o g ( D D w o r d ) tfidf_{word} = tf_{word} * log(\frac{D}{D_{word}}) tfidfword=tfwordlog(DwordD)
其中 D D D表示整个文档的数量。 D w o r d D_{word} Dword表示包含该word的文档数量,从公式可以看出, D w o r d D_{word} Dword越大,整个分值就越小。tfidf整个核心思想就是,term在一个文档的重要程度取决于该term在该文档的频率和在其它文档的出现的次数。

1.3 YAKE

A Text Feature Based Automatic Keyword
Extraction Method for Single Documents

YAKE(Yet Another Keyword Extractor)是一种无监督的关键词提取算法,特征提取主要考虑五个因素(去除停用词后):

  • 大写term(Casing):大写字母的term(除了每句话的开头单词)的重要程度比那些小写字母的term重要程度要大
    T c a s e = m a x ( T F u , T F a ) T F T_{case} = \frac{max(TF_u, TF_a)}{TF} Tcase=TFmax(TFu,TFa)
    其中, T F u TF_u TFu表示该词的大写次数, T F a TF_a TFa表示该词的缩写次数。
  • 词的位置(Word Position):文本越开头的部分句子的重要程度比后面的句子重要程度要大
    T p o s i t i o n = l o g 2 ( l o g 2 ( 2 + M e d i a n ( S e n t ) ) ) T_{position} = log_2(log_2(2 + Median(Sen_t))) Tposition=log2(log2(2+Median(Sent)))
    其中 M e d i a n ( S e n t ) Median(Sen_t) Median(Sent)表示包含该词的所有句子在文档中的位置中位数。
  • 词频(Term Frequency): 一个词在文本中出现的频率越大,相对来说越重要,同时为了避免长文本词频越高的问题,会进行归一化操作
    T F n o r m = T F ( t ) M e a n T F + 1 ∗ σ TF_{norm} = \frac{TF_{(t)}}{MeanTF + 1*\sigma} TFnorm=MeanTF+1σTF(t)
    其中,MeanTF是整个词的词频均值, σ \sigma σ是标准差
  • 上下文关系(Term Related to Context):一个词与越多不相同的词共现,该词的重要程度越低
    D L [ D R ] = ∣ A t , w ∣ ∑ k ∈ A t , w C o O c c u r   t , k DL[DR] = \frac{\begin{vmatrix}A_{t,w} \end{vmatrix}}{\sum_{k\in A_{t,w}}CoOccur\text{ } t,k} DL[DR]=kAt,wCoOccur t,kAt,w
    T R e l = 1 + ( D L + D R ) ∗ T F ( t ) M a x T F T_{Rel} = 1 + (DL +DR) * \frac{TF(t)}{MaxTF} TRel=1+(DL+DR)MaxTFTF(t)
    其中 D L DL DL表示窗口size为 w w w从左边滑动, D R DR DR表示从右边滑动。 ∣ A t , w ∣ \begin{vmatrix}A_{t,w} \end{vmatrix} At,w表示出现在固定窗口大小为 w w w下,出现不同的词的个数。 M a x T F MaxTF MaxTF表示所有词频的最大值。
  • 词在句子中出现的频率(Term Different Sentence):一个词在越多句子中出现,相对更重要
    T S e n t e n c e = S F ( t ) S e n t e n c e a l l T_{Sentence} = \frac{SF(t)}{Sentence_{all}} TSentence=SentenceallSF(t)
    其中 S F ( t ) SF(t) SF(t)是包含词 t t t的句子频率, S e n t e n c e a l l Sentence_{all} Sentenceall表示所有句子数量。
    最后计算每个term的分值公式如下:
    S ( t ) = T R e l ∗ T P o s i t i o n T c a s e + T F n o r m T R e l + T S e n t e n c e T R e l S(t) = \frac{T_{Rel}*T_{Position}}{T_{case}+\frac{TF_{norm}}{T_{Rel}}+\frac{T_{Sentence}}{T_{Rel}}} S(t)=Tcase+TRelTFnorm+TRelTSentenceTRelTPosition

S ( t ) S(t) S(t)表示的是单词 t t t的分值情况,其中 s ( t ) s(t) s(t)分值越小,表示的单词 t t t越重要。

2 图方法(Graph Based Approaches)

2.1 PageRank

在介绍TextRank之前,让我们先来回顾下PageRank,假设有如下图:
在这里插入图片描述
计算每个节点的公式如下:
S ( V i ) = ( 1 − d ) + d ∗ ∑ j ∈ I n ( V i ) 1 ∣ O u t ( V j ) ∣ S ( V j ) S(V_i) = (1-d) + d* \sum_{j \in In(V _i)} \frac{1}{\begin{vmatrix}Out(V_j)\end{vmatrix}}S(V_j) S(Vi)=(1d)+djIn(Vi)Out(Vj)1S(Vj)
其中 S ( V i ) S(V_i) S(Vi)表示网页 i i i的权重分值, I n ( V i ) In(V_i) In(Vi)表示指向节点 V i V_i Vi的节点, O u t ( V j ) Out(V_j) Out(Vj)表示节点 V j V_j Vj指出的节点。 ∣ O u t ( V j ) ∣ \begin{vmatrix}Out(V_j)\end{vmatrix} Out(Vj)表示节点 V j V_j Vj指出节点的总数。
让我们看看,上图节点 e e e的权重分值计算过程。
首先我们可以用一个矩阵表示图中节点 a , b , e , f a, b, e, f a,b,e,f的连接关系:

a b e f
a 0 0 0 0
b 0 0 0 0
e 1 1 0 0
f 0 1 0 0

每一行代表该指向该节点的节点,每一列代表该节点指向其它的节点。根据上面的公式 1 ∣ O u t ( V i ) ∣ \frac{1}{\begin{vmatrix}Out(V_i)\end{vmatrix}} Out(Vi)1,需要对每一列进行归一化,所以调整如下:

a b e f
a 0 0 0 0
b 0 0 0 0
e 1 0.5 0 0
f 0 0.5 0 0

然后我们用这个矩阵去乘以每个节点的权重,最开始,每个节点的权重初始化都为1,如下计算:
[ 0 0 0 0 0 0 0 0 1 0.5 0 0 ] ∗ [ 1 1 1 1 ] = [ 0 0 1.5 0.5 ] \begin{bmatrix}0 &0 &0 &0\\ 0 & 0 & 0 &0 \\ 1& 0.5 & 0 &0\end{bmatrix} * \begin{bmatrix} 1 \\ 1 \\1 \\1 \end{bmatrix} = \begin{bmatrix} 0 \\0 \\ 1.5 \\ 0.5 \end{bmatrix} 001000.50000001111=001.50.5
这只是一次迭代,加入衰减因子 d d d,python迭代多次结果如下:

# -*-coding:utf8 -*-
import sys
import numpy as np 


def pagerank(graph):
	'''
		简单实现pagerank迭代过程
	'''
	pr = np.array([1, 1, 1, 1]) #init node
	d = 0.85   
	for iter in range(10):
		pr = (1-d) + d * np.dot(graph, pr)
		print(iter)
		print(pr)


if __name__=='__main__':
	graph = np.array([[0,0,0,0],
					  [0,0,0,0],
					  [1, 0.5, 0, 0],
					  [0,0.5,0,0]])
	pagerank(graph)

output:
在这里插入图片描述
最后节点 e e e的PageRank分值为0.34125。

2.2 TextRank

TextRank: Bringing Order into Texts
TextRank算法是基于PageRank算法,PageRank算法,其中图的节点是网页,而TextRank是词。
最原始的PageRank算法是无权重的图,而TextRank是有权重的图。因此,节点的权重分值计算和PageRank比变动如下:
W S ( V i ) = ( 1 − d ) + d ∗ ∑ V j ∈ I n ( V i ) w j i ∑ v k ∈ O u t ( V j ) w j k W S ( V j ) WS(V_i) = (1-d) + d* \sum_{V_j \in In(V_i)} \frac{w_{ji}} {\sum_{v_k \in Out(V_j) }w_{jk}} WS(V_j) WS(Vi)=(1d)+dVjIn(Vi)vkOut(Vj)wjkwjiWS(Vj)
其中 w i j w_{ij} wij表示了节点 V j V_j Vj与节点 V j V_j Vj之间的边连接权重。
接下来看TextRank算法的步骤流程:

  • 预处理:文本分词,然后用标注工具进行标注,获取重要的词性
  • 构建图:将处理后的词作为图的节点,边根据这些词是否在一个滑动窗口共现,进行边的连接。初始各节点权重都为1,然后用上述计算公式进行迭代
  • 计算分值:所有unigrams(节点)权重分值计算完后,选取top个节点,再根据设置的窗口大小,计算更高的n-gram关键词分值,最后根据分值,获取top K个关键词

2.2 SingleRank

CollabRank: Towards a Collaborative Approach to Single-Document Keyphrase Extraction
SingleRank是PageRank的变体,主要有两个变化:

  • 第一:不同于PageRank,每个边都有相同的分值,SingleRank会根据窗口大小词之间的距离计算不同的边权重
  • 第二:与TextRank不同的是,SingleRank保留所有的unigrams词,然后类似TextRank方法,滑动窗口方式计算更高的n-grams词,背后的原理是,两个分值较低的unigram,有可能产生较高分值的bi-gram。

2.3 TopicRank

TopicRank: Graph-Based Topic Ranking for Keyphrase Extraction
TopicRank把主题当做相似关键短语的簇,这些topics会根据在文档的重要性进行排序,然后选取top 个最相关的topics,每个topic选择一个最重要的关键短语来代表文档的核心关键词。
TopicRank算法的步骤如下:

  • 主题识别:主要抽取名词短语来表征文档的主题,短语中有超过25%重合的单词就考虑为相似短语,用 Hierarchical Agglomerative Clustering (HAC) algorithm进行了聚类相似的短语。
  • 图构建:这里的图中的节点是topics,边的权重,根据两个topics t i , t j t_i, t_j titj之间的语义关系进行分配,而语义关系的强弱根据两个主题的关键短语之间的距离公式,具体计算如下:
    w i , j = ∑ c i ∈ t i ∑ c j ∈ t j d i s t ( c i , c j ) w_{i,j} = \sum_{c_i \in t_i} \sum_{c_j \in t_j} dist(c_i, c_j) wi,j=citicjtjdist(ci,cj)
    d i s t ( c i , c j ) = ∑ p i ∈ p o s ( c j ) ∑ p j ∈ p o s ( c j ) 1 ∣ p i − p j ∣ dist(c_i, c_j) = \sum_{p_i \in pos(c_j)} \sum_{p_j \in pos(c_j)} \frac{1}{\begin{vmatrix} p_i-p_j \end{vmatrix}} dist(ci,cj)=pipos(cj)pjpos(cj)pipj1
    其中 d i s t ( c i , c j ) dist(c_i, c_j) dist(ci,cj)表示关键短语 c j c_j cj c j c_j cj在文档中的偏移距离。 p o s ( c i ) pos(c_i) pos(ci)表示关键短语 c i c_i ci的所有偏移位置。TopicRank不需要设置窗口,而是通过计算位置偏移距离。
  • 关键短语选择:一旦topic进行排序后,选择top K个topics,每个topic选择一个最重要的关键短语作为输出,所有topics总共产生top K个关键短语。有三个策略选择一个topic最适合的关键短语:第一:选择关键短语中最开始出现在文档的那个关键短语;第二:选择频率最高的那个关键短语;第三:选择聚焦的群簇中心的那个关键短语

2.4 PositionRank

PositionRank: An Unsupervised Approach to Keyphrase Extraction from Scholarly Documents
PositionRank也是一种基于图结构的算法,根据词的位置和词频来计算每个词的分值。算法主要三个部分组成:

  • 图的构建:类似TextRank,根据POS选择关键词构建图的节点,节点的边根据窗口size共现次数来计算两个词的边的权重分值。
  • Position-Biased PageRank
    假设 G G G是一个按照上述方法构建的无方向图, M M M是它的邻接矩阵, m i j ∈ M m_{ij} \in M mijM是节点 ( v i , v j ) (v_i, v_j) (vi,vj)之间的边的权重,若不存在边,则为0。PageRank计算节点 v i v_i vi的分值,是不断迭代计算所有指向 v i v_i vi节点的分值之后。
    S S S为PageRank分值,对于所有 v i ∈ V v_i \in V viV的节点,初始 S S S每个元素值都为 1 ∣ V ∣ \frac{1}{\begin{vmatrix} V \end{vmatrix}} V1。PageRank在 t + 1 t+1 t+1步计算每个节点的分值迭代公式如下:
    S ( t + 1 ) = M ~ . S ( t ) S(t+1) = \tilde M . S(t) S(t+1)=M~.S(t)
    其中 M ~ \tilde M M~ 是矩阵 M M M归一化矩阵,其中 m i j ~ ∈ M ~ \tilde{m_{ij}} \in \tilde M mij~M~定义如下:
    m i j ~ = { m i j / ∑ j = 1 ∣ V ∣ m i j    i f ∑ j = 1 ∣ V ∣ m i j ≠ 0 0    o t h e r w i s e \tilde{m_{ij}} = \begin{cases} m_{ij} / \sum_{j=1}^{\begin{vmatrix} V \end{vmatrix}} m_{ij} \text{ }\text{ } if \sum_{j=1}^{\begin{vmatrix} V \end{vmatrix}}m_{ij}\ne 0 \\\\ 0 \text{ } \text{ } otherwise \end{cases} mij~=mij/j=1Vmij  ifj=1Vmij=00  otherwise

为了保证PageRank(或者随机游走)不会死循环到一个环出不来,一个衰减因子 a a a允许跳入到任何一个节点中去。所以迭代更新公式如下:
S = a . M ~ . S + ( 1 − a ) . p ~ S = a. \tilde M. S + (1-a).\tilde p S=a.M~.S+(1a).p~
其中 p ~ \tilde p p~是一个长度为 ∣ V ∣ \begin{vmatrix} V \end{vmatrix} V,每个元素值为 1 ∣ V ∣ \frac{1}{\begin{vmatrix} V \end{vmatrix}} V1的向量。
Position-Biased PageRank会根据每个词的位置的导数计算权重,若一个词出现在文档多个位置,则分值相加。核心思想是:越在一个文档靠前的位置,权重越大,同时频率出现越高,权重也越大。
假设一个词在文档的位置时第二,第五,第10,则权重分值为:1/2+1/5+1/10=0.8。再进行归一化,则向量 p ~ \tilde p p~的计算公式如下:
p ~ = [ p 1 p 1 + p 2 + . . . + p ∣ V ∣ , p 2 p 1 + p 2 + . . . + p ∣ V ∣ , . . . , p v p 1 + p 2 + . . . + p ∣ V ∣ ] \tilde p = \begin{bmatrix} \frac{p_1}{p_1+p_2+...+p_{\begin{vmatrix} V\end{vmatrix}}} , \frac{p_2}{p_1+p_2+...+p_{\begin{vmatrix} V\end{vmatrix}}} , ...,\frac{p_v}{p_1+p_2+...+p_{\begin{vmatrix} V\end{vmatrix}}} \end{bmatrix} p~=[p1+p2+...+pVp1,p1+p2+...+pVp2,...,p1+p2+...+pVpv]
最后迭代计算公式如下:
S ( v i ) = ( 1 − a ) . p i ~ + a . ∑ v j ∈ A d j ( v i ) w j i O ( v j ) S ( v j ) S(v_i) = (1-a). \tilde{p_i} +a . \sum_{v_j \in Adj(v_i)} \frac{w_{ji}}{O(v_j)} S(v_j) S(vi)=(1a).pi~+a.vjAdj(vi)O(vj)wjiS(vj)
其中 O ( v j ) = ∑ v k ∈ A d j ( v j ) w j k O(v_j) = \sum_{v_k \in Adj(v_j)}w_{jk} O(vj)=vkAdj(vj)wjk p i ~ \tilde{p_i} pi~是向量 p ~ \tilde p p~节点为 v i v_i vi的权重。
当相邻两次迭代差异很小,或者迭代达到一个最大迭代次数时,则停止迭代。

3 语义模型(Semantic Models)

基于语义模型的关键词或者短语提取,一般是有监督学习,把关键词提取当做一个标注任务,判断该词是关键词还是不是关键词;或者通过对文本进行分类,基于attention层自动学习文本中的每个词的权重分值,根据分值高低提取关键词。这些方法都是有监督学习,训练模型需要有标签的数据。

  1. Keyphrase Extraction Using Deep Recurrent Neural Networks on Twitter
    该论文发表在2016年 EMNLP上,本文基于一个2层的RNN模型将关键词和关键短语提取当做一个标注分类任务,判断每个词是否是关键词或者关键短语。模型的第一层用来做关键词识别任务,第二层用来做关键短语识别任务,最后将两个任务损失函数进行权重融合,作为最终的损失函数:
    J ( θ ) = a J 1 ( θ ) + ( 1 − a ) J 2 ( θ ) J(\theta) = aJ_1(\theta) + (1-a)J_2(\theta) J(θ)=aJ1(θ)+(1a)J2(θ)
  2. Progress Notes Classification and Keyword
    Extraction using Attention based Deep Learning
    Models with BERT

    本论文基于BERT+attention Layer通过对文本进行分类,利用attention层自动学习文本中的每个词的权重,根据词的权重,可以获取与文本主题相关的关键词,下图是截取论文中提供的高attention权重的关键词效果:
    在这里插入图片描述

附上一个关键词提取Tools:The 6 Best Keyword Extraction Tools & How to Use Them

猜你喜欢

转载自blog.csdn.net/BGoodHabit/article/details/108926383