# 自然语言处理学习记录 **Repository Path**: redicode/nlp-learning-book ## Basic Information - **Project Name**: 自然语言处理学习记录 - **Description**: 本仓库是《深度学习进阶-自然语言处理》一书的学习感悟。 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-04-16 - **Last Updated**: 2022-10-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ============================================================ # 我的学习记录 ============================================================ ## 实现一个cbow模型的word2vec框架 一、实践具体方案: 1、案例内容 使用cbow模型,分析语料库中不同单词之间的关联程度。 2.案例实现思路 (1)引入embedding层 在传统的cbow模型中,如果语料库的词汇量有100万个,则单词的one-hot表示的维数也会有100万,我们需要计算这个巨大向量和权重矩阵的乘积。但其实输入层与偏置矩阵作乘积,所做的事无非是将矩阵里的某一行取出来。因此,我们创建一个从权重矩阵抽取“单词ID”对应行的层。这里我们称为embedding层。图2中,灰色的矩形方块Win表示选中的行向量,即单词ID对应的向量。 ![传统的输入层](static/img/image.png) ![引入embedding层](static/img/advanced-cbow.png) (2)多分类问题转换为二分类问题 传统的cbow模型中,要逐一计算中间层与输出侧的权重矩阵的乘积,后接一个Sigmoid函数输出概率,此为多分类问题。现在,我们把输出层的神经元改为仅有一个,计算乘积时只要提取对应的单词向量的权重即可。举个例子,原来的问题是“上下文是you和goodbye时,中间的单词是哪个?”,变成了“上下文是you和goodbye时,中间的单词是you吗?” ![传统的中间层与输出层 ](static/img/trad-input&output.png) ![改进后的中间层与输出层](static/img/advanced-input&output.png) (3)负采样 除了让神经网络学习正例外,还需要让其学习负例。且需要输入正例时Sigmoid层的输出接近1,输入负例时Sigmoid层的输出接近0. ![采用负采样后的中间层与输出层](static/img/negative-example.png) (4)负采样的采样方法 基于语料库中单词的使用频率会先计算出语料库中各个单词的出现次数,并取概率分布最高的几个单词进行采样。本次实验的语料库使用ptb数据集,这是一个公开的英文语料库。 3. 案例成果与演示 ![运行结果展示1](static/img/output-1.png) ![运行结果展示2](static/img/output-2.png) 随便选择4个单词输入,可以看到前三个单词的最相关的单词还是比较准确的。