关键词提取(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,k At,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 − α ) ∣ V ∣ + α ∗ ∑ V j ∈ I n ( V i ) 1 ∣ O u t ( V j ) ∣ S ( V j ) S(V_i) = \frac{(1-\alpha)}{|V|} + \alpha* \sum_{V_j \in In(V _i)} \frac{1}{\begin{vmatrix}Out(V_j)\end{vmatrix}}S(V_j) S(Vi)=V(1α)+αVjIn(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指出节点的总数。为了保证PageRank(或者随机游走)不会死循环到一个环出不来,增加了一个随机因子 α \alpha α α \alpha α表示不进行随机跳转的概率。让我们看看,上图节点 e e e的权重分值计算过程。
首先我们可以用一个矩阵表示图中节点 a , b , e , f a, b, e, f a,b,e,f的连接关系:

abef
a0000
b0000
e1100
f0100

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

abef
a0000
b0000
e10.500
f00.500

然后我们用这个矩阵去乘以每个节点的权重,最开始,每个节点的权重初始化都为1,如下计算:
[ 0 0 0 0 0 0 0 0 1 0.5 0 0 0 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\\0& 0.5 & 0 &0\end{bmatrix} * \begin{bmatrix} 1 \\ 1 \\1 \\1 \end{bmatrix} = \begin{bmatrix} 0 \\0 \\ 1.5 \\ 0.5 \end{bmatrix} 0010000.50.500000000 1111 = 001.50.5
这只是一次迭代,加入衰减因子 α \alpha α,python迭代多次结果如下:

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


def pagerank(graph):
	'''
		简单实现pagerank迭代过程
	'''
	pr = np.array([1, 1, 1, 1]) #init node
	a = 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 − α ) ∣ V ∣ + α ∗ ∑ 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) = \frac{(1-\alpha)}{|V|} + \alpha* \sum_{V_j \in In(V_i)} \frac{w_{ji}} {\sum_{v_k \in Out(V_j) }w_{jk}} WS(V_j) WS(Vi)=V(1α)+αVjIn(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) pipj 1
    其中 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权重的关键词效果:
    在这里插入图片描述

更多关于关键词,term weight分值计算,可以参考我的另外一篇blog: 词权重 (term weight) 方法总结

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

TF-IDF (Term Frequency-Inverse Document Frequency) is a statistical measure used to evaluate the importance of a word in a document or corpus. It is commonly used for keyword extraction in text mining and information retrieval. The process of TF-IDF keyword extraction involves calculating the frequency of each word in a document or corpus, and then weighting the frequency based on how frequently the word appears in the entire corpus. This helps to identify the most important and relevant words in a given document or corpus. Here are the steps to extract keywords using TF-IDF: 1. Tokenize the text: Break the text into individual words or tokens. 2. Remove stop words: Remove common words such as "the", "a", "an", etc. that do not add much meaning to the text. 3. Calculate term frequency: Count the number of times each word appears in the document. 4. Calculate inverse document frequency: Calculate the logarithm of the ratio of the total number of documents in the corpus to the number of documents containing the word. 5. Multiply term frequency by inverse document frequency: Multiply the term frequency by the inverse document frequency to get the TF-IDF score for each word. 6. Sort the words by TF-IDF score: Rank the words in descending order based on their TF-IDF score. 7. Select top keywords: Choose the top keywords based on the desired number of keywords or a threshold TF-IDF score. Example: Consider the following sentence: "The quick brown fox jumps over the lazy dog." 1. Tokenize the text: ["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"] 2. Remove stop words: ["quick", "brown", "fox", "jumps", "lazy", "dog"] 3. Calculate term frequency: quick=1, brown=1, fox=1, jumps=1, lazy=1, dog=1 4. Calculate inverse document frequency: log(1/1)=0 for all words 5. Multiply term frequency by inverse document frequency: quick=0, brown=0, fox=0, jumps=0, lazy=0, dog=0 6. Sort the words by TF-IDF score: ["quick", "brown", "fox", "jumps", "lazy", "dog"] 7. Select top keywords: ["quick", "brown", "fox", "jumps", "lazy", "dog"] (all words have the same TF-IDF score of 0) In this example, all words have the same TF-IDF score, as they appear only once in the sentence and there is no other document in the corpus to compare them to. In a larger corpus, some words would have higher TF-IDF scores and would be considered more important keywords.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值