博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
腾讯词向量资料集 Tencent_AILab_ChineseEmbedding.txt 快速载入方法
阅读量:4227 次
发布时间:2019-05-26

本文共 4881 字,大约阅读时间需要 16 分钟。

操作系统:Windows7

程序语言:Python3

系统内存:16G(自己加了个8G内存条)

腾讯的AI Lab开源大规模高质量中文词向量数据,拥有800多万中文词向量数据,解压之后的词向量.txt文件在Windows下显示为15.6G左右。虽然词向量集覆盖率和准确性都比较高,但是对于只拥有普通配置的机器设备,如何快速载入词向量文件到内存却是一个很棘手的问题。即使像我自己电脑内存已经加到16G了,但是要加载这个接近16G的txt文件仍然很费劲(毕竟你其他进程还会占用CPU和内存),时间花费也比较长(我之前试过单独用txt加载的话,至少需要半个小时左右),如果需要频繁进行加载的话,直接用txt加载这种方法就更加让人难以接受了。

普通加载方法:

import gensimwv_from_text = gensim.models.KeyedVectors.load_word2vec_format('E:\ChineseEmbedding.txt', binary=False)

二进制文件加载方法:

第一次先花费比较长的时间使用普通加载方法,将词向量的txt文件加载到内存,并将加载的词向量save成二进制的.bin文件。之后如果需要加载词向量的时候,就直接从.bin文件加载词向量,这样加载速度会快一些:

初次加载:

import gensim# txt的词向量集总共有八百多万数据,你可以添加limit参数对要加载的数据量进行限制,比如我这儿限制加载的数据量为四百万wv_from_text = gensim.models.KeyedVectors.load_word2vec_format('E:\ChineseEmbedding.txt', limit=4000000,                                                                   binary=False)# 使用init_sims会比较省内存wv_from_text.init_sims(replace=True)# 重新保存加载变量为二进制形式wv_from_text.save(r"E:\ModelFolder\400million\ChineseEmbedding.bin")

当然,虽然看似只保存成了.bin文件,但实际上还伴随着一个ChineseEmbedding.bin.vectors.npy文件也一并产生在了与bin文件同目录位置,只不过程序中没有代码显式对这个文件进行处理。

再次加载:

import gensimwv_from_text = gensim.models.KeyedVectors.load(r'E:\ModelFolder\400million\ChineseEmbedding.bin', mmap='r')

再次加载时,速度就会快很多了。当然,如果你内存还是不够,请将初次加载时对应的limit参数改小一些,改小以后的缺点也显而易见:那就是你输入的词语有可能在词向量集里面找不到,通过n-grams得到的词向量与词真实的词向量还有差距。

完整示例代码:

import gensimimport numpy as npimport timeimport datetimefound = 0def compute_ngrams(word, min_n, max_n):    extended_word = word    ngrams = []    for ngram_length in range(min_n, min(len(extended_word), max_n) + 1):        for i in range(0, len(extended_word) - ngram_length + 1):            ngrams.append(extended_word[i:i + ngram_length])    return list(set(ngrams))def word_vector(word, wv_from_text, min_n=1, max_n=3):    # 确认词向量维度    word_size = wv_from_text.wv.syn0[0].shape[0]    # 计算word的ngrams词组    ngrams = compute_ngrams(word, min_n=min_n, max_n=max_n)    # 如果在词典之中,直接返回词向量    if word in wv_from_text.index2word:        global found        found += 1        return wv_from_text[word]    else:        # 不在词典的情况下,计算与词相近的词向量        word_vec = np.zeros(word_size, dtype=np.float32)        ngrams_found = 0        ngrams_single = [ng for ng in ngrams if len(ng) == 1]         ngrams_more = [ng for ng in ngrams if len(ng) > 1]          # 先只接受2个单词长度以上的词向量        for ngram in ngrams_more:            if ngram in wv_from_text.index2word:                word_vec += wv_from_text[ngram]                ngrams_found += 1                # print(ngram)        # 如果,没有匹配到,那么最后是考虑单个词向量        if ngrams_found == 0:            for ngram in ngrams_single:                if ngram in wv_from_text.index2word:                    word_vec += wv_from_text[ngram]                    ngrams_found += 1        if word_vec.any():  # 只要有一个不为0            return word_vec / max(1, ngrams_found)        else:            print('all ngrams for word %s absent from model' % word)            return 0if __name__ == '__main__':    print("开始载入文件...")    print("Now:", datetime.datetime.now())    t1 = time.time()    # wv_from_text = gensim.models.KeyedVectors.load_word2vec_format('E:\ChineseEmbedding.txt', limit=4000000,    #                                                                binary=False)    # wv_from_text.init_sims(replace=True)    # wv_from_text.save(r"E:\ModelFolder\400million\ChineseEmbedding.bin")    wv_from_text = gensim.models.KeyedVectors.load(r'E:\ModelFolder\400million\ChineseEmbedding.bin', mmap='r')    print("文件载入完毕")    # print(wv_from_text.index2word)    print("文件载入耗费时间:", (time.time() - t1) / 60, "minutes")    # result_list = open_file("keyword.txt")    print("获取关键词列表")    input_text = "苹果,原装,手机"    result_list = input_text.split(",")    words_length = len(result_list)    print(result_list)    for keyword in result_list:        vec = word_vector(keyword, wv_from_text, min_n=1, max_n=3)  # 词向量获取        if vec is 0:            continue        # print("获取的词向量:", vec)        similar_word = wv_from_text.most_similar(positive=[vec], topn=15)  # 相似词查找        result_word = [x[0] for x in similar_word]        print(result_word)    print("词库覆盖比例:", found, "/", words_length)    print("词库覆盖百分比:", 100 * found / words_length, "%")    print("整个推荐过程耗费时间:", (time.time() - t1) / 60, "minutes")

示例运行结果:

"D:\Program Files\Python36\python3.exe" D:/MyProject/Python/Voice_SDK/keyword_suggest.py开始载入文件...Now: 2019-09-16 09:46:18.202184文件载入完毕文件载入耗费时间: 0.23160649140675862 minutes获取关键词列表['苹果', '原装', '手机']['苹果', '苹果公司', '以及苹果', '比如苹果', '苹果新', '其他苹果', 'iphone', '苹果iphone', '苹果的iphone', 'apple', '苹果产品', '像苹果', '小米', '关于苹果', 'iphone产品']['原装', '原厂', '原装正品', '原装配件', '原装产品', '进口原装', '原装进口', '正品', '原装货', '原厂出品', '原厂货', '正品原装', '原厂原装', '原配件', '日本原装']['手机', '手机手机', '智能手机', '手机中', '新手机', '两部手机', '手机……', '好手机', '部手机', '你的手机', '手机屏幕', '把手机', '小手机', '一个手机', '平板电脑']词库覆盖比例: 3 / 3词库覆盖百分比: 100.0 %整个推荐过程耗费时间: 0.3815381487210592 minutesProcess finished with exit code 0

转载地址:http://rbjqi.baihongyu.com/

你可能感兴趣的文章
程序员失业第一步?斯坦福研究员用AI从编译器反馈中学习改Bug
查看>>
原创 | 电视广告流量预测中的“常识”陷阱,你掉进去了吗?
查看>>
DeepMind发布最新《神经网络中持续学习》综述论文!
查看>>
本科三篇顶会一作、超算竞赛冠军,2020清华本科特奖结果出炉
查看>>
多语言互通:谷歌发布实体检索模型,涵盖超过100种语言和2000万个实体
查看>>
你的房东可能正用AI筛查你的犯罪记录,决定要不要租房给你
查看>>
AI把爱豆变胖视频火遍B站,我们找到了背后的技术团队:你是怎么把刘亦菲变胖的?...
查看>>
白硕:区块链技术与数据隐私(附视频)
查看>>
数据蒋堂 | 报表工具的SQL植入风险
查看>>
AAC ADTS LATM 格式分析
查看>>
【转载】嵌入式系统 Boot Loader 技术内幕
查看>>
【转载】uboot学习笔记
查看>>
分布式消息中间件(rabbitMQ篇)
查看>>
JAVA程序员养成计划之JVM学习笔记(2)-垃圾收集管理
查看>>
JAVA程序员养成计划之JVM学习笔记(3)-JVM性能监控
查看>>
POJ 3580
查看>>
POJ 2482
查看>>
POJ 3363
查看>>
[LeetCode] 849. Maximize Distance to Closest Person @ python
查看>>
axi总线介绍
查看>>