wangli's blog

  • Home

  • Tags

  • Categories

  • Archives

从阅读理解浅谈注意力机制

Posted on 2019-03-16 | Edited on 2019-03-17

1、从NLP中的3个任务说起

语义匹配(Semantic Matching)或者说语义相似度(Semantic Similarity)有许多应用场景:搜索引擎中的网页搜索,问答系统FAQ问答中的FAQ与用户query的匹配,feeds流中相似feeds的召回等等。
2013年发表的经典的DSSM模型为深度语义匹配问题提供了思路。DSSM解决的问题是利用搜索场景中query和网页点击数据,对文本语义相似度进行建模,从而对用户query召回相关网页。
参考文献[1]

这篇文章用DNN将高维sparse文本特征(one-hot,特征长度为整个数据库的词典长度),实际上是lexical级别的,表达为低维dense语义特征,然后利用cosine距离来计算两个文本的相似度。

自然语言推理(Natural Language Inference),或文本蕴涵(Textual Entailment, TE),解决的问题是分析推理前提(premise)与推理假设(hypothesis)之间是否存在蕴含(entailment)、矛盾(contradiction)或者中立(neutral)关系。下图为斯坦福大学提出的大规模自然语言推理任务数据集SNLI论文中的神经网络分类结构。
参考文献[2]

机器阅读理解(Machine Reading Comprehension) 主要包括多项选择(multiple choice questions)、完形填空(cloze style comprehension)、开放式问题(也叫短文本生成类问题;给出问题,从非结构化整理的文本中得到答案;具体又分为总结答案和答案来自原文两种类型)三种任务类型。下文提到的一些包含注意力机制的模型,主要是为解决开放式阅读理解问题。具体设定是输入问题,及给出的答案所在的文档段落,输出答案。下图是将神经网络引入阅读理解任务的三种结构:
参考文献[12]

可以看出,解决这些任务问题的深度神经网络结构框架可以简单概括为:

两路输入根据任务的不同可能是query与FAQ中的问题,前提与假设,或query与文档段落。表示层可以是预训练的embedding,DNN,RNN等各种设计。交互层也可以没有,由两路表示层的距离计算作为输出层。交互层可以是MLP,现在往往是各种类型的attention设计,网络层数各异,输出层根据不同的任务可以有不同的设计。

网络结构中,重点就是要做好表示和交互信息的表达了。语义匹配要建模两个句子的语义相似度,NLI要建模两个句子的推理信息,MRC要建模两个句子的问答关系,可见,交互信息层尤为重要,这里可以理解为是不同关系的matching。而注意力机制(attention mechanism,下文简称attention),是建模交互信息的重要方法。本文重点从阅读理解任务的角度,看看attention的一些不同设计。

2、sequence to sequence model

要说attention,不得不先提sequence to sequence model,从输入序列学习得到输出序列的一个general end-to-end的方法[4]。最早是在翻译任务中被提出应用。如下图所示,模型接受输入句子“ABC”,输出句子”WXYZ”。
参考文献[4]
Encoder将输入句子编码成一个固定长度的向量,解码端根据这个向量及之前时刻的输出信息,得到下一时刻的输出。
在Encoder-Decoder的框架里,编码器接受输入序列$x=(x_{t},…,x_{T_{x}})$,编码得到向量c:
$h_{t}=f(x_{t},h_{t})$
$c=q( \{ h_{1},…,h_{T_{x}} \} )$
解码端,模型根据在context vector c,及previous输出词语,预测下一个时刻的输出。
$p(y)=\prod_{t=1}^{T}p(y_{t}|\{ y_{1},…,y_{t-1} \},c) $

3、注意力机制

注意力机制(attention mechanism)有两种类型,soft及hard。Hard attention利用
按概率进行采样的方法决定“注意”哪些信息单元(如某个神经元的值)或“不注意”哪些信息单元。Soft attention则给各个信息单元都赋予权重系数,“注意力”更平滑。

本文在这里只讨论soft attention。attention在Handwriting Synthesis任务中被首
次提出[5]。Handwriting Synthesis即根据给定的文本,生成手写体。
引自参考文献5
在这篇文章中,其实没有提到attention的概念,文章中提的是condition,利用a “soft window”来控制text string的高维表达的不同权重。

Bahdanau[6]则把这个思路优雅地用在了NLP的machine translation里。文章提出的网络结构不是把整个输入句子编码成一个固定长度的向量,而是把输入序列encode成一个向量序列。
参考文献[6]
采用RNN结构,解码端的概率输出如下:
$p(y_{1},…,y_{i-1},\textbf{x})=g(y_{i-1},s_{i},c_{i})$
$s_{i}=f(s_{i-1},y_{i-1},c_{i})$

其中,context vector c由隐藏层向量h的带权加和得到:
$c_i=\sum_{j=1}^{T_{x}}{\alpha_{ij} h_{j}}$

其中,每个隐藏层向量h的权重α计算如下:
$\alpha_{ij}=\frac{exp⁡(e_{ij})}{\sum_{k=1}^{T_{x}} exp(e_{ik})}$
$e_{ij}=a(s_{i-1},h_{j})$

权重$\alpha_{ij}$表达从第j个输入序列隐藏层向量和第i-1个输出序列隐藏层向量来看,第j个输入序列隐藏层向量和第i个输出序列隐藏层向量的相关程度。宏观看来,即输入序列中第j个单词$x_{j}$对输出序列中第i个单词$y_{i}$的输出有多少影响。那么$c_{i}$就是输入序列中各个单词在输出第i个单词时的预期的影响程度系数(expected annotation)。a表示一个建模函数,在这里用a feed forward neural network实现。

4、attention的各种设计

4.1 attention over attention

参考文献[8]
这是哈工大的一篇论文[8],出发点是解决阅读理解中的完形填空问题。模型结构一目了然的。想用点乘的attention计算方式对document及query计算attention,然后计算column-wise及row-wise softmax,分别得到的query注意document,及document注意query的attention系数,然后再次利用点乘计算document及query的attention信息,此之谓attention over attention。

4.2 word-by-word matching

由match-lstm实现。match-LSTM最早提出是在文章[9]。其最初在Natural Language Inference(NLI)任务中被提出,用于获取假设(hypothesis)与前提(premise)的word-by-word matching,以对不同的词语给予合适的注意力权重。

传统的attention操作主要关注的是一个向量对另一个向量的“注意力”,文章指出在NLI问题中,这是利用a single vector representation of the premise,to match the entire hypothesis。

而这篇文章提出的模型整体的结构如下图所示:在传统的attention层上,设计了mLSTM层来建模matching,得到$h^{m}$。
参考文献[9]
其中,s上标表示premise的信息,t上标表示hypothesis的信息。可见每一个时刻,hypothesis的词语对premise的注意力权重都有所调整。计算公式如下:
$a_{k}=\sum_{j=1}^{M} \alpha_{kj}h_{j}^{s}$
$\alpha_{kj}=\frac {exp(e_{kj})} {\sum_{j^{‘}} exp(e_{kj_{‘}})}$
$e_{kj}=w^{s}tanh(W^{s}h_{j}^{s} + W^{t}h_{k}^{t} + W^{m}h_{k-1}^{m} )$
其中$h_{k}^{m}$ 由match-lstm得到。

下面介绍一下match-lstm。经典LSTM利用一些gate vectors来控制模型中序列信息的passing,公式如下:
$i_{k}=\sigma(W^{i} x_{k}+V^{i} h_{k-1} + b^{i}) $
$f_{k}=\sigma(W^{f} x_{k}+V^{f} h_{k-1}+b^{f} )$
$o_{k}=\sigma(W^{o} x_{k}+V^{o} h_{k-1}+b^{o})$
$c_{k}=f_{k}\odot c_{k-1}+i_{k}\odot tanh⁡(W^{c} x_{k}+V^{c} h_{k-1}+b^{c} )$
$h_{k}=o_{k}\odot tanh⁡(c_{k})$

Match-lstm公式如下:
$i_{k}^{m}=\sigma (W^{mi} m_{k}+V^{mi} h_{k-1}^{m}+b^{mi} )$
$f_{k}^{m}=\sigma (W^{mf} m_{k} + V^{mf} h_{k-1}^{m}+b^{mf} )$
$o_{k}^{m}=\sigma (W^{mo} m_{k}+V^{mo} h_{k-1}^{m}+b^{mo})$
$c_{k}^{m}=f_{k}^{m}\odot c_{k-1}^{m} + i_{k}^{m}\odot tanh⁡(W^{mc} m_{k}+V^{mc} h_{k-1}^{m}+b^{mc} )$
$h_{k}^{m}=o_{k}^{m}\odot tanh⁡(c_{k}^{m})$

与典型LSTM的区别在于控制单元c:
$m_{k}=\left[ \begin{array}{c}
a_{k}\
h_{k}^{t}
\end{array}\right ] $ 融合了对于hypothesis中第k个词语的attention-weighted的premise信息,以及hypothesis中第k个词语本身的信息。这里利用了LSTM来match the premise with the hypothesis using the hidden states,实现word-by-word matching。

同一作者的文章[10]将match-lstm及pointer net用于阅读理解的生成式任务,主要针对SQuAD数据集。
参考文献[10]
这是第一篇文章将end-to-end的神经网络模型引入开放式阅读理解问题。模型包括LSTM Preprocessing Layer, Match-LSTM layer, 以及Answer Pointer Layer。有了上面对match-lstm的解释,这个模型结构就一目了然了。其中Answer Pointer Layer输出层又包含The Sequence Model和The Boundary Model两种类型,前者生成答案文本,后者生成答案文本所在的起始和结束字符。实验表明,神经网络的Boundary模型能获得state-of-the-art的效果。后面的模型也基本采用这种答案预测的方式。

4.3 共同注意力机制(coattention)

模型的整体结构包括question和document的coattentive encoder,以及a dynamic pointing decoder预测答案片段的起始和结束位置。

参考文献[11]
参考文献[11])
联合注意力机制,a coattention mechanism,使得模型同时注意question及document。
具体的模型结构分成以下几个部分:
1)Document and question encoder
利用LSTM对document及question进行编码,To allow for variation between the question encoding space and the document encoding space,在question encoding加a non-linear projection layer:
$Q=tanh(W^{(Q)}Q^{‘}+b^{(Q)} \in \mathbb{R}^{l \times (n+1)} $
其中$Q^{‘}$是LSTM对question编码,而Q是经过全连接层后的对question的编码。

2)Coattention encoder
首先计算包含文档(D)和问题(Q)关系的affinity matrix(相似度矩阵):
$L=D^{\top}Q \in \mathbb{R}^{(m+1)\times(n+1)}$

然后分别进行row-wise和column-wise的normalization,以得到文档对于每一个问题词的attention weights以及问题对每一个文档词的attention weights。
$A^{Q}=softmax(L) \in \mathbb{R}^{(m+1) \times (n+1)}$
$A^{D}=softmax(L^{\top}) \in \mathbb{R}^{(n+1) \times (m+1)}$

接着计算attention contexts,充分结合了document及query来计算交互的attention信息:
$C^{Q}=DA^{Q} \in \mathbb{R}^{l \times (n+1)}$
相似地计算:$QA^{D}$

然后是一个前述attention信息的总结计算:
$C^{D}=[Q;C^{Q}]A^{D} \in \mathbb{R}^{2l \times (m+1)}$

终于到了图中U向量的计算,作为coattention encoding的输出,后面decoder的输入。
$u_{t}=BiLSTM(u_{t-1},u_{t+1},[d_{t};c^{D}_{t}]) \in \mathbb{R}^{2l}$

这便是上图coattention encoder的计算过程。

3)Dynamic pointing decoder
文献[11]
到了解码层,简单说来,这里其实是用了一个LSTM:
$h_{i}=LSTM_{dec}(h_{i-1},[u_{s_{i-1}} ;u_{e_{i-1}} ])$
其中,h表示LSTM的hidden state,s和e分别表示答案的初始和结束位置的estimate向量(下标i表示时刻),即我们需要的输出。s和e的计算是分开的, 其输出直接表达了答案的起始和结束位置的输出概率分布:
$s_{i}=\mathop{\arg\max}_{t} (\alpha {1},…,\alpha{m})$
$e_{i}=\mathop{\arg\max}_{t} (\beta {1},…,\beta{m})$
其中:
$\alpha {t} = HMN{start}(u_{t},h_{i},u_{s_{i-1}} ,u_{e_{i-1}})$

可见,s和e的计算过程需要双方的参与,同时也考虑LSTM的hidden state。而LSTM的hidden state的计算也需要s和e的信息。所以这个过程是迭代的,互相渗透的。用算法的话说,就是矩阵计算的过程中,hidden state的计算有s和e作为输入,s和e的计算有hidden state作为输入。

s和e的计算,文章提出了HMN网络,即Highway Maxout Network,基于Maxout Networks和High-way Networks的结合。网络结构如下图所示。
文献[11]
具体计算方法如下:

Maxout Networks出自2013年的文章[14]。Maxout的计算方法是对神经元用多套W参数进行计算,每一套参数的计算也可以看作是一层网络,输出结果是对各个位置的多层网络的输出结果取最大值。这里还利用High way的思路,输出值不止是取最大值,而是将多层网络的结果都参与计算。

4.4 双向attention

这里要提到的论文,是BIDAF。通俗地说,就是从passage的角度,对query的attention,以及从query的角度,对passage的attention。

这是华盛顿大学Allen Institute for Artificial Intelligence实验室提出来的一个有名的阅读理解end-to-end模型。这篇文章的模型是在以往工作的基础上,强调了多角度和query-aware的注意力机制(attention mechanism,下文简称attention)设计,从而使得注意力机制能够关注到更多不同的信息。

文章总结了之前的attention工作往往有以下特点:1)将context(上下文)summarizing(总结)成一个固定长度的向量,然后从中提取最相关的信息来回答问题;2)in the text domain,attention是temporally dynamic的。笔者理解,意思是人在阅读文本的时候,注意力思维(关注的点)是灵活的,可以结合过去、当前的文本,甚至会阅读了后面的内容后回过头来思考,这就整合了过去、现在、未来的不同时刻的文本信息。而现有的注意力机制模型的设计,当前时刻的注意力权重(attention weights)只是过去信息的注意力向量函数。3)这些attention函数往往是单向的,query“注意”上下文段落。

针对这些分析,文章提出一个多层模型,从不同的粒度(granularity)来表达上下文信息,并用一个双向的attention flow mechanism来得到query-aware的context表达(context也“注意”query了)。其一,注意力层不是将context paragraph总结成一个固定长度的向量,而是每个时刻都计算注意力信息,而且当前时刻和以前时刻的信息表达都可以在每个时刻的注意力信息计算过程中通过the subsequent modeling layer体现(flow),这就减少了信息丢失。另一方面,减少了attention信息的记忆,当前时刻的注意力机制的计算只会依赖query和当前时刻context paragraph的信息,不会直接依赖之前时刻注意力信息的计算结果。

文章认为这种简化让attention layer和modeling layer分工更明确了。它促使attention层集中关注query和context的attention信息,modeling 层集中关注query-aware context表达信息的相互作用。同时,每个时刻的attention信息可以不受之前时刻不准确的attention信息的干扰。这篇文章注意力机制的计算是双向的,包括query-to-context及context-to-query。
文献[13]
模型具体为:

  • Character Embedding Layer
  • Word Embedding Layer
  • Contextual Embedding Layer
  • Attention Flow Layer
  • Modeling Layer
  • Output Layer

首先是character embedding及word embedding层,character embedding由卷积神经网络得到,word embedding利用了预训练的GloVe向量。

然后contextual embed layer利用LSTM对embedding不同时刻的信息进行建模,得到passage及query信息的表达。这也可以看作是从不同粒度(granularity)来建模对输入文本,包括query和passage,进行建模。

Attention flow layer主要对query和 passage的信息进行关联和聚合,获取交互信息。与以往的工作不同,attention flow layer不是将query和paragraph的信息整合成一个特征向量。在每个time step,previous layers的信息,也会在attention中有所体现。而且,attention的计算是双向的:从context看query ,及从query看context。具体的计算流程如下:
1)首先,计算一个共享的相似度矩阵:
$S_{tj}=\alpha(H_{:t},U_{:j})$
$S_{tj}$表示第t个paragraph word,及第j个query word的相似度。α是一个可训练的函数。
$\alpha(\textbf{h},\textbf{u})=w_{S}^{\top} [\textbf{h};\textbf{u};\textbf{h}∘\textbf{u}]$
;表示向量concate, ∘表示elementwise multiplication。
2)Context-to-query attention 表达对于每个paragraph中的词语,哪个query word相关性最大,即从context看query。$\alpha_{t}$表示对于第t个paragraph word,各query word的权重,由相似度矩阵$\textbf{S}$的第t个向量计算得到。
$\mathbf{\alpha}{t}=softmax(\textbf{S}{t})$
$\widetilde{\textbf{U}{:t}}=\sum{j} \mathbf{\alpha}{tj} \textbf{U}{:j} $
3)Query-to-context attention则表达对于每个query word,context words的权重分布,即从query看context。
$\textbf{b}=softmax(max_{col}(\textbf{S}))$
注意,这里先对相似度矩阵S按列求最大值。然后计算注意力context vector:
$\widetilde{\textbf{h}}=\sum_{t} \mathbf{b}{t} \textbf{H}{:t}$
然后会对$\mathbf{h}$向量复制T次,从而获得$\widetilde{\mathbf{H}}$,与$\widetilde{\mathbf{U}}$维度相同。每个context word看query,$\mathbf{S}$矩阵中每一列可以看作是一个context word与所有query words的信息,直接按列softmax就可以。笔者思考,而query看context words,阅读理解的输出不是sequence的输出,所以query应该作为一个整体来看每个context words的贡献,所以这里每个context word只保留了与query word相似度最高的相似度值。不过这个操作更是为了下面的计算。
综合以上结果,可以得到对于每个context word的query-aware表达。下面的公式即表示对于第t个context word,query words的注意力权重了。
$G_{:t}=\beta (\mathbf{H}{:t},\widetilde{\mathbf{U}{:t}},\widetilde{\mathbf{H}_{:t}})$
这里β是任意一个可训练的神经网络。
在contextual embedding layer,context words的交互信息与query word是相对独立的。所以接下来,Modeling layer利用一个双向LSTM来进一步获取context和query的交互信息。这层的输出就包含于整个paragraph和query相关的contextual信息了。
Output layer就可以根据任务进行设计了。这篇文章在短文本生成型和完型填空型的阅读理解数据上都有实验。对于squad数据集,模型通过输出答案文本的start及end位置实现。

4.5 self-matching

这里提到的也是一个经典的模型,微软亚洲研究院提出的RNET。

模型包括四个部分:
(1)question and passage encoder
question及passage的表达通过双向GRU分别构建。
(2)gated attention-based recurrent networks
通过门控注意力机制的循环神经网络,来match question及passage的信息。这里的
具体计算公式与match-lstm类似,对于上文match-lstm中提到的$m_{k}$,即这里的$[ u_{t}^{p},c_{t}]$,加上一个门控机制:
$g_{t}=sigmoid(W_{g}[ u_{t}^{P},c_{t} ])$
$[ u_{t}^{p},c_{t}]^{*} = g_{t} \odot [ u_{t}^{p},c_{t}]$
(3)self-matching attention
passage的信息对于推断答案来说非常重要。因此,文章提出直接matching question-aware passage representation against itself,即根据passage段落与当前passage word来提取信息。
$h_{t}^{P}=BiRNN(h_{t-1}^{P},[ v_{t}^{p},c_{t}])$

(4)output layer
利用pointer networks来predict the start and end position of the answer.

4.6 自注意力机制

R-NET中提到的概念是self-matching attention mechanism,近两年引起广泛关注的
Transformer模型也从自注意力这个思路出发。
什么是自注意力机制,Transformer模型文章里是这么说的:
Self-attention, sometimes called intra-attention is an attention mechanism relating different positions of a single sequence in order to compute a representations of the sequence.
循环网络的结构所需的序列化计算操作限制了计算的并行加速,卷积网络善于捕捉局部信息而对全局信息的建模稍弱。Google Brain等发表的文章[16]提出一个新的网络,只基于attention mechanisms,没有使用循环或卷积的结构,效果惊艳。
Tramsformer利用了多层叠加的self-attention及point-wise, fully connected layers构造编码层和解码层。
文献[16]
Encoder:
输入层包括一个6层的stack结构。每一层包含两个子层。第一个是a multi-head self-attention mechanism,第二个是a simple, position-wise fully connected feed-forward network。经过layer normalization,接着应用a residual connection
LayerNorm(x+Sublayer(x)),然后输出一个512维的特征向量。
Decoder:
输出层也由6层的stack结构构成。在encoder中提到的两个子层的结构中,decoder在两层结构中插入一个子层,performs multi-head attention over the output of the encoder stack。employ residual connections around each of the sub-layers, followed by layer normalization。另外,通过masking使得预测时网络只会看到之前的信息。

对于Transformer来说,attention的设计是重点之一了。文中总结,一个注意力函数是对一个query 以及一个key-value对的集合建立映射函数。这里涉及query, keys, values三种模型中的向量,即Q、K、V。输出是values的带权加和,权重由query及对应的key计算得到。
文献[16]
Scaled Dot-Product Attention
每个attention的计算公式如下:
$Attention(Q,K,V)=softmax(\frac{QK^{T}}{\sqrt{d_{k}}})V$
这里是用一个公式概括了注意力机制中权重的计算过程。 两种最常用的注意力权重计算方式是additive attention,即如第3部分中提到的,通过累加的方式;以及dot-product(multiplictive) attention, 即点乘的方式。在这里,Transformer用的是点乘的方式,不同的是乘上了一个缩放因子 $\frac{1}{\sqrt{d_{k}}}$。两种类型的attention计算理论复杂度差不多,而点乘的方式实现起来计算速度快,节省内存空间。文中提到,如果没有缩放,additive attention的效果比点乘的效果好。文中猜想这是因为点乘的结果值较大,影响softmax函数的结果,使得梯度值太小。
Multi-Head Attention
在进行注意力机制计算之前,需要先对Q、K、V向量进行线性变换。文章利用不同的线性变换向量,在不同的子空间对信息进行建模,这便是multi-head attention。
$MultiHead(Q,K,V)=Concat(head_{1},…,head_{h})W^{O}$
where $head_{i}=Attention(QW_{i}^{Q},KW_{i}^{K},VW_{i}^{V})$
其中$W_{i}^{Q} \in \mathbb{R}^{d_{model} \times d_{q}}$, $W_{i}^{K} \in \mathbb{R}^{d_{model} \times d_{k}}$, $W_{i}^{V} \in \mathbb{R}^{d_{model} \times d_{v}}$,$W^{O} \in \mathbb{R}^{hd_{v} \times d_{model}}$。文章设计了8个并行的注意力机制层,各层结果concate起来,即这里h=8。

模型中attention的应用:
上面说完了attention的计算方法,还要解决的一个问题是,Q,K,V分别是什么?
1) 在encoder-decoder attention层,Q来自于上一个decoder层,K和V来自于编码层的输出。解码的时候,每个时刻的解码过程模型可以“注意”到整个输入序列的信息。这种就是在sequence to sequence模型中典型的encoder-decoder 的注意力机制计算方法了。
2) 在编码器的self-attention,Q,K,V都来自于编码器中上一个编码层的输出。编码过程中每个时刻编码器都可以“注意”到上一个编码层的所有信息。
3) 在解码器的self-attention,Q,K,V都来自于解码器中上一个解码层的输出。含义与编码器的类似了。特别的,无效的未来时刻的信息会被mask掉。

参考文献:
[1] Huang P S, He X, Gao J, et al. Learning deep structured semantic models for web search using clickthrough data[C]//Proceedings of the 22nd ACM international conference on Conference on information & knowledge management. ACM, 2013: 2333-2338.
[2] Bowman S R, Angeli G, Potts C, et al. A large annotated corpus for learning natural language inference[J]. arXiv preprint arXiv:1508.05326, 2015.
[3] Hermann K M, Kocisky T, Grefenstette E, et al. Teaching machines to read and comprehend[C]//Advances in Neural Information Processing Systems. 2015: 1693-1701.
[4] Sutskever I, Vinyals O, Le Q V. Sequence to sequence learning with neural networks[C]//Advances in neural information processing systems. 2014: 3104-3112.
[5] Graves A. Generating sequences with recurrent neural networks[J]. arXiv preprint arXiv:1308.0850, 2013.
[6] Bahdanau D, Cho K, Bengio Y. Neural machine translation by jointly learning to align and translate[J]. arXiv preprint arXiv:1409.0473, 2014.
[7] Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[C]//Advances in Neural Information Processing Systems. 2017: 5998-6008.
[8] Cui Y, Chen Z, Wei S, et al. Attention-over-attention neural networks for reading comprehension[J]. arXiv preprint arXiv:1607.04423, 2016.
[9] Wang S, Jiang J. Learning natural language inference with LSTM[J]. arXiv preprint arXiv:1512.08849, 2015.
[10] Wang S, Jiang J. Machine comprehension using match-lstm and answer pointer[J]. arXiv preprint arXiv:1608.07905, 2016.
[11] Xiong C, Zhong V, Socher R. Dynamic coattention networks for question answering[J]. arXiv preprint arXiv:1611.01604, 2016.
[12] Hermann K M, Kocisky T, Grefenstette E, et al. Teaching machines to read and comprehend[C]//Advances in Neural Information Processing Systems. 2015: 1693-1701.
[13] Seo M, Kembhavi A, Farhadi A, et al. Bidirectional attention flow for machine comprehension[J]. arXiv preprint arXiv:1611.01603, 2016.
[14] Goodfellow I J, Warde-Farley D, Mirza M, et al. Maxout networks[J]. arXiv preprint arXiv:1302.4389, 2013.

【浅谈文档型问答系统】(一)从问答系统说起

Posted on 2019-01-20 | Edited on 2019-03-18

1.从问答系统说起
1950年,阿兰·图灵发表了一篇划时代的论文,提出了著名的图灵测试:如果一台机器能够与人类展开对话(通过电传设备)而不能被辨别出其机器身份,那么称这台机器具有智能。问答系统有了最早的实现构想。

在60到70年代已经有了计算机自动问答的系统。例如能回答棒球比赛相关问题的自动问答系统BASEBALL,回答阿波罗登月取回的岩石样本分析结果相关问题的LUNAR。这个时期的问答系统主要是面向限定领域、处理结构化数据的,被称为人工智能时期,主要是人工智能系统或专家系统。70和80年代,随着计算语言学的兴起,问答系统也进入计算语言时期,计算语言学帮助降低数据库构建的成本,降低问答系统的构建难度。这个时期的问答系统集成了自然语言处理、知识表示等方法分析用户问题给出答案。进入90年代,问答系统则进入了开放领域、自由文本时期,结合机器学习、信息检索等方法。

从发展历史看来,问答系统的发展历程可以简单概括为:基于结构化数据的问答系统、基于自由文本的问答系统、基于问题答案对的问答系统三个阶段。

早期由于智能技术及数据获取的局限性,问答系统主要是面向限定领域,该时期的问答系统处理的数据类型是简单且高度结构化的数据,系统一般将输入问题转化为数据库查询语句,通过数据库的检索返回答案。基于结构化数据的问答系统包含上文提到的人工智能时期和计算语言时期。

问答系统对知识数据的组织形式要求越严格,说明需要的“人工”越多,那么系统的“智能”程度就越低。随着互联网的飞速发展以及信息检索技术的兴起,90年代问答系统进入面向开放领域,基于自由文本数据的发展时期。这种问答系统的处理流程主要包括:问题分析、文档检索及段落划分、候选答案抽取、答案排序、答案验证等。特别自1999年文本检索会议(Text Retrieval Conference,简称TREC)引入问答系统评测专项(Question Answering Track,简称QA Track)以来,极大推动了基于自然语言处理技术在问答领域中的研究发展。

基于问题答案对的问答系统主要涉及CQA(community question answering)与FAQ(Frequently asked questions)两种类型。网络上出现的社区问答(community question answering, CQA)提供了大规模的用户交互衍生的问题答案对(question-answer pair, QA pair)数据,为基于问答对的问答系统提供了稳定可靠的问答数据来源。与CQA相比,FAQ具有限定领域、质量高、组织好等优点,使得系统回答问题的水平大大提高。但FAQ的获取成本高,这个缺点又制约了基于FAQ的问答系统的应用范围。

随着计算机、大数据、人工智能、自然语言处理等相关技术的发展,人们对问答系统的期待越来越高。巧妇难为无米之炊,问答系统接收的知识数据越多,才可能越聪明。近年来,可收集的数据呈爆发式增长,在学术界和工业界,针对不同的场景或者说不同的数据形态,衍生出不同种类的问答系统,如FAQ检索型、闲聊型、任务型、知识图谱型(KBQA)以及文档型(阅读理解)等。这些不同类型的问答系统,按照交互轮次,可以分为多轮和单轮会话;按照解决方法,可以分为基于检索的、基于生成的以及基于知识库的问答。

FAQ检索型

知识图谱型(KBQA)

任务型

在上面提到的各种问答系统中,旨在“负责任”地准确解决用户问题有FAQ检索型、任务型、知识图谱型以及文档型。显然,除了文档型机器人,其他类型的对话机器人都需要不同程度的数据组织,来辅助计算机理解和回答用户问题。其中,FAQ检索型需要整理问题答案对,知识图谱型需要整理知识关系网络,任务型需要任务场景和槽位的定制。从算法角度来看,知识的质量、结构化程度越高,问答系统的效果才越好,才越“智能”。但对知识的组织程度要求越高,就需要越多的“人工”,应用落地的成本则越大。这同时也会影响系统能够解决问题的覆盖度。从这个角度看来,文档型问答的优势便在于无需结构化知识的预先整理,接入成本低。所以在飞速发展的文本理解技术中得到了越来越多的关注。

文档型

一种海量社交短文本的热点话题发现方法

Posted on 2017-03-16 | Edited on 2019-01-13 | In 事件发现

随着社交网络的发展和积累,内容的产生、传播、消费等已经根深蒂固地融入在人们的生活里。随之内容分析的工作也就走进了人们的视野。近年来,各种公众趋势分析类产品涌现,各大公司都利用自身资源纷纷抢占一席之地。

公众趋势分析平台利用自然语言处理、机器学习方法对数据进行分析,给用户提供舆情分析、竞品分析、数据营销、品牌形象建立等帮助。其中,热点发现问题是公众趋势分析中不可或缺的一部分。热点发现通过对海量数据(本文集中在文本数据方面)进行分析,挖掘相关人群重点关注的内容。

在很多业务场景中,快速高效地从海量社交短文本中发现出实时的热点话题,可以帮助产品、运营、公关等同学更好地吸引用户。然而,直接从海量文本中生成语法正确、意思明确的话题,是一件不容易的事情。本文主要介绍在话题生成上运用的一个较为简单高效的方法。

所谓话题

本文的目的是从海量社交短文本中,自动发现类似于新浪微博里,用户发起的话题,或者是运营同学后台配置的话题。

新浪微博

现有做法及对话题提取的想法

获取高质量的话题或事件,有非常多的需求或应用场景。但这不是一件容易的事,目前还没有一种成熟且鲁棒性强的方法可以解决这个问题。下面结合一些已有方法对话题提取的方法做一个简单的探讨。

直接截取新闻标题作为话题

但是这种做法有两个问题,1)有些新闻标题太长,且表达上话题属性偏弱;2)新闻事件不一定在所有平台都有关注热度,不适用于所有场景。

不少相关的工作,将话题提取当做主题分析来做,利用主题模型(LDA等)、聚类等方法来解决。

主题模型

但这种做法的结果是找出各个话题的相关词,而不是直接生成话题。

可以考虑把话题发现当成summarization 问题来解决。

Summarization问题也有不同种类,从在线离线的角度可以分为直接从文本中获取Summarization,以及实时获取summarization。

Real-Time Web Scale Event Summarization,一般是先对信息流做一个决策,是否留下信息来作为一个事件,旨在检测出相关的、综合性强的、新颖的、实时性强的事件。

直接从文本中得到Summarization,也可以分为Multi-document summarization(MDS),以及Single document summarization,或者sentence summarization。放在这里的话题提取问题上,可以考虑用sentence summarization来解决。解决方法也分为Extractive models 以及Abstractive models两种,也就是直接提取式和生成式两种。提取式的效果会比生成式的效果保守一些,更具有实用性。现在比较新的有利用RNN和 Attention model来解决。但这种方法需要有监督的数据,算法的复杂度和鲁棒性有待进一步考察。之后可以尝试在这种方法上做一些适应性的改进。

本文的做法

本文提出一种从热词提取出发,提取热点话题的方法。下面是方法的整体流程图,首先提取热词,然后在热词的基础上,做话题提取。下面分两部分详细介绍。

热词提取

主体思路是利用词频梯度和平滑方法。

如上图所示,词语的热度受很多方面的影响。

  • 大盘影响:白天和凌晨、双休日和工作日、节假日和平常日子,社交消息的整体数量都会有一个较大的波动。
  • 词间影响:也许语料中某个段子突然非常火,会导致一些一般情况下关系不大的词语,一下子全部成为热词。
  • 周期影响:24小时、星期、月份、节气等周期性的变化,常常会使得“早安”、“周一”、“三月”等事件意义性不强的词语成为热词。最近很火的“歌手”周播节目,也使得“歌手”周期性地成为热词,不过这种热词对我们来说,是更有意义的。
  • 自身趋势:这个就是我们最关心的热度信息了。这些由于事件引起的相关词语突发性、递增性等的增长,就是我们算法想要识别和分析出来的。

针对以上一些影响因素,可以从以下的一些方面进行热词提取工作。

1、预处理

这里主要包括文本去重、微商识别等方法,对数据进行一些去躁的工作。

2、梯度

词频增量的主要衡量指标。

其中,$$w_i$$表示某个词语,$$T_j$$表示时间窗口,$$F(w_i,T_j)$$表示词语$$w_i$$在时间窗口$$T_j$$的出现频数。$$S(w_i )$$表示某个词语的梯度分数。

3、贝叶斯平均

一种利用outside information,especially a pre-existing belief,来评价the mean of a population的方法。

贝叶斯平均的典型应用包括用户投票排名,产品评分排序,广告点击率的平滑等等。

以用户投票排名为例,用户投票评分的人很少,则算平均分很可能会出现不够客观的情况。这时引入外部信息,假设还有一部分人(C人)投了票,并且都给了平均分(m分)。把这些人的评分加入到已有用户的评分中,再进行求平均,可以对平均分进行修正,以在某种程度或角度上增加最终分数的客观性。容易得到,当投票人数少的时候,分数会趋向于平均分;投票人数越多,贝叶斯平均的结果就越接近真实投票的算术平均,加入的参数对最终排名的影响就越小。

4、热度分数计算

利用贝叶斯平均对梯度分数进行修正。

这里,公式中的平均词频是贝叶斯平均公式中的C,平均分是贝叶斯平均公式中的m。也就是说在热词提取中,用梯度分数的平均分作为先验m,用平均词频作为C。

热词提取中可以这么理解,词语每出现一次,相当于给词的热度进行了评分。

词频少,也就代表了评分的人数少,则评分的不确定性大,需要用平均分来进行修正、平滑。这里可以把一些词频很少的词语的高分数拉下来,例如一个词语今天出现了18次,昨天出现了6次,这里梯度分数就比较高,为0.75,但这种词语其实更可能不是一个热词。

词频大,远大于平均词频的词语,也就代表了评分的人数多。则分数会越趋向于自己的实际分数,这时平均分的影响变小。这是合理的,例如一个本来是百万量级的词语,第二天也出现了一个三倍的增量,这里热度价值就明显提高了。

5、差分

这里主要考虑是要解决热词的周期性影响的问题。具体做法非常简单,比较的时间间隔需包含一些影响较为明显的时间周期。例如按小时统计的热词,最好是拿今天和昨天一个相同的时间点进行比较。

6、共现模型

对于互为共现词的热词,进行一层筛选。

但这些词语通过一些频繁项集、word2vector等方法,都可以发现出共现的关系。利用共现词语的信息,可以对热词进行一轮筛选,提取出最有价值的热词,避免信息冗余。

7、时间序列分析

考虑更详细的历史因素。

通过对词频进行时间序列分析,可以更详细地区分短期、长期与周期性热点;对一些更有价值的热词做热度预警;对热词的增长趋势进行分析等等。

综上,我们在周期时间间隔内,通过贝叶斯平均修正的词语梯度分数来分析词语热度,并利用语料中词语的共现信息,进一步筛选得出热词。通过时间序列分析,得出热词的特性和增长趋势等。

话题提取

提取出了热词,但一个词语对于事件或者话题的表达能力是有限的。这里从热词出发,进一步提取出话题。

话题提取的工作也分为两步,第一步先找出一些候选的话题词组;第二步利用Attention的思想,从候选词组中找出一个包含的词语更加重要的词组,作为输出话题。

候选词组提取

候选词组的提取主要根据信息熵的理论,用到以下一些特征。

1、内部聚合度——互信息

这应该从信息熵说起。信息熵是用来衡量一个随机变量出现的期望值,一个变量的信息
熵越大,表示其可能出现的状态越多,越不确定,也即信息量越大。

互信息可以说明两个随机变量之间的关系强弱。定义如下:

对上式做变换可以得到:

H(Y)表示Y的不确定度;H(Y│X)表示在已知X的情况下,Y的不确定度,也即已知X时,Y的条件熵。则可知I(X;Y)表示由X的引入而使Y的不确定度减小的量。I(X;Y)越大,说明X出现后,Y出现的不确定度减小,即Y很可能也会出现,也就是说X、Y关系越密切。反之亦然。

2、所处语境的丰富程度——左右信息熵

刚刚已经提到信息熵说明了信息量的大小。那么如果一个词组的左右信息熵越大,即词
组左右的可能情况越多,左右的搭配越丰富;则说明这个词组在不同的语境里可讨论的事情越多,越可能可以独立说明一个事件或话题。

3、是否普遍——这个很直观地可以通过词组出现的频次来衡量。

话题精筛

对于某一个热词,挑选出来一批候选词组后,每个词组所含的词语不同,包含的信息量也不同。比如3月9日对于“巴黎”这个热词,我们提取出来的候选词组有“巴黎球迷”、“巴黎球员”、“淘汰巴黎”、“心疼巴黎”、“巴萨逆转巴黎”、“法国巴黎”、“巴黎时装周”。但“巴萨球员”、“巴黎球迷”、“淘汰巴黎”、“心疼巴黎”、“法国巴黎”这些词组中,“球员”、“球迷”、“淘汰”、“心疼”这些词语在很多其他的语境中也经常出现,它们的指向性并不明确;“法国巴黎”的信息量甚至只有一个地点。而“巴萨逆转巴黎””、 “巴黎时装周”则还包含了更具体的信息——足球比赛、球队、赛果或者时装秀等,事件的指向更明确。这里,就需要对候选的话题词组进行筛选。

筛选的主要依据或思想,其实和Attention机制是一样的,关键是要找出重要的词语。比如与“巴黎”的搭配,“巴萨”、“逆转”、“时装周”比“球迷”、“球员”、“心疼”、“法国”包含的信息更多,意义更大。可以想到,“巴萨”、“逆转”、“时装周”这些词语在其他无关语料中不常出现,“球迷”、“球员”、“心疼”、“法国”在不同语料中都常会出现,信息不明确。所以,在这个问题中,可以通过TF-IDF的思路来确定哪些词语更重要,有更高的“attention”权重。

具体说来,就是衡量词组中,各个词语在词组中的特异性。我们有理由相信,“巴萨”、“逆转”、“时装周”这些词语,在含“巴黎”的相关语料中出现的概率较高。热词$$w^h$$的候选词组s的事件或话题表示能力分数可由以下公式求得:

其中,N为候选词组中的词语个数,$$w_i$$为候选词组中包含的第i个词语,Corpus (w)表示含有词语w的相关语料。

另一方面,也需要考虑词组出现的频次,词组出现的次数越多,说明事件越重要。

综上所述,通过候选词组的事件或话题表示能力分数以及出现频次,精筛出热词的相关话题。

浅谈新词发现算法

Posted on 2016-11-29 | Edited on 2019-01-16 | In 事件发现

一、问题描述

在中文分词领域有新词和未登录词的概念。新词,顾名思义即新出现的词语。未登录词,通常被定义为未在词典中出现的词。

在一般的分词业务场景中,无论词语是否为新词,其实我们需要找出的是未登录词。

本文的目的是先从一批语料中找出所有能成词的词语或词组;然后与已有分词工具(如hanLP)分词所得的结果进行对比,找出已有分词工具不能分出的词语,即未登录词。

这实际上是要“发现”特定语料中,所有能成词、或者说我们想分出的词语,包含新词、旧词、未登录词。为了叙述方便,本文不对这几个概念进行严格区分,简单地将其称为“新词发现”。

二、新词发现问题简介

新词发现不是一个很好解决的问题,它除了需要解决一般的分词方法所需解决的问题,还与语料的时效性密切相关。

比如说,在一般情况下,“英语老师”这个词语虽然具有独立的含义,但科目与老师的组合众多,如“语文老师”、“体育老师”等等,我们倾向于不把每一种老师都当作一个词语,而把“英语”、“语文”、“体育”、“老师”分别看作一个词语。但如果某一个时间段的语料中,“英语老师”有特殊的相关事件发生,“英语老师”出现的次数远远大于其他老师,则此时,我们倾向于把“英语老师”分作新词。类似情况的词组还有“周一见”、“超级月亮”等等。

新词发现方法一般分为基于规则的方法和基于统计的方法两大类。

基于规则的方法主要根据中文构词的规则(如基于构词的词性规则对候选词进行过滤),但这种方法需要人工建立规则,成本较高。

基于统计的方法则主要通过统计语料中的分布、频度信息等来判断字符串片段能否成词,如信息熵、邻接类别等等。

本文的新词发现实践,主要基于统计的方法,利用阈值设置,先从语料的字符串组合中筛选出一批候选词;然后利用逻辑回归方法训练一个成词与不成词的二分类模型,进一步确定新词。

三、新词发现算法实践

本文的新词发现算法主要包括:基于统计方法的候选词筛选 与 基于逻辑回归方法的词语筛选 两个部分。

1、基于统计方法的候选词筛选

首先考虑成词的两个重要标准:内部凝合程度和自由运用程度。

内部凝合程度即词语间各成分的不可分离程度。例如:“电影院”比“的电影”在各成分出现的条件下,会以更大的概率同时出现。为了算出一个文本片段的凝合程度,我们需要枚举它的凝合方式,即这个文本片段是由哪两部分组合而来。令 p(x) 为文本片段 x 在整个语料中出现的概率,以“电影院”为例,我们定义“电影院”的凝合程度为 p(电影院) 与 p(电) · p(影院) 比值和 p(电影院) 与 p(电影) · p(院) 的比值中的较小值。同理,“的电影”的凝合程度则是 p(的电影) 分别除以 p(的) · p(电影) 和 p(的电) · p(影) 所得的商的较小值。

可以想到,内部凝合程度较高的文本片段,诸如“蝙蝠”、“蜘蛛”、“彷徨”、“忐忑”、“玫瑰”之类的词,这些词里的每一个字几乎总是会和另一个字同时出现,而不在其他场合中使用。

自由运用程度较好理解,即其前后文的可灵活运用程度,可以用其左右邻字不同组合的种数来衡量。进一步,我们可以利用左右邻字的信息熵,来衡量一个文本片段的左邻字集合和右邻字集合有多随机。

文本片段的内部凝合程度和自由运用程度,两种判断标准缺一不可。只看凝合程度的话,程序会找出“巧克”、 “俄罗”、 “颜六色”、 “柴可夫”等实际上是“半个词”的片段;只看自由程度的话,程序则会把“吃了一顿”、 “看了一遍”、 “睡了一晚”、 “去了一趟”中的“了一”提取出来,因为它的左右邻字都太丰富了。

这里内部聚合度和自由运用度的详细介绍可以参考:
http://www.matrix67.com/blog/archives/5044

本文在这些概念的基础上,提取了字符串片段的词频、左邻字个数、右邻字个数、左邻字信息熵、右邻字信息熵、内部凝合程度 指标,并根据经验设定阈值,初步筛选出了一批候选词语。

其中,在统计这些指标的过程中利用了Nagao串频统计算法:
http://www.ar.media.kyoto-u.ac.jp/publications/Coling94.pdf
http://www.doc88.com/p-664123446503.html
一个符号串在文本中的出现次数,简称串频。这个方法主要用来高效统计我们设定的长度以内的字符串及其出现频次。

2、基于逻辑回归方法的词语筛选

实验发现,单凭人工设定的简单规则,较难去除一些不太适合成词的字符串,如“借我一”、“会担心”、“日子过得”等等。

对20161127这一天随机提取的20万语料通过上述统计的方法筛选出7040个字符串,人工标注后(成词标注为1,不成词标注为0,发现了772条负样本不太适合成词,占比10.96%。

于是,考虑通过逻辑回归方法,利用上述统计方法所得的特征,训练了一个成词与不成词的二分类模型。

进行了多次实验,包括对标注样本的探索、样本数量以及分类方法的不同尝试等等,最后选取1800条样本,其中负样本(不成词)772条全部选取,进行训练和测试。正样本随机选取,并随机取1000条样本作为训练集,800条作为测试集,实验结果波动不大,记录三次实验结果如下:

TPR表示ground truth成词的召回率。TNR表示groud truth为不成词,模型判断也为不成词的准确率。若在基于统计方法初筛出的候选词的基础上,把LR模型判断为不成词的字符串去掉,结合初筛的错误率10.96%,TPR按71%算,TNR按68%算,可以认为,整个新词发现方法得出的词语,错误率(不成词率)为10.96%(1-68%)/((1-10.96%)71%+10.96%*(1-68%))=5.26%,即准确率为94.74%。但由于词语难以枚举,且有些词语是否成词存在一定的模糊性,整个新词发现方法的召回率(即词语的查全率)不好评估。另外,新词发现方法的错误率和召回率相互制约。

把新词发现算法加入到热词提取中,热词提取的效果得到了提高,结果示例如下:

四、几点说明

1、通过基于统计的方法初筛出一批候选词后,利用LR模型可以进一步获取可以成词的字符串,这里包括新词、旧词、未登录词。

而另一方面,如果我们只想找出新出现的词,可以利用语料的时间序列,通过字符串在当前时间段的出现频数,与历史时间段的出现频数的比值,进一步筛选出新出现的词。

2、由于词语的统计指标,如词频、左邻字个数等,随语料规模有所变化,故阈值的设置应随语料规模有所调整。但对这个差异的要求并不严格,因为在语料规模达到一定程度时(若语料规模太小,也不构成能够发现新词的条件),它主要是影响了我们初筛的候选词的质量。

而统计特征的计算,与分类模型关系密切。特征值的标准不同,会影响到模型的参数。考虑模型的通用性,对新来的待训练语料,应先把统计特征映射到与模型的原训练语料一致的最大值最小值空间。

这样,对于新来的待训练语料,即可以使用已有的LR模型,降低新词发现的接入成本。

热词提取方法探讨

Posted on 2016-11-06 | Edited on 2019-03-17 | In 事件发现

随着计算机网络技术的飞速发展,网络信息呈现爆炸式的增长。热词提取成为越来越普遍的问题。本文记录笔者在热词提取工作中的一些心得体会。

一、概述

热词反映了文本数据表现的人群在某个时间段普遍关注的问题和事物。

笔者热词提取的工作主要是根据一个时间段内的词频对比,再利用贝叶斯平均的思想,其中根据具体数据的情况做了些针对性的处理。

二、难点

笔者在做热词提取的过程中,发现或者遇到了以下一些问题,如:

1、热词提取是一个带有较大主观色彩的问题,热词提取的质量不好衡量。随人群、地域、个人主观看法都有所变化。

2、热词来源于文本,文本对热门话题表现的质量直接影响到热词提取的质量。有些文本的话题不能很好地表现一个大范围内的热点事件。

比如广告文本,某些广告会在一段时间内爆发性地发出,导致了某些词语的暴涨,而这些词语不能很好地体现热点话题

比如转发、评论、回复等的文本,这些内容的质量参差不齐,有些内容还是对突出热点话题或事件很有帮助的,而有些则不然。

有些文本里有较多重复的词语,有些文本的内容是重复的,这些重复是突出了热点话题或事件,还是突出了一些无关紧要的词语,这个也不容易智能地确定。

3、分词的问题。分词的准确性和新词的及时发现与热词提取的质量紧密相关。

4、图片、视频反映的热点如何得以结合?

5、如何提取更能反映话题或热点事件的词组?有时提取到的只是一个词语,但一个词语的暴涨不能体现热点话题或事件,如“歌声”不能体现“中国新歌声”这个节目。

6、语义挖掘问题。热词提取结果中难免会出现一些实际意义不大的词语,如“数字”、“筛选”等,它们可能是热点词组中的一部分,也有可能确实没有什么热门事件或话题的意义;又如“周五”、“星期一”这类有规律的周期性爆发的词语。

三、方法介绍

本文方法可以看作是tf-idf结合时间窗口,考虑贝叶斯平均思想的一个变种方法。具体介绍如下:

1、预处理

取当天和前两天的文本语料,对语料进行预处理,如去停词、中文常用字、过滤广告文本等。

2、词语的热度score计算

计算词语的热度可以考虑梯度,即计算词语当天出现的词频与前两天出现词频的差值。但这种方法存在一个问题,有些常用词语出现的频数很高,在波动上的绝对值也会较高;往往很容易就超越频数基数少的词语。如早安、雾霾等词语。

更合理的方法是利用当天的词频和历史词频的比值来衡量热度,这样可以排除那些每天的词频数都特别大的词语。

另一方面,这里还需排除一些频数特别小,而当天与历史词频比值非常高的词语。如词语W1和W2在统计当天分别出现了1000次和18次,历史两天分别出现了500次和3次,则直接计算词语当天与历史情况的词频比值的结果为2和6,但显然,其实词语W1更倾向于被判断为热词。这个问题可以通过贝叶斯平均的方法来解决。

贝叶斯平均方法可以用来衡量,或者说修正受欢迎程度问题的分数计算,其实际应用场景很广泛,如广告点击率的计算、用户投票的排名算法、热词提取等等。某种程度上,它可以理解为借鉴了“贝叶斯推断”的思想,即先对结果估计一个值,然后不断用新的信息去修正,使得它更接近客观答案。

具体计算方法如下:
计算词语当天出现的词频与整个统计时间段内的比值:

其中,$w_{i}$表示某个词语,$T_{j}$表示时间窗口,$F(w_{i},T_{j})$表示词语在时间窗口的出现频数。$S(w_{i})$表示某个词语目前的热度分数。

利用贝叶斯平均的方法修正热度分数,公式如下:

其中,m是一个先验的平均分,C是一个常数,与样本的总体情况有关。C越大,表示我们希望分数的总体分布差距越小。

在本文的热词提取问题中,m定义为所有词语的$S(w_{i})$的平均分,用$S_{average}$表示;C定义为所有词语的一天平均词频,用$F_{average}$表示,设I为词语总数,J为总天数,则:

对上述贝叶斯平均公式进行变换,可得:

上述公式更容易理解,可以看作每个词语都有一个先验的平均分$S_{average}$,而其自身个性分数$(S(w_{i})-S_{average})$的权重,则由它表现得好不好来决定。它的词频较高,即曝光量大,我们就给予它的个性分数更大的权重。

不难发现,当词语的热度分数等于或小于当天的平均热度分数$S_{average}$,这个词语肯定不是热词,这里就不再考虑了。如果某个词语的词频特别小,远小于$F_{average}$,则其个性分数的词权重制约$\frac{F(w_{i},T_{j})}{F(w_{i},T_{j})+F_{average}}$将接近于0,这时即使其原分数特别高,修正后的分数也接近平均分。这样就筛掉了词频特别少,但数量变化比值大的词语。如果某个词语的词频特别大,词权重接近于1,但这种词往往是常用词,原分数会接近于平均分,则个性分数$(S(w_{i})-S_{average})$也会很小,热度分数也接近平均分,也被筛掉。

以三个词语的热度分数计算举例:

热度分数计算:

3、最后,就当然是根据词语的热度分数值筛选出热词了。

四、结果示例

五、总结

目前笔者所述的热词提取的方法能够取得一定的效果,把近日来的热点体现出来,但也还存在一些问题待解决。往后笔者会将新词发现的一些算法也结合进来。欢迎大家多批评,多提意见。

六、参考资料:

http://www.matrix67.com/blog/archives/5044

wangli

5 posts
1 categories
3 tags
E-Mail
© 2019 wangli
Powered by Hexo v3.8.0
|
Theme – NexT.Mist v6.7.0
|