tensorflow用skipgram+nce模型实现中文word2vec

本文是作者使用TensorFlow实现skipgram模型和nce损失函数训练中文word2vec的过程记录,包括获取语料、分词、构建词频统计、词典、反转词典、训练数据以及模型构建。虽然遇到一些困难,如模型保存和加载,但通过参考多篇博客完成了初步实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是第一个自己学习并实现的tensorflow程序,用了两天,基本弄懂,但还是有些问题,比如现在还没有弄懂如何保存并重新加载使用训练好的模型,在整个流程上有时候还是会混乱,超参的设置也没太走心。路漫漫其修远兮啊~~~同样,感谢网上的各种大神,完成这个主要参考了4篇内容(文章最后有链接)。若以下出现任何错误,热烈欢迎大家在评论区指正,因为我也是新手,难免会犯错~程序中出现的逻辑错误也希望大家指出~

下面先说一下整个流程,什么都不是一蹴而就的,当初理清楚要做什么还是用了一些时间的。

1. 获取中文语料,并分词。
说明:分词工具使用的结巴分词工具,网上有使用方法。我的语料是每一行是一句,词与词之间我用空格分隔的,这些和后面统计词频的部分有点关系。总之,我觉得是语料中的每一句话应该能够区分出边界,即能够判断出 sentence1,sentence2,… 这样。
语料举例:
我们 是 祖国 的 花朵
你 今天 吃 饭 了 吗
今天 真 开心 啊

2.将语料的中所有word存成一个list
说明:这一步的原因,我认为是为了方便后序由此构建词频统计、词典和反转词典。
格式描述:
[‘我们’,’是’,’祖国’,’的’,…]

3.构建词频统计、词典和反转词典
说明:这一步我分成了两个函数来写,写在一个函数中也行,和上一步都写在一个函数中都行,随意。我之所以分开写,是因为新手练习,方便调试和测试。
词频统计结果格式:
[(‘unk’,-1),(‘的’,20),(‘你’,10),…],词频统计的是TopN的词和其在语料中出现的次数,除了‘unk’这一项,后面的项按照词频降序排序
词典格式:
{word1:num1,word2:num2,…},num就是词在词频表(countlist)中对应的序号(位序)
反转词典格式:
{num1:word1,…},就是将词典中的键与值对调

4.构建训练数据
skipgram模型是有监督的,而原始语料是无监督的,所以要从分好词的语料中构建训练数据。本实验中的窗口大小为1,即取中心词左右两边各一个词与中心词构成训练语料,举例说明:
语料格式:
我们 是 祖国 的 花朵
你 今天 吃 饭 了 吗
今天 真 开心 啊
用第一句话构建训练数据(shipgram模型是用中心词预测上下文词汇)
[(‘我们’,’是’),(‘是’,’我们’),(‘是’,’祖国’),…]
当‘我们’作为中心词时,它的上下文词只有‘是’,所以组成一个pair,‘我们’就是输入数据,‘是’就是对应的label;当‘是’作为中心词时,它的上下文词有‘我们’和‘祖国’,所以组成两个pair,这样可以把语料都转换为训练数据。但是在本实验中,需要将数据数据与标签数据分开,所以最终的训练数据有两部分,一个是输入list,一个是输出list,两部分要对应,举例说明:
input:[‘我们’,’是’,’是’,…]
label:[‘是’,’我们’,’祖国’,…]

5.构建skipgram模型
这里我把模型的定义和训练都写在一起了。

完整程序如下:

import tensorflow as tf
import numpy as np
from collections import Counter  #用于统计词频

data_path = "6-15.txt"  #语料路径
embedding_save_path = "embeddings.txt"  #把最后的emdeddings保存的路径
vocabulary_size = 8000  #词典大小
win_len = 1   #窗口长度,即取中心词左右两边各一个词

batch_size = 500  #一个batch中的训练数据的个数
embedding_size = 128  #生成的词向量的长度
num_sampled = 64  #负采样中用到的负样本的数量

#验证数据  
valid_size=16 #抽取的验证单词数  
valid_window=100 #验证单词只从频数最高的100个单
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值