NLP-project-01-Word2Vec-Tensorflow实现

1.Word2Vec理论基础

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.readme

• 基于Word2Vec的思想,基于TensorFlow相关API实现CBOW+负采样以及
skip-gram+负采样的训练及应用代码(获取对应单词的向量)。
• 要求:
• 代码结构清晰、条理要清晰。
• 训练数据:使用《人民的名义》这部小说。
• 提示:
• 负采样API:tf.nn.sampled_softmax_loss




---代码的执行流程---

    创建新项目Word2VecProject -->创建data文件夹放入split_input_file(人民的名义.txt)-->创建数据处理包utils
    
1. 文本数据分词
    1.data_utis.py       #jieba,定义split_sentence,convert_sentence_to_words
    2.convert_data.py    #数据转换运行主程序,os,tf.logging,tf.app.run()
    运行命令:
        python convert_data.py --opt=split --split_input_file=./data/in_the_name_of_people.txt --split_output_file=./data/words_sentence.txt

2. 词典的构建
    运行命令:
        python convert_data.py --opt=dictionary --dictionary_input_file=./data/words_sentence.txt --dictionary_output_file=./data/dictionary.json --dictionary_min_count=5

3. 训练数据转换
    运行命令:
        python convert_data.py --opt=record --record_input_file=./data/words_sentence.txt --record_output_file=./data/train.cbow.data --record_window=4 --record_structure=cbow --record_allow_padding=False
        python convert_data.py --opt=record --record_input_file=./data/words_sentence.txt --record_output_file=./data/train.skipgram.data --record_window=4 --record_structure=skip-gram --record_allow_padding=False

4. 训练数据批次加载
    详细代码见:utils.data_utils.DataManager

5. 模型训练代码撰写
    a. 大的框架搭建
    b. 将各个部分的代码完善
        B:batch_size, 也就是一个批次中的样本序列数目
        T:times, 窗口大小
        V:vocab_size, 词汇数目
        E:Embedding size, 词向量转换的向量维度大小

6. Word2Vec的负采样的执行过程(以CBOW结构为例)
    运行命令:
        python train.py --data_path=./data/train.cbow.data --dictionary_path=./data/dictionary.json --network_name=w2v --embedding_size=128 --structure=cbow --window=4 --cbow_mean=True --max_epoch=10 --batch_size=1000 --num_sampled=100 --optimizer_name=adam --learning_rate=0.001 --regularization=0.00001 --checkpoint_dir=./running/model/cbow2 --checkpoint_per_batch=100 --summary_dir=./running/graph/cbow2

    NOTE:
        训练数据格式:
            X:[batch_size,window], eg:[1000,4],表示现在有1000个训练数据/样本,每个样本是4个单词id
            Y:[batch_size,1],eg:[1000,1],表示现在有1000个训练数据/样本,每个样本预测对应的某个单词id
        网络的执行:
            1). 针对每个单词获取其对应的词向量,也就是将id转换为向量
                vectors: [batch_size,window] ---> [batch_size,window,embedding_size]
                vectors: eg:[1000,4,128],表示现在有1000个训练数据/样本,每个样本是4个单词,每个单词对应128维的一个向量
            2). 将上下文单词的向量合并成一个整体向量
                features: [batch_size,window,embedding_size] ---> [batch_size,embedding_size]
                features: eg:[1000,128],表示现在有1000个训练数据/样本,每个样本有一个高阶特征向量,这个向量的维度为128维,可以基于这个向量判断实际单词id是哪一个。
            3). 判断对应的单词是哪一个
                NOTE: 模型的目的实际上仅仅只需要获取单词的词向量,而不是要这个预测单词,所以判断对应单词是哪一个的这个过程属于损失函数构建的过程。
    a. 普通全连接的执行过程(普通损失函数的构建过程)-1). 前向过程之后后,得到的高阶特征向量features,需要基于该值得到预测属于各个类别的概率值以及对应的损失函数
        -2). 得到属于所有类别的置信度:
            logits: [batch_size,vocab_size],eg: [1000,3365], 表示现在有1000个训练数据/样本,预测每个训练数据对应属于各个单词的置信度(总共有3365个单词)-3). 思考:
            基于logits置信度来构建这个损失函数,步骤如下:
                -a). 计算属于各个类别的概率
                    p = tf.exp(logits) / tf.reduce_sum(tf.exp(logits), axis=1, keep_dims=True) # [batch_size,vocab_size] / [batch_size,1] --> [batch_size,vocab_size]
                -b). 获取实际类别对应的类别预测概率值
                    pred_p = p[:,labels] # 类似获取对应列的值,当然实际API应该不是这个,形状应该为:[batch_size,]
                -c). 计算损失函数
                    loss = sum(-log(pred_p)) # 先对概率求对数,然后求相反数,最后求和,最终形状为[],是一个数字

    b. 负采样的执行过程:
        -1). 前向过程之后后,得到的高阶特征向量features,需要基于该值得到对应的损失函数
        -2). 首先抽取对应类别的模型参数w(计算得到各个类别置信度的模型参数w)
            获取实际类别(正例)对应的模型参数w以及负例对应的模型参数w
            -a. 先获取num_sampled个类别对应的参数id(是作为负例的)
            -b. 将正例id和负例id合并到一起,获取w,然后w分割开为true_w和sampled_w
            -c. 对于高阶特征向量features,分别判断属于正例以及负例的置信度
            -d. 对于属于负例的置信度中,如果存在负例id和正例id一致的情况,那么将负例对应的置信度修改为0
            -c. 将负例和正例的置信度合并到一起,作为最终的置信度。
        -3). 基于抽取的参数计算预测属于各个类别的置信度
        -4). 数据结构转换
        -5). 计算损失函数(和普通的方式一样)

=====================================================================
7.模型应用代码及模型部署代码完善
    deploy.py  部署
    eval.py 可视化构建
    当模型训练好后,我们需要进行模型的评估、应用等操作,但是在应用的时候要根据业务模型特点,采用不同的方式来进行应用:
    也就是说在企业中,一般我们常用的一种用法是:
        1. 算法工程师使用Python语言结合业务需求训练好这个模型,并且模型持久化;
        2. 模型的应用(一般结合模型特点来做),常规方式如下:
            a. 基于训练模型的语言以及框架,将训练好的模型持久化为二进制磁盘文件,然后再需要的地方进行模型的恢复加载(这种方式有一个缺陷,要求模型恢复语言和模型的训练语言必须是一致的), eg:Tensorlow中的ckpt格式模型、sklearn中的joblib保存方式等等。
            b. 基于某种特定的框架、API将模型转换为支持跨语言调用的格式文件,然后在需要的地方进行模型的恢复加载(这种方式比较常用,一般企业中就是使用python训练模型,然后使用c++或者java进行模型的恢复)
            c. 将模型参数(根据业务来定)保存,然后再需要的地方加载模型参数,进行数据的预测应用


3.代码图片

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值