同义词查找,关键词扩展,使用腾讯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 )] 请输入关键词: |
多思考也是一种努力,做出正确的分析和选择,因为我们的时间和精力都有限,所以把时间花在更有价值的地方。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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