xlxwalex / FCGEC

The Corpus & Code for EMNLP 2022 paper "FCGEC: Fine-Grained Corpus for Chinese Grammatical Error Correction" | FCGEC中文语法纠错语料及STG模型
https://aclanthology.org/2022.findings-emnlp.137
Apache License 2.0
104 stars 12 forks source link

数据处理错误 raise Exception("Error combinition.") #30

Closed canghaiyunfan closed 10 months ago

canghaiyunfan commented 10 months ago

{'original_text': '请在听到bi声后留言。', 'correct_text': '请在听到“di”声后留言。'}

这个样本在处理时会引发 Error combinition in https://github.com/xlxwalex/FCGEC/blob/447be64dec538a6457fd301a10905f02e7b6f217/model/STG-correction/utils/data_utils.py#L18C1-L19C1

insert_label = [-1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1] modify_label = [-1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1]

xlxwalex commented 10 months ago

感觉是标点或英文的问题,可以把JoinntDataset的_process_tagger中的label_comb变量debug看一下,因为Tokenizer主要针对中文,英文的对齐可能会有问题,也可能会直接被当作UNK。

canghaiyunfan commented 10 months ago

打印了一下对应的label_comb 变量,具体值如下,我对这套规则还不太熟系,麻烦作者看下哪里有问题,从代码看的话是insert和modify 出现在同一位置,这种情况是不允许的吗还是其他原因。

'tagger': ['K', 'K', 'K', 'K', 'K', 'MI', 'K', 'K', 'K', 'K', 'K', 'K'] 'mask_label': {5: [100, 146]} 'ins_label': [-1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1] 'mod_label': [-1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1]

xlxwalex commented 10 months ago

打印了一下对应的label_comb 变量,具体值如下,我对这套规则还不太熟系,麻烦作者看下哪里有问题,从代码看的话是insert和modify 出现在同一位置,这种情况是不允许的吗还是其他原因。

'tagger': ['K', 'K', 'K', 'K', 'K', 'MI', 'K', 'K', 'K', 'K', 'K', 'K'] 'mask_label': {5: [100, 146]} 'ins_label': [-1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1] 'mod_label': [-1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1]

可以再看一下token = self.tokenizer.tokenize(TextWash.punc_wash(sentences[idx]))的debug结果吗

canghaiyunfan commented 10 months ago

对应结果: ['请', '在', '听', '到', 'bi', '声', '后', '留', '言', '。']

xlxwalex commented 10 months ago

因为你没有给Label,感觉是Label给的不对,应该是类似

[{\"Modify\":[{\"pos\":4,\"tag\":\"MOD_1+INS_2\",\"label\":\“di”\"}]}]

这样的,你的标注应该是InsertModify对同一个位置做操作了,可以检查一下Label

canghaiyunfan commented 10 months ago

label 是通过你提供的convert_seq2seq_to_operation.py 脚本生成的,结果如下 {'Insert': [{'pos': 5, 'tag': 'INS_1', 'label': '”'}], 'Modify': [{'pos': 4, 'tag': 'MOD_1+INS_1', 'label': '“d'}]}

原始样本如下: {'original_text': '请在听到bi声后留言。', 'correct_text': '请在听到“di”声后留言。'}

xlxwalex commented 10 months ago

看起来问题出在对齐上,我们的程序对英文支持确实不够好。在utils/convertor.py_convert_tagger_lm中,我们会做一下简单对齐,你如果看返回的post_ops可能就是插入和修改都在5号位置上做了,遇到这种情况可能只能手工调整Label了

canghaiyunfan commented 10 months ago

了解,感谢作者!我发现不光英语,在包含韩语,日语以及表情包的数据上也无法处理。

xlxwalex commented 10 months ago

是这样的,主要也是Token和字符不太一样,对齐的规则比较复杂,我们简化处理了(因为对中文来说基本上一个字就是一个Token,可能未来工作可以再做一些更细致的处理)