《Zero-shot Word Sense Disambiguation using Sense Definition Embeddings》代码剖析
LawsonAbs的认知与思考,还请各位读者审慎阅读。
总结
- 文章来源:CSDN_LawsonAbs
- 论文分析过程见链接
- 本文是对该论文的整个程序的调度过程进行一个彻头彻尾的分析。
在看整个代码之前,先看一下整个框架的结构。
1 数据
1.1 WN18RR
来谈谈训练的数据,作者在文中是这么说的:
见下面这段话的叙述:
是说 WN18RR
来自于 WN18
,但是修正了其中的一些错误。并且把 WN18
数据集中的18种关系降低成11中关系了。数据格式如下:
这里的 _hypernym
就是 relation
,08621598 和 08620061 分别是 head
和 tail
。(但是这个word-> id 的转换过程我不知道在哪里完成的,但是不影响分析。)
1.2 数据预处理
在conve中的数据预处理脚本如下:
主要看一下文件 wrangle_KG.py
文件,其核心代码就是:
# 处理每行
for p in files:
with open(join(base_path, p)) as f:
for i, line in enumerate(f):
e1, rel, e2 = line.split('\t')
e1 = e1.strip()
e2 = e2.strip()
rel = rel.strip()
rel_reverse = rel+ '_reverse'
# data
# (Mike, fatherOf, John)
# (John, fatherOf, Tom)
# 这里就是在生成label 和 train data
if (e1 , rel) not in label_graph:
label_graph[(e1, rel)] = set()
if (e2, rel_reverse) not in label_graph:
label_graph[(e2, rel_reverse)] = set()
if (e1, rel) not in train_graph[p]:
train_graph[p][(e1, rel)] = set()
if (e2, rel_reverse) not in train_graph[p]:
train_graph[p][(e2, rel_reverse)] = set()
# labels
# (Mike, fatherOf, John)
# (John, fatherOf, Tom)
# (John, fatherOf_reverse, Mike)
# (Tom, fatherOf_reverse, Mike)
label_graph[(e1, rel)].add(e2)
label_graph[(e2, rel_reverse)].add(e1)
# test cases
# (Mike, fatherOf, John)
# (John, fatherOf, Tom)
test_cases[p].append([e1, rel, e2])
# data
# (Mike, fatherOf, John)
# (John, fatherOf, Tom)
# (John, fatherOf_reverse, Mike)
# (Tom, fatherOf_reverse, John)
train_graph[p][(e1, rel)].add(e2)
train_graph[p][(e2, rel_reverse)].add(e1)
很明显,其作用是将 WN18RR
中的数据重新组织然后写入到一个新文件中。就是生成了下面四个文件:
2 调试错误
2.1 ValueError
在运行期间遇到的调试错误(可参看issues链接)有:
When I Train ConvE with a definition encoder, I got ValueError: unsupported pickle protocol: 5, following pic give detail information, can you help me ? I use the same tools version as you write in requirements.txt
我解决这个问题的方式是,将python的版本提升至3.8.0。
3 程序代码
3.1 论文程序代码分成两块
- 使用definition encoder得到 sense的编码,然后将这些编码写到 saved_embeddings/embeddings.npz 中。
- 使用得到的embedding 再和上下文训练得到的embedding做匹配,从而语义消歧
但是和知识图谱相关的只有模块1,所以这里我只展示这个模块的运行过程,并分析一下代码构成和最后的运行结果。
项目运行步骤:
1.运行 conve_main.py 得到entities 和 relations的初始化embedding
2.使用definition Encoder训练ConvE 。
3.使用训练好的模型生成定义的表示。这些embedding都被存储在saved_embeddings/embeddings.npa中。这些embedding就是用来训练一个WSD模型
在得到 xxx_defn.model 之后,就可以生成各个sense的embedding了,生成的结果放在 embeddings.npz 中。如下所示:
这个.npz 文件是 numpy中对很多文件的压缩封装。
numpy 使用savez()来将数组保存为.npz格式文件,使用load()来加载.npz格式的文件。
那怎么查看这个文件中的数据呢?使用如下方法:
3.2
根据definition encoder来训练得到sense的embedding的代码在run_definition_encoder.py中,这是一个主要代码,分析一下。其主要作用:
- Run ConvE to get initial embeddings for entities and relations. (得到一个entity 和 relation 的初始向量)
感觉没啥好写的了,比较简单 ,如果有疑问的话,请文章底部留言吧。
4
使用wsd_main.py 跑出最后的训练模型
参考文档
- https://lawson-t.blog.csdn.net/article/details/109730175
- https://blog.csdn.net/wangkaidehao/article/details/103434442
相关文章
- java 登陆拦截_登录拦截 – java代码库 – 云代码
- CentOS搭建GitLab代码管理平台
- JetBrains 又出了款新神器,一套代码适应多端
- 谁动了我的代码:代码混淆剖析
- 被前公司辞退后,前领导打电话命令你给前同事解释代码,该怎么办?
- java二分查找算法代码详解编程语言
- 代码接纳Redis一步搞定(代码如何连接redis)
- 很不错的一个UBB代码
- 让firefox支持IE的一些方法的javascript扩展函数代码
- C#调用存储过程简单完整的实例代码
- php下用cookie统计用户访问网页次数的代码
- php正则过滤html标签、空格、换行符的代码(附说明)
- Jquery改变radio/checkbox选中状态,获取选中的值(示例代码)
- JavaScript获取图片真实大小代码实例