senLDA实践—长短文本相似度

背景:计算短文本与长文本的相似度,如在搜索场景中,计算query和doc的相似度,用于排序。

经过调研,找到百度的Familia项目,在其关于“语义匹配”的介绍中,分为三类

1. 短文本与短文本 : 场景如 网页搜索中,我们需要度量用户查询 (query) 和网页标题 (web page title) 的语义相关性;在query推荐中,我们需要度量query其他query之间的相似度。 主题模型在短文本上的效果不太理想,在短文本-短文本匹配任务中词向量的应用比主题模型更为普遍如Wordvec向量进行计算。可以考虑的处理方式 1. 按位相加取平均 2. 按位取最大值  3.带权按位相加  。 非监督模型,不需要标注。

2. 短文本与长文本   根据长文本的主题分布,计算该分布生成短文本的概率,作为它们之间的相似度。而各分布概率由senLDA给出。

其中表示query, 表示content, w表示query中的词,Zk 表示第k个主题。

3. 长文本与长文本

通过使用主题模型,我们可以得到两个长文本的主题分布,再通过计算两个多项分布的距离来衡量它们之间的相似度。衡量多项分布的距离可以利用Hellinger Distance和Jensen-Shannon Divergence (JSD)。

github地址  : https://github.com/baidu/Familia  

Familia  项目中需要下载已经训练好的LDA模型,然后进行计算。而训练好的有新闻、小说、网页、微博四个领域。不是适合我的领域。因此需要预先训练好一个模型,由Familia   去加载进行计算。则,1. 模型什么样子 2. 怎么训练模型 3. 怎么用Familia。  

对于问题1,通过读 Familia一点代码,其运行demo需要依赖的输入很少。而下载好的模型中,senLDA模型中是可读的文件,每行表达了每个词的id ,属于每个topic 的次数。  

对于问题2,在寻找Familia资料的过程中,找到另一个开源的项目,是用于训练的代码。这份代码只对英文,也需要分词。而对中文场景,采用Hanlp做分词,并做一些处理。处理主要是在保留“分句”标点的前提下,删除其他标点,去停用词,利用词性去一些词。(真实数据还是千奇百怪的)而这些都是为了去掉一些无用的词,来保证主题模型能有一个比较好的结果。而对于主题模型,有一个问题,其主题没有具体的含义,该如何量化的衡量模型的好坏,又以何标准去调整参数。对这个问题,先是尝试了自带的perplexity的方法。perplexity,直译为困惑度。对于一篇文档d,我们的模型对文档d属于哪个topic有多不确定,这个不确定程度就是Perplexity。其他条件固定的情况下,topic越多,则Perplexity越小,但是容易过拟合。  测试文本集中有M篇文本,对词袋模型里的任意一个单词w,P(w)=∑z p(z|d)*p(w|z),即该词在所有主题分布值和该词所在文本的主题分布乘积,是(该doc生成某个词的概率)。模型的perplexity就是exp^{ - (∑log(p(w))) / (N) },∑log(p(w))是对所有单词取log(直接相乘一般都转化成指数和对数的计算形式),N的测试集的单词数量(不排重)。其实衡量的就是 这个模型下,该文本属于现在的主题分布的概率(非严格概率)。

对于问题3,Familia对长短文本相似度的计算是用c实现的,而且还必须加载TWE模型。 肯定是要改的。至于怎么改,算出这个概率,1.首先得算出来。这个doc的主题分布。2. 通过两个概率分布,计算query与doc的相似度。

后续待补。

衡量模型标准:1. Perplexity 2. 当主题结构的平均相似度最小时,对应的模型最优。 3. 层次狄利克雷过程(HDP)。

在该方法中,主题本身是由数据生成的,而不是预先将主体固定,然后通过对数据的反向工程把它们恢复出来。


如果不去那些停用词,会有什么后果。

github地址 :https://github.com/balikasg/topicModelling

你可能感兴趣的:(senLDA实践—长短文本相似度)