Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

对齐种子的实体名问题 #5

Closed
LinXueyuanStdio opened this issue Feb 4, 2021 · 1 comment
Closed

对齐种子的实体名问题 #5

LinXueyuanStdio opened this issue Feb 4, 2021 · 1 comment

Comments

@LinXueyuanStdio
Copy link

老师您好,我正在DBP15k上复现MultiKE。

然而MultiKE在论文中使用的数据集是DBP-WD和DBP-YG,所以我决定先在这两个数据集上复现,再在DBP15k上复现。

(这两个数据集来自这个仓库,所以本issue发在这里。)

我复现的过程中发现,代码里缺少基于实体名获取嵌入的部分。于是我用了bert。结果,在不训练网络的情况下,仅仅使用 bert 给出的嵌入,其对齐效果就有99%。

一开始我以为是bert太强大。但是,很快我发现,我错了。

我做了实验:只基于实体名,当两个实体名相等时,则认为两实体对齐了。其中没有用到任何模型。这仅仅是一些 if-else 而已。其结果令人惊讶,100%。

代码如下

# 1. build map
kg1_id2name = {}
kg2_id2name = {}
kg2_name2id = {}
with open("./dataset/DWY100K/dbp_yg/mapping/0_3/ent_ids_1") as f:
    lines = f.readlines()
    for i in lines:
        id, name = i.strip().split("\t")
        kg1_id2name[int(id)] = name
with open("./dataset/DWY100K/dbp_yg/mapping/0_3/ent_ids_2") as f:
    lines = f.readlines()
    for i in lines:
        id, name = i.strip().split("\t")
        kg2_id2name[int(id)] = name
        kg2_name2id[name] = int(id)

# 2. load test data
left_entities = []
right_entities = []
with open("./dataset/DWY100K/dbp_yg/mapping/0_3/ref_ent_ids") as f:
    lines = f.readlines()
    all = len(lines)
    for i in lines:
        a, b = i.split("\t")
        aId = int(a)
        bId = int(b)
        left_entities.append(aId)
        right_entities.append(bId)

# 3. predict
my_right_entities = []
for left_entity in left_entities:
    left_entity_name = kg1_id2name[left_entity]
    idx = left_entity_name.rindex("resource/")
    short_name = left_entity_name[idx+len("resource/"):]
    try:
        kg2_entity_id = kg2_name2id[short_name]
        my_right_entities.append(kg2_entity_id)
    except Exception:
        my_right_entities.append(-1)

# 4. result
true_count = 0
for i in range(len(right_entities)):
    right_entity = right_entities[i]
    my_right_entity = my_right_entities[i]
    if right_entity == my_right_entity:
        true_count += 1

print("true/all = %.2f%%" % (true_count/all*100))

结果截图

JWEKR`WA(Q0LJLFO_Q5%OVX

也就是说,对齐种子如果只通过实体名这一方面的信息做对齐,效果必须有100%。

这太奇怪了。

我使用该数据集的方法是否正确?对齐种子的实体名是否发生了泄漏?我应该如何正确地使用这两个数据集?

期待您的解惑。

@sunzequn
Copy link
Member

sunzequn commented Feb 5, 2021

同学你好,

感谢你对我们工作和数据集的关注。

这个问题是由于DBpedia和YAGO实体具有相同的localname造成的,我一开始构造数据集和设计MultiKE的时候没有注意到这个问题。

后续很多工作已经注意到这个bug了,相关论文如下:

  • Exploring and Evaluating Attributes, Values, and Structures for Entity Alignment. Zhiyuan Liu, Yixin Cao, Liangming Pan, Juanzi Li, Zhiyuan Liu, Tat-Seng Chua. (EMNLP 2020)

  • Cross-lingual Entity Alignment with Incidental Supervision. Muhao Chen, Weijia Shi, Ben Zhou, Dan Roth. (EACL 2020)

所以,如果想使用name作为feature进行实体对齐,DBP-YG这些数据集是不适用的,会造成test data leakage问题,并且,这个数据集也不足够来测试使用name的方法的真实有效性和鲁棒性,所以建议换别的数据集,比如DBP15K,或者,换成我们OpenEA里面给出的2.0版本数据集,我对实体的localname进行了编码,会更难一些。

我和Muhao Chen有一些issue讨论,供你参考:

最后,关于基于表示学习的实体对齐,我想给一些个人建议供你参考:

  • 建议优先考虑和研究基于relation structure的方法,关于这些方法的实验,数据集较多,对比也相对公平;
  • 如果考虑attribute包括name等信息,建议考虑方法的鲁棒性泛化性等,实验方面,选择合适的数据集比如DBP15K、OpenEA2.0或者使用WD等localname是没有特定含义的知识库,方法对比上避免unfair settings,保证实验可靠有效。

祝科研顺利!有问题可以给我发邮件讨论!

孙泽群

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants