这是第一个自己学习并实现的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 =