高维空间向量搜索---腾讯词向量相似检索实践

12 篇文章 7 订阅

高维空间向量搜索—腾讯词向量相似检索实践

最近工作上遇到一些语料OOV问题,想到可以使用同义词进行替换来弥补部分OOV带来的问题,于是就有了本篇博客的相关实验。
最简单的可以使用gemsim在语料库上训练一个word2vec,然后使用gemsim自带的相似度API直接进行计算,这种方法是最简单的(不考虑内存消耗,计算时间的情况下)。但是自己的语料本身就有OOV问题,训练后,估计效果也不行,于是想到使用腾讯的语料,网上有一篇使用腾讯语料计算相似词的文章,但是只能使用公众号来请求,没有给出代码。
本文记录一下使用腾讯的全部词向量,使用高维空间向量搜索工具:hnsw进行的相关实验。
主要包括

1. 文件读取

腾讯词向量下载自行百度,下载后解压,大约16G的样子,是200维的高维向量
读取很简单

import numpy as np
def load_tencent_emb_data(path):
    """
    加载腾讯词向量
    :param path: 
    :return: 
    """
    datas = []
    word_id_map = {}
    with open(path, 'r', encoding='utf-8') as fd:
        for idx, line in enumerate(fd):
            if idx == 0:
                continue
            line = line.strip().split(' ')
            word_id_map[line[0]] = idx
            datas.append([float(x) for x in line[1:]])
    return np.asarray(datas), word_id_map

因为hnsw的输入需要时numpy格式的,所以讲向量转成了nparray

2. 构建索引

一般的高维向量搜索, 都需要去构建索引,例如faiss,nsg,ssg等(这些demo后面有时间补上)
构建索引的方法在hnsw的readme中有很好的说明,我只是一个搬运工
首先,安装hnsw包

pip install hnswlib

下面是构建腾讯词向量索引的代码

import hnswlib
def build_hnsw_search_index(data):
    num_elements, dim = data.shape

    # Generating sample data
    data_labels = np.arange(num_elements)

    # Declaring index
    p = hnswlib.Index(space='cosine', dim=dim)  # possible options are l2, cosine or ip

    # Initing index - the maximum number of elements should be known beforehand
    p.init_index(max_elements=num_elements, ef_construction=200, M=16)

    # Element insertion (can be called several times):
    p.add_items(data, data_labels)
    
    return  p

3. 向量搜索

def search_word_similarity(word, k=10):
    """
    查找与word最相近的k个词
    :param word: 
    :param k: 
    :return: 
    """
    w_id = word_id_map.get(word, None)
    if not w_id:
        print('do not found {} embeding'.format(word))
        return []
    return p.knn_query(data[w_id], k=k)

例如,搜索北京,可以得到如下词
在这里插入图片描述
中方:
在这里插入图片描述
因为是相似搜索,时间和精确度的权衡可以参考这里https://github.com/nmslib/hnswlib/blob/master/ALGO_PARAMS.md

4. 索引序列化和加载

4.1 序列化

p.save_index(path)
4.2 加载
 p.load_index(path)

5. 总结

hnsw是一个相比faiss在精度上更有优势的库,15G的腾讯词向量转化为索引后,需要占用8G的内存。faiss库也是一个很好地库,但是在使用过程中,感觉精度并没有hnsw库好。当然最近浙大和阿里也有相关工作,后续有时间,也会贴出相关实验代码(浙大的库全是C++,门槛有点高,编译有点复杂)。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值