文本分析——gensim库word2vec学习笔记


写在前面:word2vec模型最后生成的是一个词嵌入矩阵,每一列对应一个单词的词向量,这个词向量是从高维映射到低维中得到的。采用这个gensim库中的word2vec函数,输入是一个分词后的嵌套语料列表,输出一个词嵌入矩阵。

模型原理

参见:这篇文章
同时更加建议去看看吴恩达深度学习序列模型部分,介绍得深入浅出,网易云课堂和B站都有资源。(当然了,看完仍然不会,但是总比不看强)

模型参数

用gensim函数库训练Word2Vec模型有很多配置参数。这里对gensim文档的Word2Vec函数的参数说明进行翻译,以便不时之需。
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=,iter=5,null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000)

可能会修改的参数被我标黄了:选择CBOW还是skip-gram两种模型,以及采样方式是否使用负采样,用于论文稳健性检验凑字数?
参数:
· sg: 用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
· size:是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百。
min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5
· hs: 如果为1则会采用hierarchica·softmax技巧。如果设置为0(defau·t),则negative sampling会被使用。
· negative: 如果>0,则会采用negativesamp·ing,用于设置多少个noise words
· cbow_mean: 如果为0,则采用上下文词向量的和,如果为1(defau·t)则采用均值。只有使用CBOW的时候才起作用。
· sentences:可以是一个·ist,对于大语料集,建议使用BrownCorpus,Text8Corpus或·ineSentence构建。
· window:表示当前词与预测词在一个句子中的最大距离是多少
· alpha: 是学习速率
· seed:用于随机数发生器。与初始化词向量有关。
· max_vocab_size: 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。
· sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)
· workers参数控制训练的并行数。
· hashfxn: hash函数来初始化权重。默认使用python的hash函数
· iter: 迭代次数,默认为5
· trim_rule: 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)或者一个接受()并返回RU·E_DISCARD,uti·s.RU·E_KEEP或者uti·s.RU·E_DEFAU·T的函数。
· sorted_vocab: 如果为1(defau·t),则在分配word index 的时候会先对单词基于频率降序排序。
· batch_words:每一批的传递给线程的单词的数量,默认为10000
————————————————
参考复制这位博主的博客,原文链接:点我直通

建立模型

模型的建立

from gensim.models import Word2Vec
import warnings

word2vec_model = Word2Vec(cutWords_list, size=100, iter=10, min_count=20)
warnings.filterwarnings('ignore')

模型的保存

模型训练时间较长,保存Word2Vec模型为word2vec_model.w2v文件,之后可以直接读取本地文件

word2vec_model.save('word2vec_model.w2v')
word2vec_model = Word2Vec.load('word2vec_model.w2v')

保存与继续训练模型

还是保存模型问题

model.save('/tmp/MyModel')
#model.save_word2vec_format('/tmp/mymodel.txt',binary = False)
#model.save_word2vec_format('/tmp/mymodel.bin.gz',binary = True)

这段代码是从别人那里复制来的,自己还没试过(点我直通)。
对于save部分的代码,作者是这么说的:前一组方法保存的文件不能利用文本编辑器查看但是保存了训练的全部信息,可以在读取后追加训练
后一组方法保存为word2vec文本格式但是保存时丢失了词汇树等部分信息,不能追加训练。

再训练

model = gensim.models.Word2Vec.load('/tmp/mymodel')
model.train(more_sentences)

明天再看一下把,对于我处理的小规模文本来说,采用别人的模型再训练是必要的,迁移学习的感觉。

模型评估

因为Word2vec是无监督算法, 所以不太好直接评估.
训练出得模型好不好还是需要评估一下的,虽然我不会。
Google开源了20000个语义和语法测试用例, 类似Word2vec论文的做法–“A-B=C-D”.
gensim也提供了评估函数(因为测试用例都是英文, 所以中文词向量不行)
大概是这个思路把,但似乎目前没法用gensim和google的测试用例做,可以模型生成之后自己用用看看效果,比如我之前做的效果就很差,非常差。
此处参考这篇文章: 点我直通。层次清晰,推荐阅读。

模型使用

查看每一个词语对应的向量表示

word2vec_model.wv['公司']  # raw NumPy vector of a word
#输出结果是一个ndarray类型的数组

在这里插入图片描述

查看与某个词语相似度排名的其他词语

word2vec_model.most_similar(['公司'])
#输出:
[('旅游', 0.600152850151062),
 ('宋城', 0.5990653038024902),
 ('大连', 0.5750313997268677),
 ('杭州', 0.5705478191375732),
 ('国旅', 0.5685520172119141),
 ('圣亚', 0.5563722848892212),
 ('直接', 0.5554620027542114),
 ('成为', 0.5510863661766052),
 ('西安', 0.5430792570114136),
 ('5%', 0.5309473872184753)]

找到不同类型的词语

word2vec_model.doesnt_match("大连 西安 杭州 文化".split())

输出为:西安
(由于我训练的语料比较小,分词做的可能也不太好,所以,模型效果很差,可能需要将别人已经训练好的模型拿过来继续训练改进把。要不然,使用这个样子的模型进行下一步的分类效果也绝对不会好的)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值