学堂在线《自然语言处理》实验课代码+报告,授课老师为刘知远老师。课程链接:https://www.xuetangx.com/training/NLP080910033761/1017121?channel=i.area.manual_search。
持续更新中。
所有代码为作者所写,并非最后的“标准答案”,只有实验6被扣了1分,其余皆是满分。仓库链接:https://github.com/W-caner/NLP_classs。 此外,欢迎关注我的CSDN:https://github.com/W-caner/NLP_classs。
部分数据集由于过大无法上传,我会在博客中给出下载链接。如果对代码有疑问,有更好的思路等,也非常欢迎在评论区与我交流~
Word2Vec是词嵌入的经典模型,它通过词之间的上下文信息来建模词的相似度。TransE是知识表示学习领域的经典模型,它借鉴了Word2Vec的思路,用“头实体+关系=尾实体”这一简单的训练目标取得了惊人的效果。本次任务要求在给定的框架中分别基于Text8和Wikidata数据集实现Word2Vec和TransE,并用具体实例体会词向量和实体/关系向量的含义。
在这个部分,你需要基于给定的代码实现Word2Vec,在Text8语料库上进行训练,并在给定的WordSim353数据集上进行测试
WordSim353是一个词语相似度基准数据集,在WordSim353数据集中,表格的第一、二列是一对单词,第三列中是该单词对的相似度的人工打分(第三列也已经被单独抽出为ground_truth.npy)。我们需要用我们训练得到的词向量对单词相似度进行打分,并与人工打分计算相关性系数,总的来说,越高的相关性系数代表越好的词向量质量。
我们提供了一份基于gensim的Word2Vec实现,请同学们阅读代码并在Text8语料库上进行训练, 关于gensim的Word2Vec模型更多接口和用法,请参考[2]。
由于gensim版本不同,模型中的size参数可能需要替换为vector_size(不报错的话不用管)
运行word2vec.py
后,模型会保存在word2vec_gensim
中,同时代码会加载WordSim353数据集,进行词对相关性评测,得到的预测得分保存在score.npy文件中
之后在Word2Vec文件夹下运行 python evaluate.py score.npy
, 程序会自动计算score.npy 和ground_truth.npy 之间的相关系数得分,此即为词向量质量得分。
word2vec.py
训练Word2Vec模型, 在WordSim353上衡量词向量的质量。在Word2Vec文件夹下运行 python word2vec.py
, 即可成功运行, 运行生成两个文件 word2vec_gensim和score.npy。
这个部分中,你需要根据提供的代码框架实现TransE,在wikidata数据集训练出实体和关系的向量表示,并对向量进行分析。
在TransE中,每个实体和关系都由一个向量表示,分别用 h , r , t h, r,t h,r,t表示头实体、关系和尾实体的表示向量,首先对这些向量进行归一化
h = h / ∣ ∣ h ∣ ∣ r = r / ∣ ∣ r ∣ ∣ t = t / ∣ ∣ t ∣ ∣ h=h/||h|| \\ r=r/||r||\\ t=t/||t|| h=h/∣∣h∣∣r=r/∣∣r∣∣t=t/∣∣t∣∣
则得分函数(score function)为
f ( h , r , t ) = ∣ ∣ h + r − t ∣ ∣ f(h,r,t)=||h+r-t|| f(h,r,t)=∣∣h+r−t∣∣
其中 ∣ ∣ ⋅ ∣ ∣ ||\cdot|| ∣∣⋅∣∣表示向量的范数。得分越小,表示该三元组越合理。
在计算损失函数时,TransE采样一对正例和一对负例,并让正例的得分小于负例,优化下面的损失函数
L = ∑ ( h , r , t ) ∈ Δ , ( h ′ , r ′ , t ′ ) ∈ Δ ′ max ( 0 , [ γ + f ( h , r , t ) − f ( h ′ , r ′ , t ′ ) ] ) \mathcal{L}=\sum_{(h,r,t)\in\Delta,(h',r',t')\in\Delta'}\max\left( 0, [\gamma+f(h,r,t)-f(h',r',t')]\right) L=(h,r,t)∈Δ,(h′,r′,t′)∈Δ′∑max(0,[γ+f(h,r,t)−f(h′,r′,t′)])
其中 ( h , r , t ) , ( h ′ , r ′ , t ′ ) (h,r,t), (h',r',t') (h,r,t),(h′,r′,t′)分别表示正例和负例, γ \gamma γ是一个超参数(margin),用于控制正负例的距离。
TransE.py
中,你需要补全TransE
类中的缺失项,完成TransE模型的训练。需要补全的部分为:
_calc()
:计算给定三元组的得分函数(score function)loss()
:计算模型的损失函数(loss function)entity2vec.txt
和relation2vec.txt
中。p_norm
和margin
,重新训练模型,分析模型的变化。在TransE文件夹下运行 python TransE.py
, 可以看到程序在第63行和第84行处为填写完整而报错,将这两处根据所学知识填写完整即可运行成功代码(任务第一步),然后进行后续任务。
请提交代码和实验报告,评分将从代码的正确性、报告的完整性和任务的完成情况等方面综合考量。
[1] https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient
[2] https://radimrehurek.com/gensim/models/word2vec.html
[3] A unified model for word sense representation and disambiguation. in Proceedings of EMNLP, 2014.