文档章节

Gensim 中 word2vec 函数的使用

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:24
字数 1819
阅读 110
收藏 0
点赞 0
评论 0

Gensim 是我比较常用的一个 NLP 工具包,特别是其中的 word2vec 模块,它的具体 API 如下:

class gensim.models.word2vec.Word2Vec(
            sentences=None, 
            size=100, 
            alpha=0.025, 
            window=5, 
            min_count=5, 
            max_vocab_size=None, 
            sample=0.001, 
            seed=1, 
            workers=3, 
            min_alpha=0.0001, 
            sg=0, 
            hs=0, 
            negative=5, 
            cbow_mean=1, 
            hashfxn=<built-in function hash>, 
            iter=5, 
            null_word=0, 
            trim_rule=None, 
            sorted_vocab=1, 
            batch_words=10000, 
            compute_loss=False)

模型创建

Gensim 中 word2vec 模型的输入是经过分词的句子列表,即是某个二位数组。但由于中文没有像英文那么自带天然的分词,所有这里我们简单采用 jieba 来进行分词处理。

# 引入 word2vec
from gensim.models import word2vec

# 引入日志配置
import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

# 引入分词工具
import jieba

# 引入数据集
raw_sentences = ["但由于中文没有像英文那么自带天然的分词","所以我们第一步采用分词"]

# 切分词汇
sentences = []
for s in raw_sentences:
    tmp = []
    for item in jieba.cut(s):
        tmp.append(item)
    sentences.append(tmp)
# print(sentences)
# 构建模型
model = word2vec.Word2Vec(sentences, min_count=1)

# 进行词向量输出
model['中文']

但这种方法在数据集比较大的情况下会占用大量的 RAM,Gensim 本身只是要求能够迭代的有序句子列表,因此在工程实践中我们可以使用一些自定义的生成器,只在内存中保存单条语句,并且在导入内存之前进行分词操作。

Word2Vec 参数

from gensim.models.word2vec import LineSentence
from gensim.models.word2vec import Text8Corpus

sentences = LineSentence('a.txt')
sentences = Text8Corpus('a.txt')
  • size: 词向量的维度。
  • alpha: 模型初始的学习率。
  • window: 表示在一个句子中,当前词于预测词在一个句子中的最大距离。
  • min_count: 用于过滤操作,词频少于 min_count 次数的单词会被丢弃掉,默认值为 5。
  • max_vocab_size: 设置词向量构建期间的 RAM 限制。如果所有的独立单词数超过这个限定词,那么就删除掉其中词频最低的那个。根据统计,每一千万个单词大概需要 1GB 的RAM。如果我们把该值设置为 None ,则没有限制。
  • sample: 高频词汇的随机降采样的配置阈值,默认为 1e-3,范围是 (0, 1e-5)。
  • seed: 用于随机数发生器。与词向量的初始化有关。
  • workers: 控制训练的并行数量。
  • min_alpha: 随着训练进行,alpha 线性下降到 min_alpha。
  • sg: 用于设置训练算法。当 sg=0,使用 CBOW 算法来进行训练;当 sg=1,使用 skip-gram 算法来进行训练。
  • hs: 如果设置为 1 ,那么系统会采用 hierarchica softmax 技巧。如果设置为 0(默认情况),则系统会采用 negative samping 技巧。
  • negative: 如果这个值大于 0,那么 negative samping 会被使用。该值表示 “noise words” 的数量,一般这个值是 5 - 20,默认是 5。如果这个值设置为 0,那么 negative samping 没有使用。
  • cbow_mean: 如果这个值设置为 0,那么就采用上下文词向量的总和。如果这个值设置为 1 (默认情况下),那么我们就采用均值。但这个值只有在使用 CBOW 的时候才起作用。
  • hashfxn: hash函数用来初始化权重,默认情况下使用 Python 自带的 hash 函数。
  • iter: 算法迭代次数,默认为 5。
  • trim_rule: 用于设置词汇表的整理规则,用来指定哪些词需要被剔除,哪些词需要保留。默认情况下,如果 word count < min_count,那么该词被剔除。这个参数也可以被设置为 None,这种情况下 min_count 会被使用。
  • sorted_vocab: 如果这个值设置为 1(默认情况下),则在分配 word index 的时候会先对单词基于频率降序排序。
  • batch_words: 每次批处理给线程传递的单词的数量,默认是 10000。

内存

word2vec 参数模型保存在 NumPy 矩阵中。矩阵中的每一行是单词的向量,这个向量用浮点数(单精度,也称为 4 字节)表示。

假设三个这样的矩阵同时保存在 RAM 中(如果是矩阵正在工作中,那么该数量应该减少到两个,甚至一个)。因为,如果你输入的单词量是 100000 个,词向量你要求长度为 200 ,那么模型所占的内存为 100000 * 200 * 4 * 3 =~ 229 MB。

大型语料库

在真实的训练环境中,我们面对的都是比较大型的语料库,在这里我们以 word2vec 官方的 text8 为例子,具体如下:

sentences = word2vec.Text8Corpus('text8')
model = word2vec.Word2Vec(sentences, size=10)

我们在前面也提到了,如果是对大量的输入语聊集或者需要整合磁盘上多个文件夹中的数据,那么我们可以使用迭代器的方式来读取数据,而不是一次性的将全部内容读取到内存中,从而来节省 RAM 空间,具体如下:

class MySentences(object):
    def __init__(self, dirname):
        self.dirname = dirname

    def __iter__(self):
        for fname in os.listdir(self.dirname):
            for line in open(os.path.join(self.dirname, fname)):
                yield line.split()

sentences = MySentences('/some/directory') # a memory-friendly iterator
model = gensim.models.Word2Vec(sentences)

模型的保存与读取

model.save('text8.model')

2017-08-09 14:48:50,382 : INFO : saving Word2Vec object under text8.model, separately None
2017-08-09 14:48:50,384 : INFO : not storing attribute syn0norm
2017-08-09 14:48:50,386 : INFO : not storing attribute cum_table
2017-08-09 14:48:50,765 : INFO : saved text8.model

model1=word2vec.Word2Vec.load('text8.model')

2017-08-09 14:49:14,599 : INFO : loading Word2Vec object from text8.model
2017-08-09 14:49:14,977 : INFO : loading wv recursively from text8.model.wv.* with mmap=None
2017-08-09 14:49:14,978 : INFO : setting ignored attribute syn0norm to None
2017-08-09 14:49:14,980 : INFO : setting ignored attribute cum_table to None
2017-08-09 14:49:14,981 : INFO : loaded text8.model

model1.wv.save_word2vec_format('text.model.bin', binary=True)

2017-08-09 14:51:27,198 : INFO : storing 71290x10 projection weights into text.model.bin

model2=gensim.models.KeyedVectors.load_word2vec_format('text.model.bin', binary=True)

2017-08-09 14:52:09,296 : INFO : loading projection weights from text.model.bin
2017-08-09 14:52:10,273 : INFO : loaded (71290, 10) matrix from text.model.bin

模型预测

Word2Vec 模块还可以进行一些语义相似度推算,比如:

model.most_similar(positive=['woman', 'king'], negative=['man'], topn=5)

[('queen', 0.6658061742782593),
 ('elizabeth', 0.6245918273925781),
 ('emperor', 0.5999430418014526),
 ('isabella', 0.5808215737342834),
 ('prince', 0.5779752731323242)]

model.wv.doesnt_match("breakfast cereal dinner lunch".split())

'cereal'

model.wv.similarity('woman', 'man')

0.7129250672362295

model.most_similar(['man'])

[('woman', 0.7129250168800354),
 ('girl', 0.6310214996337891),
 ('creature', 0.6019233465194702),
 ('god', 0.5626420974731445),
 ('boy', 0.5613292455673218),
 ('person', 0.5532713532447815),
 ('beast', 0.5510985851287842),
 ('evil', 0.5497387647628784),
 ('stranger', 0.5446441173553467),
 ('soul', 0.5437164306640625)]

如果我们希望直接获取某个单词的词向量,我们可以直接以下标的方式进行访问:

model['computer']
array([-0.12038743, -0.30791789, ..., 0.83891463, -2.07493448], dtype=float32)

模型评估

Word2Vec 的训练属于无监督模型。Google 之前公开了一个 20000 条左右的语法与语义化训练样本,每一条都遵循 A is to B as C is to D 这个格式,下载地址在这里

model.accuracy('questions-words.txt')
2017-08-09 15:34:12,000 : INFO : capital-common-countries: 28.5% (144/506)
2017-08-09 15:34:17,410 : INFO : capital-world: 15.8% (229/1452)
2017-08-09 15:34:18,435 : INFO : currency: 9.3% (25/268)
2017-08-09 15:34:24,265 : INFO : city-in-state: 9.7% (152/1571)
2017-08-09 15:34:25,410 : INFO : family: 73.2% (224/306)
2017-08-09 15:34:28,215 : INFO : gram1-adjective-to-adverb: 10.7% (81/756)
2017-08-09 15:34:29,363 : INFO : gram2-opposite: 17.6% (54/306)
2017-08-09 15:34:34,015 : INFO : gram3-comparative: 54.4% (686/1260)
2017-08-09 15:34:35,898 : INFO : gram4-superlative: 34.2% (173/506)
2017-08-09 15:34:39,558 : INFO : gram5-present-participle: 28.3% (281/992)
2017-08-09 15:34:44,608 : INFO : gram6-nationality-adjective: 49.2% (675/1371)
2017-08-09 15:34:49,570 : INFO : gram7-past-tense: 25.0% (333/1332)
2017-08-09 15:34:53,265 : INFO : gram8-plural: 41.8% (415/992)
2017-08-09 15:34:55,699 : INFO : gram9-plural-verbs: 30.2% (196/650)
2017-08-09 15:34:55,700 : INFO : total: 29.9% (3668/12268)

来源:

  1. CSDN
  2. gensim
  3. Word2vec Tutorial
  4. segmentfault

本文转载自:http://www.jianshu.com/p/c0f7a6d599ad

共有 人打赏支持
AllenOR灵感
粉丝 10
博文 2139
码字总数 82983
作品 0
程序员
NLP自然语言处理库系列教程——gensim库

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

luanpeng825485697 ⋅ 05/25 ⋅ 0

用綫性規劃去計算句子之間的相似度

Word2Vec或FastText之类的字嵌入模型已经被自然语言处理的人员广泛使用,原因无他,因为这些模型把所需要的维度降低了许多(用bag-of-words模型要和词典数相等的维度,但这类模型的维度只是在...

何史提 ⋅ 2017/12/22 ⋅ 0

用线性规划去计算句子之间的相似度

本文原载于知乎「Data Science with R&Python」专栏,AI 研习社获其作者何史提授权转载。 Word2Vec 或 FastText 之类的字嵌入模型已经被自然语言处理的人员广泛使用,原因无他,因为这些模型...

y0w1as5eg37urfds ⋅ 2017/12/28 ⋅ 0

Gensim实现Word2Vec的Skip-Gram模型

简介 Genism是一个开源的Python库,用于便捷高效地提取文档中的语义话题。它用于处理原始的、非结构化的电子文本(“纯文本”),gensim中的一些算法,如 Latent Semantic Analysis(潜在语义...

致Great ⋅ 2017/09/21 ⋅ 0

用 Doc2Vec 得到文档/段落/句子的向量表达

本文结构: Doc2Vec 有什么用 两种实现方法 用 Gensim 训练 Doc2Vec Doc2Vec 或者叫做 paragraph2vec, sentence embeddings,是一种非监督式算法,可以获得 sentences/paragraphs/documents...

aliceyangxi1987 ⋅ 2017/07/14 ⋅ 0

我的python成长之路

就拿在anaconda下安装gensim包来举个例子: anaconda下载页面:https://www.continuum.io/downloads Python的有些模块在单独安装时可能非常麻烦,Anaconda中则已经集成好了许多常见的模块,用...

u012654154 ⋅ 2017/06/06 ⋅ 0

Word2vec原理浅析及tensorflow实现

Word2vec简介 Word2Vec是由Google的Mikolov等人提出的一个词向量计算模型。 输入:大量已分词的文本 输出:用一个稠密向量来表示每个词 词向量的重要意义在于将自然语言转换成了计算机能够理...

lyy0905 ⋅ 2017/06/27 ⋅ 0

RNN起名器(一)——思路和数据获取

1. 起因 学习完一些RNN的基础知识,看过一些学术论文以后,像通过一个小项目来练练手。一来加强对模型本身的理解;二来可以提高编码能力和对框架的熟悉程度。 受到char-rnn的启发,同时考虑到...

Cer_ml ⋅ 2017/02/01 ⋅ 0

【数据平台】python语言NLP库Gensim初识

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

fjssharpsword ⋅ 2017/11/01 ⋅ 0

python 深度学习

Capturing semantic meanings using deep learning Word embedding in natural language processing. By Lior Shkiller October 13, 2016 Semantics. Word embedding is a technique that tr......

MtrS ⋅ 2016/11/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

聊聊spring cloud gateway的LoadBalancerClientFilter

序 本文主要研究一下spring cloud gateway的LoadBalancerClientFilter GatewayLoadBalancerClientAutoConfiguration spring-cloud-gateway-core-2.0.0.RELEASE-sources.jar!/org/springfram......

go4it ⋅ 36分钟前 ⋅ 0

详解:Nginx反代实现Kibana登录认证功能

Kibana 5.5 版后,已不支持认证功能,也就是说,直接打开页面就能管理,想想都不安全,不过官方提供了 X-Pack 认证,但有时间限制。毕竟X-Pack是商业版。 下面我将操作如何使用Nginx反向代理...

问题终结者 ⋅ 43分钟前 ⋅ 0

002、nginx配置虚拟主机

一、nginx配置虚拟主机可分为三种方式,分别为: 1、基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站 2、基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站...

北岩 ⋅ 46分钟前 ⋅ 0

shell脚本之死循环写法

最近在学习写shell脚本,在练习if while等流程控制时,突然它们的死循环写法是怎么样的?经过百度与亲测记录如下: for死循环 #! /bin/bashfor ((;;));do date sleep 1d...

hensemlee ⋅ 48分钟前 ⋅ 0

苹果的ARKit2.0有多可怕,看了就知道

序言 ARKit主要由三部分组成: 跟踪(Tracking) 跟踪是ARKit的核心组件之一,其提供了设备在物理世界中的位置与方向信息,并对物体进行跟踪,如人脸。 2.场景理解(Scene Understanding) 场...

_小迷糊 ⋅ 49分钟前 ⋅ 0

5.1 vim介绍 5.2 vim移动光标 5.3 ,5.4vim一般模式下移动光标,复制粘贴

vim命令 vim是vi的一个升级版;vim可以显示文字的颜色 安装vim这一个包vim-enhanced 如果不知道安装包,可以使用 命令下面命令来查看vim命令是那个包安装的。 [root@linux-128 ~]# yum prov...

Linux_老吴 ⋅ 52分钟前 ⋅ 0

vim一般模式

vim 是什么 vim是什么 ? 在之前接触Linux,编辑网卡配置文件的时候我们用过了vi ,vim简单说就是vi的升级版,它跟vi一样是Linux系统中的一个文本编辑工具。 如果系统中没有vim ,需要安装一...

李超小牛子 ⋅ 今天 ⋅ 0

docker实战

构建企业级Docker虚拟化平台实战 重点剖析虚拟化和云计算概念; 分析Docker虚拟化的概念和原理; 从0开始实战Docker虚拟化平台; 基于Docker构建Nginx WEB服务器和CentOS虚拟机; 基于开源监...

寰宇01 ⋅ 今天 ⋅ 0

vim介绍、vim颜色显示和移动光标、vim一般模式下移动光标、一般模式下复制粘贴剪切

VIM Vim 是 UNIX 文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff),语法高亮,全面的帮助系统,本地脚本(Vimscript),和便于选择的...

蛋黄Yolks ⋅ 今天 ⋅ 0

springboot+mockito测试controller层遇到的问题

使用MockitoJUnitRunner测试的一个例子,原来报错无法找到bean, 类似的异常如下:createBeanError..... 原因:是因为@Runwith使用了SpringRunner,应该修改为MockitoJUnitRunner 代码如下: ...

writeademo ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部