首页 PaddleNLP 帖子详情
在使用ernie-1.0模型做信息抽取(ner)无法处理长文本数据
收藏
快速回复
PaddleNLP 其他训练NLP 16307 3
在使用ernie-1.0模型做信息抽取(ner)无法处理长文本数据
收藏
快速回复
PaddleNLP 其他训练NLP 16307 3

在使用ernie-1.0模型时因为我的数据文本太长,我需要增加max_seq_len长度,但修改时发现只要不是512这个数就会报错,错误日志如下:

ValueError: (InvalidArgument) Variable value (input) of OP(fluid.layers.embedding) expected >= 0 and < 513, but got 513. Please check input value.
[Hint: Expected ids[i] < row_number, but received ids[i]:513 >= row_number:513.] (at /home/Paddle/paddle/fluid/operators/lookup_table_v2_op.h:77)
[operator < lookup_table_v2 > error]

代码如下:

def convert_example(example, tokenizer, label_vocab, no_entity_id, max_seq_len):
    tokens, labels = example
    tokenized_input = tokenizer(tokens, return_length=True, is_split_into_words=True, max_seq_len=max_seq_len)
    if len(tokenized_input['input_ids']) - 2 < len(labels):
        labels = labels[:len(tokenized_input['input_ids']) - 2]

    labels = ['O'] + labels + ['O']
    tokenized_input['labels'] = [label_vocab[x] for x in labels]

    return tokenized_input['input_ids'], tokenized_input['token_type_ids'], tokenized_input['seq_len'], tokenized_input['labels']

 

 

0
收藏
回复
全部评论(3)
时间顺序
十进制到二进制
#2 回复于2022-02

max_seq_len最长只支持512。是因为bert预训练模型就只支持512,你可以通过自定义模型和数据读取的办法训练更长的数据。或者沿用预训练模型,但对输入进行切分。注意的是,512是论文中为了平衡效率和性能,并没有特别的理论证明。

0
回复
鬼影冰魂
#3 回复于2022-03
max_seq_len最长只支持512。是因为bert预训练模型就只支持512,你可以通过自定义模型和数据读取的办法训练更长的数据。或者沿用预训练模型,但对输入进行切分。注意的是,512是论文中为了平衡效率和性能,并没有特别的理论证明。
展开

好的,十分感谢,处理方法我了解了,我再问个问题哈,如果只是512个文本,那么前后文关系模型该如何识别呢? 比如我这个数据中前面512的文本有信息影响了后面512的文本信息,这种会不会导致存在部分结果的错误隐患。

0
回复
十进制到二进制
#4 回复于2022-03
好的,十分感谢,处理方法我了解了,我再问个问题哈,如果只是512个文本,那么前后文关系模型该如何识别呢? 比如我这个数据中前面512的文本有信息影响了后面512的文本信息,这种会不会导致存在部分结果的错误隐患。
展开

影响肯定会有一点,但是不会太多,首先512是作者实验的结果,其次,你想本来训练的数据最长就是512,你非要塞1024进去。模型肯定也只能学到两个512的特征。但是有个改进办法,你搞个512的滑窗,在你的数据上滑一遍然后求平均。当然最好就是自己重新训练。

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户