语义分析方案贾俊华.docx
- 文档编号:9084504
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:32
- 大小:1.04MB
语义分析方案贾俊华.docx
《语义分析方案贾俊华.docx》由会员分享,可在线阅读,更多相关《语义分析方案贾俊华.docx(32页珍藏版)》请在冰豆网上搜索。
语义分析方案贾俊华
本文主要由以下三部分组成:
文本基本处理,文本语义分析,语义分析小结。
先讲述文本处理的基本方法,这构成了语义分析的基础。
接着分文本和图片两节讲述各自语义分析的一些方法,值得注意的是,虽说分为两节,但文本和图片在语义分析方法上有很多共通与关联。
最后我们简单介绍下语义分析在广点通“用户广告匹配”上的应用,并展望一下未来的语义分析方法。
1文本基本处理
在讲文本语义分析之前,我们先说下文本基本处理,因为它构成了语义分析的基础。
而文本处理有很多方面,考虑到本文主题,这里只介绍中文分词以及TermWeighting。
1.1中文分词
拿到一段文本后,通常情况下,首先要做分词。
分词的方法一般有如下几种:
基于字符串匹配的分词方法。
此方法按照不同的扫描方式,逐个查找词库进行分词。
根据扫描方式可细分为:
正向最大匹配,反向最大匹配,双向最大匹配,最小切分(即最短路径);总之就是各种不同的启发规则。
全切分方法。
它首先切分出与词库匹配的所有可能的词,再运用统计语言模型决定最优的切分结果。
它的优点在于可以解决分词中的歧义问题。
下图是一个示例,对于文本串“南京市长江大桥”,首先进行词条检索(一般用Trie存储),找到匹配的所有词条(南京,市,长江,大桥,南京市,长江大桥,市长,江大桥,江大,桥),以词网格(wordlattices)形式表示,接着做路径搜索,基于统计语言模型(例如n-gram)找到最优路径,最后可能还需要命名实体识别。
下图中“南京市长江大桥”的语言模型得分,即P(南京市,长江,大桥)最高,则为最优切分。
图1.“南京市长江大桥”语言模型得分
由字构词的分词方法。
可以理解为字的分类问题,也就是自然语言处理中的sequencelabeling问题,通常做法里利用HMM,MAXENT,MEMM,CRF等预测文本串每个字的tag[62],譬如B,E,I,S,这四个tag分别表示:
beginning,inside,ending,single,也就是一个词的开始,中间,结束,以及单个字的词。
例如“南京市长江大桥”的标注结果可能为:
“南(B)京(I)市(E)长(B)江(E)大(B)桥(E)”。
由于CRF既可以像最大熵模型一样加各种领域feature,又避免了HMM的齐次马尔科夫假设,所以基于CRF的分词目前是效果最好的。
除了HMM,CRF等模型,分词也可以基于深度学习方法来做,也取得了state-of-the-art的结果。
图2.基于深度学习的中文分词
上图是一个基于深度学习的分词示例图。
我们从上往下看,首先对每一个字进行LookupTable,映射到一个固定长度的特征向量(这里可以利用词向量,boundaryentropy,accessorvariety等);接着经过一个标准的神经网络,分别是linear,sigmoid,linear层,对于每个字,预测该字属于B,E,I,S的概率;最后输出是一个矩阵,矩阵的行是B,E,I,S4个tag,利用viterbi算法就可以完成标注推断,从而得到分词结果。
一个文本串除了分词,还需要做词性标注,命名实体识别,新词发现等。
通常有两种方案,一种是pipelineapproaches,就是先分词,再做词性标注;另一种是jointapproaches,就是把这些任务用一个模型来完成。
一般而言,方法一和方法二在工业界用得比较多,方法三因为采用复杂的模型,虽准确率相对高,但耗时较大。
1.2语言模型
前面在讲“全切分分词”方法时,提到了语言模型,并且通过语言模型,还可以引出词向量,所以这里把语言模型简单阐述一下。
语言模型是用来计算一个句子产生概率的概率模型,即P(w_1,w_2,w_3…w_m),m表示词的总个数。
根据贝叶斯公式:
P(w_1,w_2,w_3…w_m)=P(w_1)P(w_2|w_1)P(w_3|w_1,w_2)…P(w_m|w_1,w_2…w_{m-1})。
最简单的语言模型是N-Gram,它利用马尔科夫假设,认为句子中每个单词只与其前n–1个单词有关,即假设产生w_m这个词的条件概率只依赖于前n–1个词,则有P(w_m|w_1,w_2…w_{m-1})=P(w_m|w_{m-n+1},w_{m-n+2}…w_{m-1})。
其中n越大,模型可区别性越强,n越小,模型可靠性越高。
N-Gram语言模型简单有效,但是它只考虑了词的位置关系,没有考虑词之间的相似度,词语法和词语义,并且还存在数据稀疏的问题,所以后来,又逐渐提出更多的语言模型,例如Class-basedngrammodel,topic-basedngrammodel,cache-basedngrammodel,skippingngrammodel,指数语言模型(最大熵模型,条件随机域模型)等。
最近,随着深度学习的兴起,神经网络语言模型也变得火热[4]。
用神经网络训练语言模型的经典之作,要数Bengio等人发表的《ANeuralProbabilisticLanguageModel》[3],它也是基于N-Gram的,首先将每个单词w_{m-n+1},w_{m-n+2}…w_{m-1}映射到词向量空间,再把各个单词的词向量组合成一个更大的向量作为神经网络输入,输出是P(w_m)。
本文将此模型简称为ffnnlm(Feed-forwardNeuralNetLanguageModel)。
ffnnlm解决了传统n-gram的两个缺陷:
(1)词语之间的相似性可以通过词向量来体现;
(2)自带平滑功能。
文献《Aneuralprobabilisticlanguagemodel2003》
不仅提出神经网络语言模型,还顺带引出了词向量,关于词向量,后文将再细述。
图3.基于神经网络的语言模型
从最新文献看,目前state-of-the-art语言模型应该是基于循环神经网络(recurrentneuralnetwork)的语言模型,简称rnnlm。
循环神经网络相比于传统前馈神经网络,其特点是:
可以存在有向环,将上一次的输出作为本次的输入。
而rnnlm和ffnnlm的最大区别是:
ffnnmm要求输入的上下文是固定长度的,也就是说n-gram中的n要求是个固定值,而rnnlm不限制上下文的长度,可以真正充分地利用所有上文信息来预测下一个词,本次预测的中间隐层信息(例如下图中的context信息)可以在下一次预测里循环使用。
图4.基于simpleRNN(time-delayneuralnetwork)的语言模型
如上图所示,这是一个最简单的rnnlm,神经网络分为三层,第一层是输入层,第二层是隐藏层(也叫context层),第三层输出层。
假设当前是t时刻,则分三步来预测P(w_m):
1,单词w_{m-1}映射到词向量,记作input(t)
2,连接上一次训练的隐藏层context(t–1),经过sigmoidfunction,生成当前t时刻的context(t)
3,利用softmaxfunction,预测P(w_m)
《Rnnlmlibrary》中列出了一个rnnlm的library,其代码紧凑。
利用它训练中文语言模型将很简单,上面“南京市长江大桥”就是rnnlm的预测结果。
基于RNN的languagemodel利用BPTT(BackPropagationthroughtime)算法比较难于训练,原因就是深度神经网络里比较普遍的vanishinggradient问题(在RNN里,梯度计算随时间成指数倍增长或衰减,称之为ExponentialErrorDecay)。
所以后来又提出基于LSTM(Longshorttermmemory)的languagemodel,LSTM也是一种RNN网络,LSTM通过网络结构的修改,从而避免vanishinggradient问题。
图5.LISTmemorycell
如上图所示,是一个LSTMunit。
如果是传统的神经网络unit,outputactivationbi=activation_function(ai),但LSTMunit的计算相对就复杂些了,它保存了该神经元上一次计算的结果,通过inputgate,outputgate,forgetgate来计算输出,具体过程请参考《LSTMNeuralNetworksforLanguageModeling》,《LONGSHORT-TERMMEMORY》。
1.3TermWeighting
Term重要性
对文本分词后,接下来需要对分词后的每个term计算一个权重,重要的term应该给与更高的权重。
举例来说,“什么产品对减肥帮助最大?
”的termweighting结果可能是:
“什么0.1,产品0.5,对0.1,减肥0.8,帮助0.3,最大0.2”。
Termweighting在文本检索,文本相关性,核心词提取等任务中都有重要作用。
Termweighting的打分公式一般由三部分组成:
local,global和normalization[1,2]。
即
TermWeight=L_{i,j}G_iN_j。
L_{i,j}是termi在documentj中的localweight,G_i是termi的globalweight,N_j是documentj的归一化因子。
常见的local,global,normalizationweight公式[2]有:
图6.Localweightformulas
图7.Globalweightformuls
图8.Normalizationfactors
Tf-Idf是一种最常见的termweighting方法。
在上面的公式体系里,Tf-Idf的localweight是FREQ,glocalweight是IDFB,normalization是None。
tf是词频,表示这个词出现的次数。
df是文档频率,表示这个词在多少个文档中出现。
idf则是逆文档频率,idf=log(TD/df),TD表示总文档数。
Tf-Idf在很多场合都很有效,但缺点也比较明显,以“词频”度量重要性,不够全面,譬如在搜索广告的关键词匹配时就不够用。
除了TF-IDF外,还有很多其他termweighting方法,例如Okapi,MI,LTU,ATC,TF-ICF[59]等。
通过local,global,normalization各种公式的组合,可以生成不同的termweighting计算方法。
不过上面这些方法都是无监督计算方法,有一定程度的通用性,但在一些特定场景里显得不够灵活,不够准确,所以可以基于有监督机器学习方法来拟合termweighting结果。
图9.Okapi计算公式
利用有监督机器学习方法来预测weight。
这里类似于机器学习的分类任务,对于文本串的每个term,预测一个[0,1]的得分,得分越大则term重要性越高。
既然是有监督学习,那么就需要训练数据。
如果采用人工标注的话,极大耗费人力,所以可以采用训练数据自提取的方法,利用程序从搜索日志里自动挖掘。
从海量日志数据里提取隐含的用户对于term重要性的标注,得到的训练数据将综合亿级用户的“标注结果”,覆盖面更广,且来自于真实搜索数据,训练结果与标注的目标集分布接近,训练数据更精确。
下面列举三种方法(除此外,还有更多可以利用的方法):
从搜索session数据里提取训练数据,用户在一个检索会话中的检索核心意图是不变的,提取出核心意图所对应的term,其重要性就高。
从历史短串关系资源库里提取训练数据,短串扩展关系中,一个term出现的次数越多,则越重要。
从搜索广告点击日志里提取训练数据,query与bidword共有term的点击率越高,它在query中的重要程度就越高。
通过上面的方法,可以提取到大量质量不错的训练数据(数十亿级别的数据,这其中可能有部分样本不准确,但在如此大规模数据情况下,绝大部分样本都是准确的)。
有了训练数据,接下来提取特征,基于逻辑回归模型来预测文本串中每个term的重要性。
所提取的特征包括:
term的自解释特征,例如term专名类型,term词性,termidf,位置特征,term的长度等;
term与文本串的交叉特征,例如term与文本串中其他term的字面交叉特征,term转移到文本串中其他term的转移概率特征,term的文本分类、topic与文本串的文本分类、topic的交叉特征等。
核心词、关键词提取
短文本串的核心词提取。
对短文本串分词后,利用上面介绍的termweighting方法,获取termweight后,取一定的阈值,就可以提取出短文本串的核心词。
长文本串(譬如webpage)的关键词提取。
这里简单介绍几种方法。
采用基于规则的方法。
考虑到位置特征,网页特征等。
基于广告主购买的bidword和高频query建立多模式匹配树,在长文本串中进行全字匹配找出候选关键词,再结合关键词weight,以及某些规则找出优质的关键词。
类似于有监督的termweighting方法,也可以训练关键词weighting的模型。
基于文档主题结构的关键词抽取。
2文本语义分析
前面讲到一些文本基本处理方法。
一个文本串,对其进行分词和重要性打分后(当然还有更多的文本处理任务),就可以开始更高层的语义分析任务。
2.1TopicModel
首先介绍主题模型。
说到主题模型,第一时间会想到pLSA,NMF,LDA。
关于这几个目前业界最常用的主题模型,已经有相当多的介绍了。
在这里,主要想聊一下主题模型的应用以及最新进展(考虑到LDA是pLSA的generalization,所以下面只介绍LDA)。
LDA训练算法简单介绍
我们主要看一下怎么训练LDA。
在Blei的原始论文中,使用variationalinference和EM算法进行LDA推断(与pLSA的推断过程类似,E-step采用variationalinference),但EM算法可能推导出局部最优解,且相对复杂。
目前常用的方法是基于gibbssampling来做。
Step1:
随机初始化每个词的topic,并统计两个频率计数矩阵:
Doc-Topic计数矩阵N(t,d),描述每个文档中的主题频率分布;Word-Topic计数矩阵N(w,t),表示每个主题下词的频率分布。
Step2:
遍历训练语料,按照概率公式(下图所示)重新采样每个词所对应的topic,更新N(t,d)和N(w,t)的计数。
Step3:
重复step2,直到模型收敛。
对文档d中词w的主题z进行重新采样的公式有非常明确的物理意义,表示为P(w|z)P(z|d),直观的表示为一个“路径选择”的过程。
图10.gibbssampling过程图
以上描述过程具体请参考《Peacock:
大规模主题模型及其在腾讯业务中的应用》。
对于LDA模型的更多理论介绍,譬如如何实现正确性验证,请参考《Xuemin.LDA工程实践之算法篇》,而关于LDA模型改进,请参考Newman团队的最新文章《CareandFeedingofTopicModels》。
主题模型的应用点
在广点通内部,主题模型已经在很多方面都得到成功应用[65],譬如文本分类特征,相关性计算,ctr预估,精确广告定向,矩阵分解等。
具体来说,基于主题模型,可以计算出文本,用户的topic分布,将其当作pctr,relevance的特征,还可以将其当作一种矩阵分解的方法,用于降维,推荐等。
不过在我们以往的成功运用中,topic模型比较适合用做某些机器学习任务的特征,而不适合作为一种独立的方法去解决某种特定的问题,例如触发,分类。
Blei是这样评价lda的:
itcaneasilybeusedasamoduleinmorecomplicatedmodelsformorecomplicatedgoals。
为什么topicmodel不适合作为一种独立的方法去解决某种特定的问题(例如分类,触发等)。
个人总结,主要原因是lda模型可控性可解释性相对比较差:
对于每个topic,不能用很明确的语义归纳出这个topic在讲什么;重新训练一遍lda模型,每个topicid所对应的语义可能发生了变化;有些topic的准确性比较好,有些比较差,而对于比较差的topic,没有特别好的针对性的方法去优化它;
另外一个就是topic之间的重复,特别是在topic数目比较多的情况,重复几乎是不可避免的,当时益总(yiwang)在开发peacock的时候,deduplicatetopic就是一个很重要的任务。
如果多个topic描述的意思一致时,用topicid来做检索触发,效果大半是不好的,后来我们也尝试用topicword来做,但依旧不够理想。
主体模型最新进展
首先主题模型自PLSA,LDA后,又提出了很多变体,譬如HDP。
LDA的topicnumber是预先设定的,而HDP的topicnumber是不固定,而是从训练数据中学习得到的,这在很多场景是有用的,具体参考hdpvslda。
深度学习方面,GeoffHinton及其学生用DeepBoltzmannMachine研究出了类似LDA的隐变量文本模型[82],文章称其抽取的特征在文本检索与文本分类上的结果比LDA好。
heavenfireray在其微博评论道:
lda结构是word-hiddentopic。
类lda结构假设在topic下产生每个word是条件独立而且参数相同。
这种假设导致参数更匹配长文而非短文。
该文章提出word-hiddentopic-hiddenword,其实是(word,hiddenword)-hiddentopic,增加的hiddenword平衡了参数对短文的适配,在分类文章数量的度量上更好很自然。
其次,随着目前互联网的数据规模的逐渐增加,大规模并行PLSA,LDA训练将是主旋律。
大规模主题模型训练,除了从系统架构上进行优化外,更关键的,还需要在算法本身上做升级。
variational方法不太适合并行化,且速度相对也比较慢,这里我们着重看sampling-baseinference。
collapsedGibbssampler[57]:
O(K)复杂度,K表示topic的总个数。
SparseLDA[66]:
算法复杂度为O(Kd+Kw),Kd表示文档d所包含的topic个数,Kw表示词w所属的topic个数,考虑到一个文档所包含的topic和一个词所属的topic个数是有限的,肯定远小于K,所以相比于collapsedGibbs,复杂度已有较大的下降。
AliasLDA[56]:
利用aliastable和Metropolis-Hastings,将词这个维度的采样复杂度降至O
(1)。
所以算法总复杂度为O(Kd)。
Metropolis-Hastingssampler[13]:
复杂度降至O
(1)。
主体模型并行化
在文献《DavidNewman.DistributedAlgorithmsforTopicModels》
中,Newman团队提出了LDA算法的并行化版本Approximatedistributed-LDA,如下图所示:
图11.AD-LDA算法
在原始gibbssampling算法里,N(w,t)这个矩阵的更新是串行的,但是研究发现,考虑到N(w,t)矩阵在迭代过程中,相对变化较小,多个worker独立更新N(w,t),在一轮迭代结束后再根据多个worker的本地更新合并到全局更新N(w,t),算法依旧可以收敛[67]。
那么,主题模型的并行化(不仅仅是主题模型,其实是绝大部分机器学习算法),主要可以从两个角度来说明:
数据并行和模型并行。
数据并行。
这个角度相对比较直观,譬如对于LDA模型,可以将训练数据按照worker数目切分为M片(M为worker数),每个worker保存一份全局的N(w,t)矩阵,在一轮迭代里,各个worker独立计算,迭代结束后,合并各个worker的本地更新。
这个思路可以借用目前通用的并行计算框架,譬如Spark,Hadoop,Graphlab等来实现。
模型并行。
考虑到矩阵N(w,t)在大规模主题模型中相当巨大,单机内存不可能存下。
所以直观的想法,可以将N(w,t)也切分成多个分片。
N(w,t)可以考虑使用全局的parameterserver来存储,也可以考虑存储在不同worker上,利用MPIAllReduce来通信。
数据与模型并行,可以形象的描述为一个棋盘。
棋盘的行按照数据划分,棋盘的列按照模型划分。
LDA的并行化,就是通过这样的切分,将原本巨大的,不可能在单机存储的矩阵切分到不同的机器,使每台机器都能够将参数存储在内存。
再接着,各个worker相对独立计算,计算的过程中不时按照某些策略同步模型数据。
最近几年里,关于LDA并行化已有相当多的开源实现,譬如:
PLDA,PLDA+
YahooLDA
Parameterserver
最近的并行LDA实现Peacock[70,65]和LigthLda[13]没有开源,但我们可以从其论文一窥究竟,总体来说,并行化的大体思路是一致的。
譬如LightLDA[13],下图是实现架构框图,它将训练数据切分成多个Block,模型通过parameterserver来同步,每个datablock,类似于slidingwindows,在计算完V1的采样后,才会去计算V2的采样(下图中V1,V2,V3表示word空间的划分,即模型的划分)。
图12.Lightda并行结构图
2.2词向量,句向量
在文本分析的vectorspacemodel中,是用向量来描述一个词的,譬如最常见的One-hotrepresentation。
One-hotrepresentation方法的一个明显的缺点是,词与词之间没有建立关联。
在深度学习中,一般用DistributedRepresentation来描述一个词,常被称为“WordRepresentation”或“WordEmbedding”,也就是我们俗称的“词向量”。
词向量起源于hinton在1986年的论文,后来在Bengio的ffnnlm论文中,被发扬光大,但它真正被我们所熟知,应该是word2vec的开源。
在ffnnlm中,词向量是训练语言模型的一个副产品,不过在word2vec里,是专门来训练词向量,所以word2vec相比于ffnnlm的区别主要体现在:
模型更加简单,去掉了ffnnlm中的隐藏层,并去掉了输入层跳过隐藏层直接到输出层的连接。
训练语言模型是利用第m个词的前n个词预测第m个词,而训练词向量是用其前后各n个词来预测第m个词,这样做真正利用了上下文来预测,如下图所示。
图13.word2vec的训练方法
上图是word2vec的两种训练算法:
CBOW(continuousbag-of-words)和Skip-gram。
在cbow方法里,训练目标是给定一个word的context,预测word的概率;在skip-gram方法里,训练目标则是给定一个word,预测word的context的概率。
关于word2vec,在算法上还有较多可以学习的地方,例如利用huffman编码做层次softmax,negativesampling,工程上也有很多trick。
词向量的应用
词向量的应用点:
可以挖掘词之间的关系,譬如同义词。
可以将词向量作为特
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语义 分析 方案 贾俊华