一种考虑上下文位置的词语分布相似度计算方法

一种考虑上下文位置的词语分布相似度计算方法

海青 海青 原文链接 2014-05-19 17:48:30 发表于:自然语言处理与应用 浏览 4
 

    最近在挖掘知识图谱的同义关系,回顾去年做的一个相似词的工作,在这里简单总结一下。

One-hot Representation

​        要计算两个词的距离,首先需要将这些词数学符号化。自然语言处理中最常用的词表示方法是“One-hot Representation”,它将一个词表示为一个长向量,每个向量只有一个维度是1,其它维度全是0。比如:

“番茄”可能表示为:     [0 0 1 0 0 0 0 0]

“西红柿”可能表示为:[0 0 0 1 0 0 0 0]

这样的表示方法没办法计算词和词之间的关系,任何两个词之间都是孤立的。

 

distributional similarity

​        分布相似度是一种词与词的语义相似度计算方法,它基于Harris在1954年提出的“distributional hypothesis”[1],也就是两个词如果有类似的上下文,那这个两个词就具有语义上的相似度。它的实现分为3步:

       第一步,定义上下文;

       第二步,把每个词表示成一个特征向量,向量每一维代表一个不同的上下文,向量的值表示本词相对于上下文的权重;

       第三步,计算两个特征向量之间的相似度,将其作为它们所代表的词之间的相似度。    

​    基于BOW的分布相似度方法

 

     最简单的做法是定义一个window作为这个词的语境,统计整个语料这个词在window内出现的特征(这里的特征可以是上下文字/词的频度、tf- idf、互信息等),再把这些特征用bag of words模型来表示成一个向量,然后计算向量的余弦距离。这种做法的缺点是bag of words只考虑了词特征的直方图,忽略了词的位置信息。

​ 

     考虑位置的分布相似度方法

​        本文的方法是将window内的每个位置作为单独向量。具体就是首先定义window大小为K,将每个词window内每个位置用BOW表征为一个向 量,这样一个词就被表示为K*N的矩阵(N为词向量的长度,K为window的大小),也就是K个长度为N的向量,计算相似度的时候用每个位置的向量分别 计算距离,最后再将距离加权平均得到最终的相似度。

 

       ​我们以淘宝所有商品的标题为例,大致讲解计算词相似度过程:

    ​   1) 获取需要计算相似度的所有词,这里我们是用统计语言的方法从淘宝商品标题中抽取了所有有意义的phrase;

​       2) 定义window为每个词的前后3个位置的字。基于BOW计算每个位置上的向量。如下图,第一列就是目的词语,第二列表示为目的词语左边第三个位 置,第3列表示分组信息(为了便于计算,可忽略),第4列就是出现在“棉服”左边第3个位置的字组成的向量。

alt

      ​​

       ​3) 计算两个词对应位置的余弦相似度。这一步是整个过程最耗时的,Pairwise的相似度计算很头疼,直接暴力组合每两个词语然后计算距离肯定不 可行。还好可以通过类似倒排的方式来对组合进行剪枝,这种海量item两两计算距离在MR上已经有成熟解法,可以参考[2]。即便用了这种剪枝方法,当时 算十几万词语相似度也在云梯跑了一整天,占据了60T的存储空间。

​ 

​       4) 计算两个词的相似度。有了两个词每个位置的相似度后,再把6个位置的分数融合一下就得到最终相似度了。​​本文只是简单粗暴的将6个位置的相似度求了个平均值得到最终的相似度。抽几个demo的例子看看:

​ 

​ 

alt

​       ​

​        通过这种方法计算出来的相似词可以分为紧相似和松相似,紧相似就是类似于同义词的相似,松相似就是类似于同类型的相似。

​ 

 

优化点

        

       当时算了一版相似度后就没再进行优化,回头看在向量特征表示和多个位置相似度融合上还有很大优化空间。后来也比较过word2vec,很多case上效 果类似,在整体效果是word2vec好不少。但是word2vec需要依赖分词,对于未登录词或者分错的词得不到相似词的信息,本文的方法对所有有意义 的phrase都可以计算相似词。

​      有了词和词的相似度,能应用的地方就太多啦。笔者当时主要用于图谱的命名实体识别和词的属性预测上。

你可能感兴趣的:(相似度计算)