zoukankan      html  css  js  c++  java
  • word2vec训练好的词向量

    虽然早就对NLP有一丢丢接触,但是最近真正对中文文本进行处理才深深感觉到自然语言处理的难度,主要是机器与人还是有很大差异的,毕竟人和人之间都是有差异的,要不然不会讲最难研究的人嘞

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~不华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    我了解的对词义理解毕竟优秀的当属word2vec了,在训练结束后能得到跟我们人类理解的相似词义很类似的结果,就像‘’男生‘’‘’女生‘’这些词的含义类似一样,网上已经有很多如何训练word2vec向量的方法及代码了,为了看起来完整,我把我自己的也贴上来吧(我的原数据存储在数据库中):

    1.训练过程:

    #训练词语为向量表示
    def w2v_train(self):
    #######数据获取####################################################
    ques = self.cu.execute('select question from activity')#从数据库提取文本
    da_all = []
    for d in ques:
    da_all.append(d[0])
    sentences = self.get_text(da_all)#分词结果列表
    #######训练的主要步骤######################################################
    model = Word2Vec()
    model.build_vocab(sentences)
    model.train(sentences,total_examples = model.corpus_count,epochs = model.iter)
    model.save("./tmp/user_w2corpus")#保存模型,之后使用该模型:model=gensim.models.Word2Vec.load('./tmp/user_w2corpus')
       model.wv.save_word2vec_format("./tmp/user_w2corpus_word_old.txt")#将训练好的词向量保存为TXT文档,之后使用该模型:
                                                                       #model = gensim.models.KeyedVectors.load_word2vec_format('./tmp/user_w2corpus_word_old.txt')
    #注意两种读取词向量模型的方法是不同的。TXT文档的词向量可以不需要通过model['string']得到词向量,还可以通过循环一次将每个单词(或字符)的向量读出来
    def get_text(self,text):#传入的text是一个句子存储在列表中的形式
    import jieba
    # 调用分词方法时执行这三行
    f = open("./stopword.txt", 'r+', encoding="UTF-8")
    stop_list = f.read()
    txt = []
    # 对空格,换行符、停用词进行处理
    for i in text:
    result = []
    # 对文档进行分词处理,采用默认模式
    seg_list = jieba.cut(i)
    for seg in seg_list:
    seg = ''.join(seg.split())
    if (seg != '' and seg != " " and seg != " "):
    if seg not in stop_list:
    result.append(seg)
    txt.append(result)
    return txt
    2.调用训练好的结果分析问题
    import gensim
    word_vectors=gensim.models.KeyedVectors.load_word2vec_format('./tmp/user_w2corpus',binary=False)
    sim=word_vectors.most_similar(u'蛋白质',topn=10)
    print (' 蛋白质-top10:')
    for item in sim:
    print (item[0],item[1])

    注意!!!!!!写本文的初衷是感谢博客上的一位好人给出了自己训练好的word2vec向量,我们可以不需要亲自训练,拿来直接用,因为自己训练的很有可能会由于数据量不足而导致效果不太好
    资源链接:http://pan.baidu.com/s/1dFeNNK9
    另外,该博客的链接也在此为大家贴出来, http://www.cnblogs.com/robert-dlut/p/6586621.html

    最后的最后,我想声明我是最近才想着把自己遇到的问题都记录下来,所以如果侵权麻烦联系我删除,如果觉得有点用的话麻烦点个赞之类的,嘿嘿,在此谢过~~
     
     
  • 相关阅读:
    es6 Set 和Map 数据结构
    es6 Symbol
    es6 对象的扩展
    es6 class
    es6 数组扩展方法
    Docker入门01——Image
    GORM 中文文档
    将以前的文章开始慢慢转到这里发表
    环境变量
    在 Linux 中安装 VMware Tools
  • 原文地址:https://www.cnblogs.com/kjkj/p/9811978.html
Copyright © 2011-2022 走看看