0
点赞
收藏
分享

微信扫一扫

《Zero-shot Word Sense Disambiguation using Sense Definition Embeddings》代码剖析


LawsonAbs的认知与思考,还请各位读者审慎阅读

总结


  • 论文分析过程见​​链接​​
  • 本文是对该论文的整个程序的调度过程进行一个彻头彻尾的分析。

在看整个代码之前,先看一下整个框架的结构。《Zero-shot Word Sense Disambiguation using Sense Definition Embeddings》代码剖析_程序代码

1 数据

1.1 WN18RR

来谈谈训练的数据,作者在文中是这么说的:

《Zero-shot Word Sense Disambiguation using Sense Definition Embeddings》代码剖析_程序代码_02

见下面这段话的叙述:

《Zero-shot Word Sense Disambiguation using Sense Definition Embeddings》代码剖析_python_03

是说 ​​WN18RR​​ 来自于 ​​WN18​​,但是修正了其中的一些错误。并且把 ​​WN18​​ 数据集中的18种关系降低成11中关系了。数据格式如下:

《Zero-shot Word Sense Disambiguation using Sense Definition Embeddings》代码剖析_数据_04

这里的 ​​_hypernym​​ 就是 ​​relation​​,08621598 和 08620061 分别是 ​​head​​ 和 ​​tail​​ 。(但是这个word-> id 的转换过程我不知道在哪里完成的,但是不影响分析。)

1.2 数据预处理

在conve中的数据预处理脚本如下:

《Zero-shot Word Sense Disambiguation using Sense Definition Embeddings》代码剖析_自然语言处理_05

主要看一下文件 ​​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​​ 中的数据重新组织然后写入到一个新文件中。就是生成了下面四个文件:

《Zero-shot Word Sense Disambiguation using Sense Definition Embeddings》代码剖析_深度学习_06

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
《Zero-shot Word Sense Disambiguation using Sense Definition Embeddings》代码剖析_深度学习_07我解决这个问题的方式是,将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模型

《Zero-shot Word Sense Disambiguation using Sense Definition Embeddings》代码剖析_自然语言处理_08《Zero-shot Word Sense Disambiguation using Sense Definition Embeddings》代码剖析_自然语言处理_09

在得到 xxx_defn.model 之后,就可以生成各个sense的embedding了,生成的结果放在 embeddings.npz 中。如下所示:

《Zero-shot Word Sense Disambiguation using Sense Definition Embeddings》代码剖析_自然语言处理_10


这个.npz 文件是 numpy中对很多文件的压缩封装。
numpy 使用savez()来将数组保存为.npz格式文件,使用load()来加载.npz格式的文件。


那怎么查看这个文件中的数据呢?使用如下方法:

《Zero-shot Word Sense Disambiguation using Sense Definition Embeddings》代码剖析_程序代码_11

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 跑出最后的训练模型

《Zero-shot Word Sense Disambiguation using Sense Definition Embeddings》代码剖析_python_12


举报

相关推荐

0 条评论