Perceptron

短语相似度算法 - Simple Phrase Similarity Algorithm

2018-09-25


应用背景

实习中遇到一项工作:对语义重复或语义近似的POI标签进行筛查,该项工作可以进一步可以引申为计算短语相似度问题,这里用我自己简单明了的解决方法抛砖引玉,希望能提供一些思路,促进大家交流。


主要思路

该算法的基本思路为用不同方法向量化表示短语,转化为短语向量后再两两计算相似度。


算法细节

1. 中文词嵌入

选取 中文词向量汇总 中的300维 Mixed-large,由百度百科、中文维基百科、人民日报、搜狗新闻等等语料训练出包含单个汉字、词语的字词嵌入表示。


2. 分词方法

jieba分词 精确模式分词,标签短语结构简单,往往只是名词+形容词或者单个或多个形容词,jieba分词就能基本满足分词要求。


3. 相似度表示方法

向量化表示短语后,短语相似度问题就变为300维向量相似度问题,由于Embedding后向量表示高度抽象化,也就是说300维中各个维度难以用浅层特征来描述,所以这里采用余弦相似度 (cosine similarity)


4. 短语表示方法

a. Word Centroid 词义中心

思想:将短语分词后的各部分Embedding取平均值

优点: 考虑到标签短语较短,在分词或分字后不会有太多部分,所以该方法表示能在一定程度上得到短语整体的语义信息

缺点:

  1. 长短不一短语效果不好

  2. 词序,同样的词顺序不同的情况无法分辨

    similarity(‘好吃不贵’,’好贵不吃’,’cosine’) = 2.5125567e-07

  3. 否定词,否定词效果不明显

    similarity(‘好吃’,’不好吃’,’cosine’) = 2.1768517
    similarity(‘好吃’,’难吃’,’cosine’) = 3.7945359

  4. 语义理解

    similarity(‘老板热情’,’服务周到’,’cosine’) = 4.8603044


b. Word Movers’ Distance 词移距离

网上没有找到WMD的官方翻译,所以按照自己的理解翻译了一下,该方法源自于 2015 年的一篇论文 From Word Embeddings To Document Distances。这篇论文原本是基于word2vec的文档向量化表示,移用WMD作为短语向量表示的主要原因是在短语比较中,WMD能在不考虑词序的情况下匹配两个短语中的相同语义部分。

image-20181111122827219

思想:对 短语1 中的每一个词,遍历 短语2 中的所有词算cosine距离,把 短语1 中每个词对应最低的距离相加后平均,作为这两个短语的距离

优点:

  1. 该方法能一定程度上忽略词序对短语表示的影响,因为很多重复标签都是由于词序颠倒被错误添加,该方法能很好的解决这个问题。
  2. 距离计算次数由第一个短语决定,所以对长短不一的短语效果有提升。


5. Stacking

考虑到两种表示方法各有优点,能侧重短语不同方面的表示,所以做stacking结合两者优点:首先用word centroid粗晒,用 quickSort 选取各标签最相似的Top20,再在Top20的基础上用 Word Movers’ Distance 选取 Top5


代码实现及算法结果

代码实现短语相似度算法: Jupyter Notebook Link



1. Result of Word Centroid / 词义中心结果

image-20181111123155343



2. Result of Linear Combination of Word Centroid and Word Mover’s Distance / 最终结果

image-20181111123248824


改进方向

  1. 加入深度学习方法(Promising)

    利用AutoEncoder对短语进行编码,计算编码后向量的相似度。

    AutoEncoder能很好的编码语义信息,可以在一定程度上解决语义理解和词序的问题。

    在此处Stacking后的结果上进一步优化

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章