NLP系列(4)Word2Vec 字&词向量的训练和使用

前言

 word2vec 是静态词向量构建方法的一种,与 Embedding 词向量相似。本文将介绍 word2vec 词向量是如何训练的,训练好的 word2vec 词向量如何使用。由于不同的 gensim 的版本不同,在调用一些函数时会有差异。隐藏本文的 gensim 的版本为 4.2.0 ,以下代码都依此版本为准。

数据 

本文使用的数据是 THUCNews 中train.txt、dev.txt、test.txt 中所有的中文数据,一共用20000条。

 图1 训练数据

字向量

处理数据

    # 得到每一行的数据 []
    datas = open('data/word.txt', 'r', encoding='gbk').read().split("\n")
    # 得到一行的单个字 [[],...,[]]
    word_datas = [[i for i in data if i != " "] for data in datas]

 图2 将数据处理成字

训练

    model = Word2Vec(
        word_datas,  # 需要训练的文本
        vector_size=10,   # 词向量的维度
        window=2,  # 句子中当前单词和预测单词之间的最大距离
        min_count=1,  # 忽略总频率低于此的所有单词 出现的频率小于 min_count 不用作词向量
        workers=8,  # 使用这些工作线程来训练模型(使用多核机器进行更快的训练)
        sg=0,  # 训练方法 1:skip-gram 0;CBOW。
        epochs=10  # 语料库上的迭代次数
    )

 图3 模型结构内容1

训练好字向量后,我们使用最多的是 index_to_key 、 key_to_index 、字向量,根据前面两个,就可以对文字进行编码与解码。

 图4 模型结构内容2

注:模型中的 index_to_key 、 key_to_index 、字向量 都可以单独保存

    pkl.dump([model.wv.index_to_key, model.wv.key_to_index, model.wv.vectors], open("PartialWeight.pkl", "wb"))

保存模型

    # 字向量保存
    model.wv.save_word2vec_format('word_data.vector',   # 保存路径
                                  binary=False  # 如果为 True,则数据将以二进制 word2vec 格式保存,否则将以纯文本格式保存
                                  )

    # 模型保存
    model.save('word.model')

通过保存字向量(word_data.vector),第一行第一个数字表示一共有多少字,第二个数字表示一个字用10的数字表示。

比如:0 --> [0.99632174 2.0563052 -0.72112525 3.789005 -4.6471505 -2.838667 -4.621025 4.180826 3.625088 3.2602801]

 图6 字向量部分内容

使用 

加载模型

    # 1 通过模型加载词向量(recommend)
    model = gensim.models.Word2Vec.load('word.model')
    # 2 通过字向量加载
    vector = KeyedVectors.load_word2vec_format('word_data.vector')

 查看

model.wv.index_to_key

 图7 查看 index_to_key 的部分内容

model.wv['提'] --》通过模型进行查看

  图8 通过模型进行查看字 “提” 的向量

vector['提'] --》通过字向量进行查看

图9 通过字向量进行查看字 “提” 的向量 

可以发现两种方法得到的结果都是一样的

词向量

处理数据

    datas = open("data/word.txt", "r", encoding="gbk").read().split("\n")
    words_datas = [[i for i in (jieba.cut(data))] for data in datas]

 图10 将数据处理成词

训练与保存模型

    model = Word2Vec(words_datas, vector_size=10, window=2, min_count=1, workers=8,  sg=0, epochs=10)

    model.wv.save_word2vec_format('words_data.vector', binary=False)

    model.save('words.model')

源码获取

Word2Vec 字&词向量icon-default.png?t=N7T8https://github.com/mzc421/Pytorch-NLP/tree/master/00-Word2Vec%20%E5%AD%97&%E8%AF%8D%E5%90%91%E9%87%8F

 硬性的标准其实限制不了无限可能的我们,所以啊!少年们加油吧!

  • 20
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
训练中文词向量并进行可视化的过程中,可以按照以下步骤进行操作: 1. 准备数据:首先,需要准备一个包含大量中文文本的语料库作为训练数据。可以使用已有的中文语料库,或者自己收集相关的中文文本数据。 2. 数据预处理:对于中文文本数据,需要进行一些预处理操作,例如分词、去除停用词、去除标点符号等。可以使用分词工具(如jieba)来进行中文分词,并根据需要进行其他预处理操作。 3. 训练词向量模型:使用Word2Vec算法对预处理后的中文文本数据进行训练,得到词向量模型。可以使用Python中的gensim库来实现Word2Vec算法的训练。 4. 可视化词向量:将训练得到的词向量进行可视化,可以使用t-SNE算法将高维词向量降维到二维或三维空间,并使用可视化工具(如matplotlib)进行展示。 下面是一个示例代码,演示了如何使用Word2Vec训练中文词向量并进行可视化: ```python import jieba from gensim.models import Word2Vec from sklearn.manifold import TSNE import matplotlib.pyplot as plt # 准备数据 corpus = [ "我喜欢吃苹果", "苹果是一种水果", "我喜欢吃香蕉", "香蕉是一种水果", "我喜欢吃橘子", "橘子是一种水果" ] # 数据预处理 sentences = [list(jieba.cut(sentence)) for sentence in corpus] # 训练词向量模型 model = Word2Vec(sentences, size=100, window=5, min_count=1, workers=4) # 可视化词向量 words = model.wv.index2word[:10] # 取前10个词 word_vectors = model.wv[words] tsne = TSNE(n_components=2) word_vectors_tsne = tsne.fit_transform(word_vectors) plt.figure(figsize=(10, 6)) for i, word in enumerate(words): x, y = word_vectors_tsne[i] plt.scatter(x, y) plt.annotate(word, xy=(x, y), xytext=(5, 2), textcoords='offset points', ha='right', va='bottom') plt.show() ``` 这段代码首先准备了一个包含若干中文句子的语料库,然后使用jieba进行分词,接着使用Word2Vec算法训练词向量模型。最后,使用t-SNE算法将词向量降维到二维空间,并使用matplotlib进行可视化展示。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧锦程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值