PaddlePaddle / PaddleNLP

👑 Easy-to-use and powerful NLP and LLM library with 🤗 Awesome model zoo, supporting wide-range of NLP tasks from research to industrial applications, including 🗂Text Classification, 🔍 Neural Search, ❓ Question Answering, ℹ️ Information Extraction, 📄 Document Intelligence, 💌 Sentiment Analysis etc.
https://paddlenlp.readthedocs.io
Apache License 2.0
12.17k stars 2.95k forks source link

UIE在关系抽取时的相关问题 #2449

Closed CodeFrontWang closed 1 year ago

CodeFrontWang commented 2 years ago

有点不太理解这个验证集是如何去生成的,这是原始样本: { "id": 38, "text": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "relations": [ { "id": 20, "from_id": 51, "to_id": 53, "type": "歌手" }, { "id": 21, "from_id": 51, "to_id": 55, "type": "发行时间" }, { "id": 22, "from_id": 51, "to_id": 54, "type": "所属专辑" } ], "entities": [ { "id": 51, "start_offset": 4, "end_offset": 11, "label": "作品名" }, { "id": 53, "start_offset": 15, "end_offset": 18, "label": "人物名" }, { "id": 54, "start_offset": 42, "end_offset": 46, "label": "作品名" }, { "id": 55, "start_offset": 26, "end_offset": 31, "label": "时间" } ] }

在实际情况中,我是不知道有哪些实体,也不知道实体之间到底有哪些关系。
也就是,无论无论怎么样,首先得找到实体, 但UIE中,训练的时候,是把实体,和实体的关系都作为prompt去训练。 训练数据如下, 正负样本比例为设置的很大(保证样本数为实体样本+ 实体数*关系数):

{"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [{"text": "丛林男孩", "start": 42, "end": 46}], "prompt": "你知道我要什么的所属专辑"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [{"text": "1989年", "start": 26, "end": 31}], "prompt": "时间"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [], "prompt": "高明骏的发行时间"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [], "prompt": "丛林男孩的发行时间"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [], "prompt": "1989年的发行时间"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [], "prompt": "高明骏的歌手"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [{"text": "1989年", "start": 26, "end": 31}], "prompt": "你知道我要什么的发行时间"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [], "prompt": "丛林男孩的所属专辑"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [], "prompt": "1989年的歌手"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [], "prompt": "丛林男孩的歌手"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [{"text": "高明骏", "start": 15, "end": 18}], "prompt": "人物名"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [{"text": "你知道我要什么", "start": 4, "end": 11}, {"text": "丛林男孩", "start": 42, "end": 46}], "prompt": "作品名"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [], "prompt": "高明骏的所属专辑"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [], "prompt": "1989年的所属专辑"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [{"text": "高明骏", "start": 15, "end": 18}], "prompt": "你知道我要什么的歌手"}

我有两个疑惑,我们在验证的时候,doccano.py中的"--splits", default=[0, 1, 0],这样生成的dev.txt会有问题,如下: {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [{"text": "你知道我要什么", "start": 4, "end": 11}, {"text": "丛林男孩", "start": 42, "end": 46}], "prompt": "作品名"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [{"text": "高明骏", "start": 15, "end": 18}], "prompt": "人物名"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [{"text": "1989年", "start": 26, "end": 31}], "prompt": "时间"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [{"text": "高明骏", "start": 15, "end": 18}], "prompt": "你知道我要什么的歌手"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [{"text": "1989年", "start": 26, "end": 31}], "prompt": "你知道我要什么的发行时间"} {"content": "百科名片你知道我要什么,是歌手高明骏演唱的一首歌曲,1989年发行,收录于个人专辑《丛林男孩》中", "result_list": [{"text": "丛林男孩", "start": 42, "end": 46}], "prompt": "你知道我要什么的所属专辑"}

**_疑惑一: 只生成了实体以及已经存在的关系,但我们在实际请款下,是不知道哪些实体之间有关系的呀, 这里验证的时候,只去验证那些确定有实体关系的样本了。

疑惑二:即使我设计验证集的时候,把所有的实体*关系的情况都作为样本了, 就像上面的训练集一样,保证了每个实体都有这样的模板:实体-关系, 然后去抽客体,这个客体到底有没有我们是不知道的。 那这样也有问题, 实际情况中,我们在验证,是肯定得分成两步的, 第一步就是预测出NER,第二步如果用prompt这套,那就是NER1+关系1, NER1+关系2, NER2+关系1, NER2+关系2_**

kahitomi commented 2 years ago

这个验证集生成的确实有问题,麻烦有问题的给一下数据和命令,我们相关同学复现一下看看。 现在评估的大逻辑是单阶段评测,这一段在UIE的readme里面:评估方式说明:采用单阶段评价的方式,即关系抽取、事件抽取等需要分阶段预测的任务对每一阶段的预测结果进行分别评价。验证/测试集默认会利用同一层级的所有标签来构造出全部负例。

CodeFrontWang commented 2 years ago

如果是单阶段测评,那应该先生成实体,然后用生成的实体和整个数据集中存在的那些关系,做组合,再去预测。这个逻辑在doccano代码中没有体现出来。doccano_ext.json里面就是issue中的那条样本,就一条。 python doccano.py \     --doccano_file ./data/doccano_ext.json \     --task_type "ext" \     --save_dir ./data \     --splits 0 1 0

---原始邮件--- 发件人: "Wei @.> 发送时间: 2022年6月8日(周三) 下午4:11 收件人: @.>; 抄送: @.**@.>; 主题: Re: [PaddlePaddle/PaddleNLP] UIE在关系抽取时的相关问题 (Issue #2449)

这个验证集生成的确实有问题,麻烦有问题的给一下数据和命令,我们相关同学复现一下看看。 现在评估的大逻辑是单阶段评测,这一段在UIE的readme里面:

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

wawltor commented 2 years ago

如果是单阶段测评,那应该先生成实体,然后用生成的实体和整个数据集中存在的那些关系,做组合,再去预测。这个逻辑在doccano代码中没有体现出来。doccano_ext.json里面就是issue中的那条样本,就一条。 python doccano.py \     --doccano_file ./data/doccano_ext.json \     --task_type "ext" \     --save_dir ./data \     --splits 0 1 0 ---原始邮件--- 发件人: "Wei @.> 发送时间: 2022年6月8日(周三) 下午4:11 收件人: @.>; 抄送: @.**@.>; 主题: Re: [PaddlePaddle/PaddleNLP] UIE在关系抽取时的相关问题 (Issue #2449) 这个验证集生成的确实有问题,麻烦有问题的给一下数据和命令,我们相关同学复现一下看看。 现在评估的大逻辑是单阶段评测,这一段在UIE的readme里面: — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

这个逻辑本身在docanno转化的逻辑是有的,包含了不同的关系组合(负样本构造),你看看要不要拉取一下最新的doccano.py 试试,或者你提供几条样本给我们试试

CodeFrontWang commented 2 years ago

我明白您的意思,也看到了能构造关系的负样本,我想表达的是,我理解的逻辑应该为,先拿验证集去找实体,然后把找到的实体和验证集里的关系组合(这一步似乎没有代码),再去推理计算F1。训练的时候,你们是把找实体和通过实体关系找客体,这两个任务合在一起,让模型学习。但验证的时候,是需要两步的,doccano.py似乎没有体现这个两步的概念。

---原始邮件--- 发件人: @.> 发送时间: 2022年6月8日(周三) 下午4:34 收件人: @.>; 抄送: @.**@.>; 主题: Re: [PaddlePaddle/PaddleNLP] UIE在关系抽取时的相关问题 (Issue #2449)

如果是单阶段测评,那应该先生成实体,然后用生成的实体和整个数据集中存在的那些关系,做组合,再去预测。这个逻辑在doccano代码中没有体现出来。doccano_ext.json里面就是issue中的那条样本,就一条。 python doccano.py \     --doccano_file ./data/doccano_ext.json \     --task_type "ext" \     --save_dir ./data \     --splits 0 1 0 … ---原始邮件--- 发件人: "Wei @.> 发送时间: 2022年6月8日(周三) 下午4:11 收件人: @.>; 抄送: @.@.>; 主题: Re: [PaddlePaddle/PaddleNLP] UIE在关系抽取时的相关问题 (Issue #2449) 这个验证集生成的确实有问题,麻烦有问题的给一下数据和命令,我们相关同学复现一下看看。 现在评估的大逻辑是单阶段评测,这一段在UIE的readme里面: — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

这个逻辑本身在docanno转化的逻辑是有的,包含了不同的关系组合(负样本构造),你看看要不要拉取一下最新的doccano.py 试试,或者你提供几条样本给我们试试

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

github-actions[bot] commented 1 year ago

This issue is stale because it has been open for 60 days with no activity. 当前issue 60天内无活动,被标记为stale。

github-actions[bot] commented 1 year ago

This issue was closed because it has been inactive for 14 days since being marked as stale. 当前issue 被标记为stale已有14天,即将关闭。