zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

代码 剖析 word Using Zero definition Shot
2023-09-14 09:13:19 时间

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

总结

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

在看整个代码之前,先看一下整个框架的结构。代码框架

1 数据

1.1 WN18RR

来谈谈训练的数据,作者在文中是这么说的:
在这里插入图片描述
见下面这段话的叙述:
在这里插入图片描述
是说 WN18RR 来自于 WN18,但是修正了其中的一些错误。并且把 WN18 数据集中的18种关系降低成11中关系了。数据格式如下:
在这里插入图片描述
这里的 _hypernym 就是 relation,08621598 和 08620061 分别是 headtail 。(但是这个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