word2vec实战

word2vec可以使用gensim库调用。gensim.models.word2vec中包含了word2vec相关的API。算法常用的是gensim.models.word2vec.Word2Vec。但是,有时候可以简写成gensim.models.Word2Vec(此为个人见解)

1. 拟合模型

from gensim.models.word2vec import Word2Vec
from gensim.test.utils import common_texts
# from gensim.models import Word2Vec
print(common_texts)  # 训练预料
model = Word2Vec(common_texts, size=5, window=5, min_count=1)#拟合模型
# sentences一般为可迭代对象
# 查看某个词的词向量
print(model['huamn])
print(model.wv['human'] )# 二者等价,所以有无wv均可
[['human', 'interface', 'computer'], ['survey', 'user', 'computer', 'system', 'response', 'time'], ['eps', 'user', 'interface', 'system'], ['system', 'human', 'system', 'eps'], ['user', 'response', 'time'], ['trees'], ['graph', 'trees'], ['graph', 'minors', 'trees'], ['graph', 'minors', 'survey']]
[-0.08089101 -0.01205394  0.0557584  -0.01287717  0.02588252]
[-0.08089101 -0.01205394  0.0557584  -0.01287717  0.02588252]

2.模型的保存与加载

# 模型的保存与加载
model.save('word2vec.model')
# 加载模型并再次训练
model = Word2Vec.load('word2vec.model')
model.train([['hello', 'world'], ['python', 'java', 'c']], total_examples=1, epochs=1)
# 再训练只是更新神经网络的参数,由于之前的model已经有总词汇表了,再训练新加的词汇不会有相应的词向量,具体可看下面build_vocab

3.词向量的保存与加载

# 词向量文件的保存
model.wv.save('model.wv') # 以KededVectors实例的形式保存词向量文件,以该方式保存的模型丢失了完整的模型状态,无法再训练
# 词向量文件的加载
from gensim.models import KeyedVectors
wv_ = KeyedVectors.load("model.wv", mmap='r')
print(wv_)
vector = wv_['human'] # numpy vector of a word # 查看一个词的词向量
vector
<gensim.models.keyedvectors.Word2VecKeyedVectors object at 0x00000265BD7E98D0>
array([-0.09481409, -0.00214362,  0.02554419,  0.08695793,  0.05693445],
      dtype=float32)

4.词向量的一些应用

# 词向量的应用

import gensim.downloader as api
word_vectors = api.load("glove-wiki-gigaword-100")  # load pre-trained word-vectors from gensim-data
# 找出最相近的topn个词,positive对相似性有正面贡献,negative对相似性有负面影响
result = word_vectors.most_similar(positive=['woman', 'king'], negative=['man'], topn=3)

# 找出不同类的词
word_vectors.doesnt_match("breakfast cereal dinner lunch".split())

# 查看两个词的相似度
similarity = word_vectors.similarity('woman', 'man')

# 查看一个词向量相似的词集合
result = word_vectors.similar_by_word("cat")

# 两个单词的距离
distance = word_vectors.distance("media", "media")

sentence_obama = 'Obama speaks to the media in Illinois'.lower().split()
sentence_president = 'The president greets the press in Chicago'.lower().split()

# 两句话的WMD距离
similarity = word_vectors.wmdistance(sentence_obama, sentence_president)

# 两个句子相似度
sim = word_vectors.n_similarity(['sushi', 'shop'], ['japanese', 'restaurant'])

# 词向量
vector = word_vectors['computer']  # numpy vector of a word
vector.shape

5. build_vocab应用

# 上述我们调用Word2Vec创建模型实际上会对数据执行两次迭代操作,第一轮操作会统计词频来构建内部的词典数结构,
# 第二轮操作会进行神经网络训练,而这两个步骤是可以分步进行的,这样对于某些不可重复的流(譬如 Kafka 等流式数据中)可以手动控制:

from gensim.models import Word2Vec
sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]]
model = Word2Vec(min_count=1) # an empty model, no training yet
model.build_vocab(sentences)  # prepare the model vocabulary
print(model.corpus_count, model.iter)  # 2句话,5个词
model.train([['model', 'say'], ['cat', 'dog']], total_examples=model.corpus_count, epochs=model.iter) # can be a non-repeatable, 1-pass generator
model.wv['meow']  # cat需在sentences构成的词汇表中,如果没有则报错(如model就会报错),train只是对sentences的神经网络进行调参。

6.Word2Vec参数简介

  1. sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出。后面我们会有从文件读出的例子。

  2. size: 词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。

  3. window:即词向量上下文最大距离,这个参数在我们的算法原理篇中标记为c,window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5,10]之间。

  4. sg: 即我们的word2vec两个模型的选择了。如果是0, 则是CBOW模型,是1则是Skip-Gram模型,默认是0即CBOW模型。

  5. hs: 即我们的word2vec两个解法的选择了,如果是0, 则是Negative Sampling,是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。

  6. negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在我们的算法原理篇中标记为neg。

  7. cbow_mean: 仅用于CBOW在做投影的时候,为0,则算法中的xw为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示xw,默认值也是1,不推荐修改默认值。

  8. min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。

  9. iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。

  10. alpha: 在随机梯度下降法中迭代的初始步长。算法原理篇中标记为η,默认是0.025。

  11. min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。这部分由于不是word2vec算法的核心内容,因此在原理篇我们没有提到。对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。

7.train参数简介

  1. sentences:用于再训练的预料
  2. total_examples:sentences的个数
  3. total_words:sentences中原始单词的个数
  4. epochs:迭代的数目

8.load_api参数简介

gensim.downloader.load(name, return_path=False):

  1. name:str-model/dataset的名字
  2. return_path:bool-如果为True,返回文件的完整路径,如果为False,下载model或者dateset
  • return:
    • Model-如果name为model且return_path=False
    • Dateset-如果name为dateset且return_path=False
    • str-当且仅当return_path=True时,返回model/dateset的path(路径)
import gensim.downloader as api
model = api.load("glove-twitter-25")  # load glove vectors
import gensim.downloader as api
wiki = api.load("wiki-en")  # load extracted Wikipedia dump, around 6 Gb
发布了111 篇原创文章 · 获赞 113 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43178406/article/details/102461021