1. gensim概述

Gensim(http://pypi.python.org/pypi/gensim)是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。 主要用于主题建模和文档相似性处理,它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法。Gensim在诸如获取单词的词向量等任务中非常有用。
使用Gensim训练Word2vec十分方便,训练步骤如下:

1)将语料库预处理:一行一个文档或句子,将文档或句子分词(以空格分割,英文可以不用分词,英文单词之间已经由空格分割,中文预料需要使用分词工具进行分词,常见的分词工具有StandNLP、ICTCLAS、Ansj、FudanNLP、HanLP、结巴分词等);

2)将原始的训练语料转化成一个sentence的迭代器,每一次迭代返回的sentence是一个word(utf8格式)的列表。可以使用Gensim中word2vec.py中的LineSentence()方法实现;

3)将上面处理的结果输入Gensim内建的word2vec对象进行训练即可:

from gensim.models import Word2Vec
sentences = word2vec.LineSentence('./in_the_name_of_people_segment.txt')
# in_the_name_of_people_segment.txt 分词之后的文档
model = Word2Vec(sentences , size=100, window=5, min_count=1, workers=4)

2. gensim word2vec API概述:

在gensim中,word2vec 相关的API都在包gensim.models.word2vec中。和算法有关的参数都在类gensim.models.word2vec. Word2Vec中。算法需要注意的参数有:

class Word2Vec(utils.SaveLoad):    def __init__(self, sentences=None, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001,sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0,trim_rule=None, sorted_vocab=1, batch_words=MAX_WORDS_IN_BATCH):

sentences:可以是一个list,对于大语料集,建议使用BrownCorpus,Text8Corpus或lineSentence构建。
size:是指词向量的维度,默认为100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百。
window:窗口大小,即词向量上下文最大距离,这个参数在我们的算法原理篇中标记为c。window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5,10]之间。个人理解应该是某一个中心词可能与前后多个词相关,也有的词在一句话中可能只与少量词相关(如短文本可能只与其紧邻词相关)。
min_count: 需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。可以对字典做截断, 词频少于min_count次数的单词会被丢弃掉。
negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在我们的算法原理篇中标记为neg。
cbow_mean: 仅用于CBOW在做投影的时候,为0,则算法中的为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示,默认值也是1,不推荐修改默认值。
iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。
alpha: 是初始的学习速率,在训练过程中会线性地递减到min_alpha。在随机梯度下降法中迭代的初始步长。算法原理篇中标记为η,默认是0.025。
min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。这部分由于不是word2vec算法的核心内容,因此在原理篇我们没有提到。对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。
max_vocab_size: 设置词向量构建期间的RAM限制,设置成None则没有限制。
sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)。
seed:用于随机数发生器。与初始化词向量有关。
workers:用于控制训练的并行数。

3.例子

选择的《人民的名义》的小说原文作为语料。

完整代码参见:github: https://github.com/ljpzzz/machinelearning/blob/master/natural-language-processing/word2vec.ipynb

拿到了原文,我们首先要进行分词,这里使用结巴分词完成。在中文文本挖掘预处理流程总结中,我们已经对分词的原理和实践做了总结。因此,这里直接给出分词的代码,分词的结果,我们放到另一个文件中。代码如下, 加入下面的一串人名是为了结巴分词能更准确的把人名分出来。

# -*- coding: utf-8 -*-
import jieba
import jieba.analyse
jieba.suggest_freq('沙瑞金', True)
jieba.suggest_freq('田国富', True)
jieba.suggest_freq('高育良', True)
jieba.suggest_freq('侯亮平', True)
jieba.suggest_freq('钟小艾', True)
jieba.suggest_freq('陈岩石', True)
jieba.suggest_freq('欧阳菁', True)
jieba.suggest_freq('易学习', True)
jieba.suggest_freq('王大路', True)
jieba.suggest_freq('蔡成功', True)
jieba.suggest_freq('孙连城', True)
jieba.suggest_freq('季昌明', True)
jieba.suggest_freq('丁义珍', True)
jieba.suggest_freq('郑西坡', True)
jieba.suggest_freq('赵东来', True)
jieba.suggest_freq('高小琴', True)
jieba.suggest_freq('赵瑞龙', True)
jieba.suggest_freq('林华华', True)
jieba.suggest_freq('陆亦可', True)
jieba.suggest_freq('刘新建', True)
jieba.suggest_freq('刘庆祝', True)
with open('./in_the_name_of_people.txt') as f:    document = f.read()        #document_decode = document.decode('GBK')        document_cut = jieba.cut(document)    #print  ' '.join(jieba_cut)  //如果打印结果,则分词效果消失,后面的result无法显示    result = ' '.join(document_cut)    result = result.encode('utf-8')    with open('./in_the_name_of_people_segment.txt', 'w') as f2:    f2.write(result)
f.close()
f2.close()

拿到了分词后的文件,在一般的NLP处理中,会需要去停用词。由于word2vec的算法依赖于上下文,而上下文有可能就是停词。因此对于word2vec,我们可以不用去停词。

现在我们可以直接读分词后的文件到内存。这里使用了word2vec提供的LineSentence类来读文件,然后套用word2vec的模型。这里只是一个示例,因此省去了调参的步骤,实际使用的时候,你可能需要对我们上面提到一些参数进行调参。

# import modules & set up logging
import logging
import os
from gensim.models import word2vec
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.LineSentence('./in_the_name_of_people_segment.txt')
model = word2vec.Word2Vec(sentences, hs=1,min_count=1,window=3,size=100) 

模型出来了,我们可以用来做什么呢?这里给出三个常用的应用。

1. 第一个是最常用的:找出某一个词向量最相近的词集合

代码如下:

req_count = 5
for key in model.wv.similar_by_word('沙瑞金'.decode('utf-8'), topn =100):    if len(key[0])==3:        req_count -= 1        print (key[0], key[1])if req_count == 0:           break;

我们看看沙书记最相近的一些3个字的词(主要是人名)如下:

高育良 0.967257142067
李达康 0.959131598473
田国富 0.953414440155
易学习 0.943500876427
祁同伟 0.942932963371

2. 第二个应用:看两个词向量的相近程度

这里给出了书中两组人的相似程度:

print model.wv.similarity('沙瑞金'.decode('utf-8'), '高育良'.decode('utf-8'))
print model.wv.similarity('李达康'.decode('utf-8'), '王大路'.decode('utf-8'))0.961137455325
0.935589365706

3. 第三个应用:找出不同类的词

这里给出了人物分类题:

print model.wv.doesnt_match(u"沙瑞金 高育良 李达康 刘庆祝".split())
word2vec也完成的很好,输出为"刘庆祝"。
以上就是用gensim学习word2vec实战的所有内容。

自然语言处理库—Gensim之Word2vec相关推荐

  1. CS224N 2019 自然语言处理(一)自然语言处理库gensim之Word2vec

    笔记摘抄 1. WordNet显示同义词 from nltk.corpus import wordnet as wn# 同义词 poses = {'n': 'noun', 'v': 'verb', ' ...

  2. 自然语言处理库——Gensim之Word2vec

    Gensim(http://pypi.python.org/pypi/gensim)是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达. 主要用于 ...

  3. 【自然语言处理】gensim的word2vec

    import jieba import gensimtext_path = "E://python/baiyexing.txt" stopwords_path = "E: ...

  4. wiki中文数据语料抽取-gensim构建word2vec模型

    阅读目录: 1. WikiCorpus提取xml数据集语料 2. opencc繁转简 3. jieba中文分词 4. word2vec词向量转化 5. 模型测试(相似度) wiki数据集获取途径:点此 ...

  5. NLP自然语言处理库系列教程——gensim库

    Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达.它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法, ...

  6. 【自然语言处理】【Word2Vec(三)】使用gensim学习word2vec

    相关推荐: [自然语言处理][Word2Vec(一)]Word2Vec之前的词表示和文本表示:one-hot_bag of words_TF-IDF_n-gram_Cocurrence matrix和 ...

  7. 【自然语言处理】Gensim中的Word2Vec

    Gensim中的Word2Vec BOW 和 TF-IDF 都只着重于词汇出现在文件中的次数,未考虑语言.文字有上下文的关联,针对上下文的关联,Google 研发团队提出了词向量 Word2vec,将 ...

  8. python根据词向量计算相似度_如何使用gensim的word2vec模型和python计算句子相似度...

    如何使用gensim的word2vec模型和python计算句子相似度 根据Gensim Word2Vec,我可以使用gensim包中的word2vec模型来计算2个单词之间的相似度. 例如 trai ...

  9. NLP判断语言情绪_Python的8大牛叉的自然语言处理库概览

    Python系技术生态中有很多的NLP资源,该如何选择呢?本文将介绍用于分析文本的最佳Python库以及如何使用它们. 0.导引 自然语言处理,或简称为NLP,最好描述为"用于处理语音和文本 ...

最新文章

  1. 使用Nessus漏扫
  2. AfxBeginThread
  3. Seq2Seq中Exposure Bias现象的浅析与对策
  4. 通过Java代码装配bean
  5. js(Dom+Bom)第四天(1)
  6. ES6 对正则表达式的扩展
  7. 多线程之间共享数据的实现
  8. 从流水中倒推算出销量为多某值的日期
  9. 机器学习-吴恩达-笔记-15-总结
  10. 如何去掉 WinCE 4.2 的桌面墙纸
  11. 内存管理-内存slub分配器(二)
  12. 字幕制作 分享剪辑视频添加滚动字幕的操作步骤
  13. git commit 提交信息写错,怎么更改?
  14. C#判断是否是节假日
  15. 移动广告平台Android SDK接入指南
  16. 台电平板teclast X16HD碎屏拆机更换日志
  17. git最佳实践之feature和hotfix分支
  18. 关于STM32F4xx的GPIO
  19. 下载eclipse linux32位软件安装包怎么那么难
  20. 【纪录】Proxychain4 使用部署以及利用 ss 加速下载操作

热门文章

  1. 【python3数据结构】Dijkstra’s算法(搜索最短路径问题)
  2. 文件上传之图片上传题目
  3. 《封号码罗》python爬虫之抖音分享页破解字体反爬虫进阶实战(六)
  4. android shape 画阴影_Android使用shape绘制阴影图层阴影效果示例
  5. ESP32学习笔记(30)——BLE GATT服务端自定义服务和特征
  6. 2020 11-12 用SPSS做中国地图
  7. 机器学习算法---K近邻算法
  8. python获取服务器文件svn版本信息_python 访问svn服务器文件路径
  9. 我的妈妈是我们家的家庭主妇
  10. asp毕业设计——基于asp+sqlserver的住户管理系统设计与实现(毕业论文+程序源码)——住户管理系统