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

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

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

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

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。

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就不会有这个问题

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("词表不存在输入的关键词!")

  分数越小越代表相似度高

请输入关键词:价格
价格
相似词有:
[('价格', 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)]
请输入关键词:

  

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

  1. git 关键词扩展

    用习惯了svn 的 关键词扩展.自然在git上也会寻找. 不知道啥是svn的关键词扩展? 简单列举下: 对于subversion来说,一些版本信息是不需要手动添加的,subversion提供了关键字替 ...

  2. 【中文同义词近义词】词向量 vs 同义词近义词库

    方案一:利用预训练好的词向量模型 优点: (1)能把词进行语义上的向量化(2)能得到词与词的相似度 缺点: (1)词向量的效果和语料库的大小和质量有较大的关系(2)用most_similar() 得到 ...

  3. 词向量-LRWE模型-更好地识别反义词同义词

    上一节,我们介绍利用文本和知识库融合训练词向量的方法,如何更好的融合这些结构化知识呢?使得训练得到的词向量更具有泛化能力,能有效识别同义词反义词,又能学习到上下文信息还有不同级别的语义信息. 基于上述 ...

  4. linux,windows下日志文件查找关键词

    1.查找 /apps/tomcat/tomcat3/apache-tomcat-7.0.69/logs 目录下已.txt结尾的文件,在文件中搜索关键字 IfcmpEcrService并打印行号 /lo ...

  5. 最新IP地址数据库 二分逼近&二分查找 高效解析800万大数据之区域分布

    最新IP地址数据库  来自 qqzeng.com 利用二分逼近法(bisection method) ,每秒300多万, 比较高效! 原来的顺序查找算法 效率比较低 readonly string i ...

  6. 我从腾讯那“偷了”3000万QQ用户数据,出了份很有趣的独家报告!

    声明: 1.目前程序已停止运行!QQ空间也已升级访问安全机制. 2.本“分析”数据源自部分用户的公开信息,并未触及隐私内容,广大网友无需担心. 3.QQ空间会不定期发布大数据分析报告,感兴趣的朋友关注 ...

  7. 转 从腾讯那“偷 了”3000万QQ用户数据

    http://www.icaijing.com/hot/article4899809/ http://news.cnblogs.com/n/533061/

  8. LUSE: 无监督数据预训练短文本编码模型

    LUSE: 无监督数据预训练短文本编码模型 1 前言 本博文本应写之前立的Flag:基于加密技术编译一个自己的Python解释器,经过半个多月尝试已经成功,但考虑到安全性问题就不公开了,有兴趣的朋友私 ...

  9. 以虎嗅网4W+文章的文本挖掘为例,展现数据分析的一整套流程

    本文转自知乎 作者:苏格兰折耳喵 ----------------------------------------------------- 本文作者将结合自身经验,并以实际案例的形式进行呈现,涉及从 ...

  10. word2vec词向量训练及中文文本类似度计算

    本文是讲述怎样使用word2vec的基础教程.文章比較基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python ...

随机推荐

  1. golang官方包管理vendor模式无法引用非go文件

    主页 微信公众号:密码应用技术实战 博客园首页:https://www.cnblogs.com/informatics/ 背景&问题 golang作为高级计算机语言之一,在云原生以及web网站 ...

  2. Zabbix“专家坐诊”第190期问答汇总

    问题一 Q:请问为啥用拓扑图监控交换机接口流量,获取不到数据,显示未知,键值也没错 ,最新数据也能看到,是什么原因呢? A:把第一个值改成主机名. 问题二 Q:请问下zabbix server 有什么 ...

  3. 使用fastJson中的JSONObject对象简化POST请求传参-2022新项目

    一.业务场景 Java项目开发中,经常会用到远程调用,不管是POST请求,Feign远程调用,还是使用Resttemplate中的POST方法等等都需要传递参数. 可是如何更好的传递参数呢?之前自己开 ...

  4. 摆脱鼠标系列 - vscode 上一个编辑器 下一个编辑器 Ctrl + h Ctrl + l

    摆脱鼠标系列 - vscode 上一个编辑器 下一个编辑器 Ctrl + H Ctrl + L 为什么 根据 hjkl h是左边的原则 h 左移一位 b 左移一个单词 H 移动到句首 0 是行首 I是 ...

  5. gcc编译stm32 f103出现错误init.c:(.text.__libc_init_array+0x20): undefined reference to `_init'

    解决方法: 方法一:去掉makefile中的编译选项:-nostartfiles 方法二:方法一不凑效的情况下,添加编译选型:--specs=nano.specs

  6. Android native项目编译v7a时-Werror参数导致报错

    在GitHub上下载了一个demo,自己编译运行时,v8a的so是可以正常编译运行的,但是就是v7a的不能也一直报错,最后发现在Android.mk文件里去掉-Werror字段就可以了.于是上网了解了 ...

  7. Garnet发布 Redis不再是唯一选择

    Garnet 是 Microsoft Research 的远程缓存存储,提供强大的性能(吞吐量和延迟).可扩展性.存储.恢复.集群分片.密钥迁移和复制功能. Garnet 可以与现有的 Redis 客 ...

  8. 这里有你不得不了解的Java 11版本特性说明

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  9. Loto实践干货(3) 测量CAN总线通讯数据

    Loto实践干货(3) 测量CAN总线通讯数据 最近在做运动控制卡的项目,调试样机的过程中,需要验证CAN总线通讯功能的正确性.以前只限于理论上认识CAN总线,使用的CANbus的通讯卡也是有上位机例 ...

  10. vue核心基础-过渡动画

    第一种方法:引入类名 .v-enter{ opacity: 0; } .v-enter-to{ opacity: 1; } .v-leave{ opacity: 1; } .v-leave-to{ o ...