阅读 8

寻找相近词

问题

很多时候,我们都需要寻找一个词的相近词(或者说计算词之间的相似度),比如支持模糊检索,聚合词语的含义等。本文介绍的寻找相近词的技术基础,实际上还是NLP领域深度学习的基本技巧之一。

解决方案

要计算词语之间的相似度,我们需要把词语映射到一个多维空间,然后计算向量之间的相似度就可以了。关键是如何进行这个映射,使得意思相近的词语在这个空间中也相邻。

好在深度学习已近基本解决了这个问题,利用自标注的海量语料训练,可以把神经网络中的权重作为映射的向量。这里我们不具体讨论原理,以一个黑盒来看的话,就是我们可以直接利用别人提供的向量映射文件。

本文为了简单起见,使用Chinese-Word-Vectors 中相对较小的一个向量文件,它是基于微博的语料训练的,下载地址

使用gensim库来使用该文件。

import numpy as np
import gensim
复制代码
model = gensim.models.KeyedVectors.load_word2vec_format("sgns.weibo.word", binary=False, encoding='utf8')
复制代码

基本上可以把model对象看成一个扩展了一些功能的大型字典。

arr1 = model["微博"]
arr2 = model["微信"]
len(arr1), type(arr1), arr1.dtype
复制代码

(300, numpy.ndarray, dtype('float32'))

每个词对应一个300维的向量。我们可以计算两个词的相似度。

model.similarity("微博", "微信")
复制代码

0.3628086

它的计算方法其实就是计算两个向量的余弦距离

def similarity(word1, word2):
    arr1 = model[word1]
    arr2 = model[word2]
    result = np.dot(arr1/np.linalg.norm(arr1), arr2/np.linalg.norm(arr2))
    return result

similarity("微博", "微信")
复制代码