在上一篇博客中,介绍了关键词提取的无监督方法:点击这里查看文章。本篇主要是介绍关键词提取的有监督方法。
可以从如下角度去做有监督学习:
- 二分类模型:短语是否为关键短语。
- LTR(learn to rank):学习排序模型,选取top K 的作为关键短语。
- encoder-decoder:类似翻译的思想,将文本作为源语言,关键短语作为目标语言。
- 序列标注:类似于实体识别的思路,实体识别提取实体词,这里提取关键短语。
对于上述的每种方法,都用1~2个模型去说明。
特征
二分类模型可以利用上述特征,构建二分类模型,判断短语是否为关键短语。与之相关的,可以看一下KEA: Practical Automatic Keyphrase Extraction这篇论文,它使用tf-idf值与位置信息作为特征,以朴素贝叶斯作为二分类模型,从而判断某个短语是否为关键短语。
LTR
RankingSVM
A Ranking Approach to Keyphrase Extraction使用RankingSVM来建模该问题。
使用的特征:
The features include TF-IDF score, phrase length, position of phrase’s first occurrence, phrase’s appearance in document title, uniformity of phrase’s distribution within document (measured by entropy), frequency of most and least frequent word of phrase, etc.
rankingsvm简介:
rankingsvm是一种pointwise的排序算法。给定文档 d d d,关键词 k 1 > k 2 > k 3 k_1>k_2>k_3 k1>k2>k3,意味着关键词 k 1 k_1 k1比 k 2 , k 3 k_2,k_3 k2,k3都更相关。令 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3是 k 1 , k 2 , k 3 k_1,k_2,k_3 k1,k2,k3的特征,则, x 1 − x 2 , x 1 − x 3 , x 2 − x 3 x_1-x_2,x_1-x_3,x_2-x_3 x1−x2,x1−x3,x2−x3为正样本; x 2 − x 1 , x 3 − x 1 , x 3 − x 2 x_2-x_1,x_3-x_1,x_3-x_2 x2−x1,x3−x1,x3−x2为负样本。那么问题就重新转变为分类问题。可用SVM进行分类。
Bert-KPE
Capturing Global Informativeness in Open Domain Keyphrase Extraction,中使用了Pairwise ranking loss作为其rank损失。具体的论文分析,详见我的博客。
Encoder-Decoder
论文Deep Keyphrase Generation中使用encoder-decoder完成关键词的抽取。
Deep Keyphrase Generation的源码地址。
Deep Keyphrase Generation:
问题定义:
假设语料库中包含N条语料,对于其中的第
i
i
i条语料,定义为
(
x
(
i
)
,
p
(
i
)
)
(x^{(i)},p^{(i)})
(x(i),p(i)),其中
x
(
i
)
x^{(i)}
x(i)是源文本,而
p
(
i
)
p^{(i)}
p(i)是长度为
M
i
M_i
Mi的向量(
M
i
M_i
Mi表示目标关键短语的数目),那么
p
(
i
)
=
(
p
(
i
,
1
)
,
⋯
,
p
(
i
,
M
i
)
)
p^{(i)}=(p^{(i,1)},\cdots,p^{(i,M_i)})
p(i)=(p(i,1),⋯,p(i,Mi))。对于源文本和关键短语,都可以将其拆分为word level的表示,因此,有:
(
x
(
i
)
,
p
(
i
)
)
(x^{(i)},p^{(i)})
(x(i),p(i))可以转变为
M
i
M_i
Mi个对:
(
(
x
i
,
p
(
i
,
1
)
)
,
⋯
,
(
x
i
p
(
i
,
M
i
)
)
)
((x^{i},p^{(i,1)}),\cdots,(x^{i}p^{(i,M_i)}))
((xi,p(i,1)),⋯,(xip(i,Mi))),为了方便起见,将这些pair用
(
x
,
y
)
(x,y)
(x,y)表示。
encoder-decoder model:
encoder部分,目标是获得源文本的表征
c
c
c。
c
c
c的计算方式如下:
其中,
f
,
q
f,q
f,q都是非线性函数。得到文本的表征后,利用
c
c
c对其进行解码。于是有:
decoder部分:将
c
c
c解码成变长
y
=
(
y
1
,
y
2
,
⋯
,
y
T
′
)
y=(y_1,y_2,\cdots,y_{T'})
y=(y1,y2,⋯,yT′)。
s
t
s_t
st是decoder RNN在时刻t的隐状态。g是一个softmax函数。
encoder 和 decoder 的细节:
值得一提的是,在实际工作中,将encoder部分转变为双向GRU得到
H
H
H,decoder使用前向GRU得到
S
S
S。除此之外,生成表征时可以使用attention机制:
Copying Mechanism:
为了保证学到的表征的质量以及减少词库的大小,一般来说,RNN只会包含30000个常用的词,有大量的长尾词被忽略了(英文情况),这会使得decoder没法生成包含未登陆词的短语。而重要的短语其实与其所在的位置以及语法信息有关,Copying Mechanism通过从原文中获取word,从而能够输出OOV,但包含在源文本中的词。
那么,新的概率分布定义如下:
p
g
p_g
pg表示生成词的概率,
p
c
p_c
pc表示复制词的概率:
这样的话,从某种程度来说解决了OOV问题,也会让模型优先考虑已经出现的词(因为大多数的关键词往往出现在源文本中)。
序列标注
BiLSTM-CRF:
这里将问题转变为序列标注问题。比如,可以将关键词或者关键词短语标注出来,其余的词标注为other。这样就与命名实体识别任务相同了。具体的关键词抽取实践请看这里。
关于序列标注的更多细节,可以看我的下一篇博客: 命名实体识别。
参考
https://zhuanlan.zhihu.com/p/163426574
https://www.cnblogs.com/kemaswill/p/3241963.html
https://cloud.tencent.com/developer/article/1528457