xiangking / ark-nlp

A private nlp coding package, which quickly implements the SOTA solutions.
Apache License 2.0
310 stars 65 forks source link

输入数据的格式 #81

Open 666-zhang opened 1 year ago

666-zhang commented 1 year ago

请问关系抽取中输入数据的格式是什么样子的?

“列表中每个元素是如下组织的字典”([头实体, 头实体首字符在文本的位置, 头实体尾字符在文本的位置, 关系类型, 尾实体, 尾实体首字符在文本的位置, 尾实体尾字符在文本的位置])

以上所说的字典是什么意思?没太理解

jimme0421 commented 1 year ago

你好,这里的“字典”应该是描述错误,就是类似下面列表的形式, [头实体, 头实体首字符在文本的位置, 头实体尾字符在文本的位置, 关系类型, 尾实体, 尾实体首字符在文本的位置, 尾实体尾字符在文本的位置] 具体的输入格式你可以参考example文件下CMeIE.ipynb中train_df的格式。例子如下: [[产后抑郁症, 0, 4, 鉴别诊断@疾病, 轻度情绪失调, 14, 19]]

666-zhang commented 1 year ago

感谢回复,我输入的是如下的数据格式:

截屏2022-09-16 23 42 48

在model.fit的步骤会报错,在其中 # 计算损失 logits, loss = self._get_train_loss(inputs, outputs, **kwargs)

这一步时会显示输入数据的shape与期待不符: ValueError: Using a target size (torch.Size([1, 100, 1])) that is different to the input size (torch.Size([1, 100])) is deprecated. Please ensure they have the same size.

请问输入的格式哪里有问题呀?

jimme0421 commented 1 year ago

我通过输入单条数据复现出了相同的错误,定位到的是CasRelLoss中包含的torch.nn.functional.binary_cross_entropy报的错。输入多条数据的时候不存在这个错误。

我尝试修复了下,临时的修复方案是在ark_nlp.factory.loss_function.casrel_loss的_compute_loss中将gold也展开。比如将 pred = pred.squeeze(-1) 修改为 pred, gold = pred.squeeze(-1), gold.squeeze(-1)

666-zhang commented 1 year ago

我将输入数据改为多条:

截屏2022-09-17 09 29 51

model.fit阶段没有问题,在predict单条text的时候只返回一个空的集合,

截屏2022-09-17 09 30 07

请问predict的时候对于text的格式有什么要求吗?或者说怎样能得到和输入的label一样格式的输出?

jimme0421 commented 1 year ago

这个情况应该是输入的text中没有包含任何关系,所以结果为空,造成的原因是你用的数据太少了,建议你先用CMeIE的数据试试。

输出格式你可以自己根据需求自行处理,目前的模型的输出格式和输入label略有不同。

666-zhang commented 1 year ago

收到谢谢

samueljsluo commented 1 year ago

请问这个报错可能是什么原因呢? token_ids, masks, text_len, sub_heads, sub_tails, sub_head, sub_tail, obj_heads, obj_tails, triples, tokens, token_mapping = zip(*batch) ValueError: not enough values to unpack (expected 12, got 0) 这是我的数据集

Screenshot 2023-05-31 at 20 33 30