点此进入CSDN

点此添加QQ好友 加载失败时会显示




同义词查找,关键词扩展,使用腾讯Tencent AILAB的800万词向量,gensim,annoy

最近在做一个关键词匹配系统,为了更好的效果,

添加一个关键词扩展的功能。使用Tencent AIlab的800万词向量文件。

 

腾讯AILAB的800万词向量下载地址:https://ai.tencent.com/ailab/nlp/zh/embedding.html     这个是最新的有效地址

 

是用gensim模块读取词向量,并找到相似词,占用内存比较大,速度也慢,最好是16g以上的内存和高主频的cpu

1
2
3
4
5
6
7
8
9
10
11
12
import gensim
 
 
wv_from_text = gensim.models.KeyedVectors.load_word2vec_format('./Tencent_AILab_ChineseEmbedding.txt',binary=False)
 
wv_from_text.init_sims(replace=True# 神奇,很省内存,可以运算most_similar
 
 
while True:
    keyword = input("输入关键词:")
    w1 = [keyword]
    print(wv_from_text.most_similar(positive=w1,topn=5))

  会返回5个最相似的词语

 

下面这个代码会使用annoy模块,这个模块好像不支持windows,要使用linux系统,32g以上内存加上高主频cpu。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from gensim.models import KeyedVectors
import json
from collections import OrderedDict
from annoy import AnnoyIndex
 
# 此处加载时间略长,加载完毕后大概使用了12G内存,后续使用过程中内存还在增长,如果测试,请用大一些内存的机器
tc_wv_model = KeyedVectors.load_word2vec_format('./Tencent_AILab_ChineseEmbedding.txt', binary=False)
 
# 构建一份词汇ID映射表,并以json格式离线保存一份(这个方便以后离线直接加载annoy索引时使用)
word_index = OrderedDict()
for counter, key in enumerate(tc_wv_model.vocab.keys()):
    word_index[key] = counter
 
with open('tc_word_index.json', 'w') as fp:
    json.dump(word_index, fp)
 
# 开始基于腾讯词向量构建Annoy索引,腾讯词向量大概是882万条
# 腾讯词向量的维度是200
tc_index = AnnoyIndex(200)
i = 0
for key in tc_wv_model.vocab.keys():  #遍历Tencent词向量的所有词
    v = tc_wv_model[key]
    tc_index.add_item(i, v)
    i += 1
 
 
# 这个构建时间也比较长,另外n_trees这个参数很关键,官方文档是这样说的:
# n_trees is provided during build time and affects the build time and the index size.
# A larger value will give more accurate results, but larger indexes.
# 这里首次使用没啥经验,按文档里的是10设置,到此整个流程的内存占用大概是30G左右
tc_index.build(10)
 
# 可以将这份index存储到硬盘上,再次单独加载时,带词表内存占用大概在2G左右
tc_index.save('tc_index_build10.index')
 
# 准备一个反向id==>word映射词表
reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
 
# 然后测试一下Annoy,自然语言处理和AINLP公众号后台的结果基本一致
# 感兴趣的同学可以关注AINLP公众号,查询:相似词 自然语言处理
for item in tc_index.get_nns_by_item(word_index[u'自然语言处理'], 11):
    print(reverse_word_index[item])
 
# 不过英文词的结果好像有点不同
for item in tc_index.get_nns_by_item(word_index[u'nlp'], 11):
    print(reverse_word_index[item])

  

 OK,上面的代码已经保存好了索引词文件,和索引词向量文件,下面开始使用,

它和gensim还是有些区别的,就是你查找相似的词必须在Tencent 词向量的词表里,

否则不能查,而gensim就不会有这个问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import json
from annoy import AnnoyIndex
 
 
# JSON到字典转化
f2 = open('tc_word_index.json', 'r')
word_index = json.load(f2)
 
 
# 开始基于腾讯词向量构建Annoy索引,腾讯词向量大概是882万条
# 腾讯词向量的维度是200
tc_index = AnnoyIndex(200)
# 加载保存好的索引,带词表内存占用大概在2G左右
tc_index.load('tc_index_build10.index')
 
# 准备一个反向id==>word映射词表
index_word = dict([(value, key) for (key, value) in word_index.items()])
 
# 查询:相似词 自然语言处理
while True:
    keyword = input("请输入关键词:")
    index = word_index.get(keyword)
    if index:
        print("相似词有:")
        #获取相似的结果和分数 [[结果,,,],[分数,,,]]
        result = tc_index.get_nns_by_item(index, 10, include_distances=True)
        #获取分数小于0.65的结果
        sim_keywords = [(index_word[idx],distance) for idx,distance in zip(result[0],result[1]) if distance<0.8]
 
        print(sim_keywords)
    else:
        print("词表不存在输入的关键词!")

  分数越小越代表相似度高

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
请输入关键词:价格
价格
相似词有:
[('价格', 0.0), ('价位', 0.6172553896903992), ('价', 0.6483607888221741), ('中价格', 0.6971825361251831), ('价格降', 0.7441657185554504), ('相对价格', 0.7511115074157715), ('选择价格', 0.7584652304649353), ('期望价格', 0.7803905606269836), ('心理价位', 0.7834618091583252), ('差价', 0.7885775566101074)]
请输入关键词:年龄
年龄
相似词有:
[('年龄', 0.0), ('25岁', 0.7704739570617676)]
请输入关键词:身高
身高
相似词有:
[('身高', 0.0), ('172cm', 0.6500729918479919), ('169cm', 0.6635174751281738), ('187cm', 0.6728192567825317), ('171cm', 0.6744356155395508), ('166cm', 0.6759911179542542), ('身高太矮', 0.6901100873947144), ('身高178', 0.6942415833473206), ('模特身高', 0.707866907119751), ('身高173', 0.7188507914543152)]
请输入关键词:体重
体重
相似词有:
[('体重', 0.0), ('标准体重', 0.7117555737495422), ('孕前体重', 0.719347357749939), ('增重', 0.7211400270462036), ('理想体重', 0.7256979942321777), ('70公斤', 0.7259328961372375), ('60公斤', 0.7400050759315491), ('孕期体重增加', 0.7469530701637268), ('体重范围', 0.7582899332046509), ('体重控制', 0.774792492389679)]
请输入关键词:

  

 

posted @   高颜值的殺生丸  阅读(1617)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App

作者信息

昵称:

刘新宇

园龄:4年6个月


粉丝:1209


QQ:522414928

点击右上角即可分享
微信分享提示