NER任务

#1
by JaheimLee - opened

Hi,千问词表会把很多中英文变成utf8编码,这种情况下还能进行tokenclassification的任务吗

实测问题不大,同样数据集上的任务表现要比 xlm-roberta 还要好一点,毕竟模型本来就是只认 token 不认字的

可以参考训练脚本中的这段代码将其还原为明文:

def print_dataset_sample(tokenizer: PreTrainedTokenizerFast, dateset: Dataset, id2label: dict) -> None:
    if len(dateset) == 0:
        return

    labels = dateset[0].get("labels")
    input_ids = dateset[0].get("input_ids")
    input_tokens = tokenizer.batch_decode(input_ids)
    attention_mask = dateset[0].get("attention_mask")
    special_tokens_mask = dateset[0].get("special_tokens_mask")

    print(f"{"tokens":<8}\t\t{"labels":<4}\t\t{"ids":<4}\t\t{"attention":<8}\t\t{"special_mask":<6}")
    for x, y, z, a, b in zip(input_tokens, labels, input_ids, attention_mask, special_tokens_mask):
        print(f"{x:<8}\t\t{id2label.get(y):<4}\t\t{z:<4}\t\t{a:<8}\t\t{b:<6}")

这个问题主要在于边界错误,比如文本是“abcde”,实体是"cd",但”bcde“是一个token,标注只有”cd“在文本中的index,这个可以还原吗

这个问题主要在于边界错误,比如文本是“abcde”,实体是"cd",但”bcde“是一个token,标注只有”cd“在文本中的index,这个可以还原吗

后面提到的这个问题与主楼中提到的问题没有关系。

  • 主楼问题的实质
    • 词表构成的最小单位是 字符 还是 字节,在字符级别词表中,分拆的最小单位是一个汉字,而在字节级别词表中,单个汉字还可以继续分拆为多个字符,除此之外,他们没什么区别。
  • 下面问题的实质
    • 实际分词时是否可以按照业务需求期望的方式分割词语边界,对于中文而言,分词的方式主要是两种:
      • 1、词表中只包含所有单个汉字的字符,这样理论上可以 100% 精确的分割词语边界,这也是原版多语言版本 Bert 中对中文的处理方案,但是实际上这没有意义,因为词表中根本不存在“词语”的概念,那自然“词语的边界”也没有意义,现在已经没有主流模型还在使用这套方案了;
      • 2、子词级别分词,即在第一种方案的基础上,将一些常用的字符或字节组合(即子词)也加入到词表,在分词时优先使用子词,这样做的好处就是模型的性能会显著的提升,坏处就是这样就会导致你描述的问题,但是一份合理的词表可以让好处远大于坏处,所以这是目前主流的方式,不论是Qwen系列的字节级别词表,还是xlm-robert的字符级别词表,事实上都是这种方案,区别只是分割的最小单位不同。
    • 这也是为什么我没有自己训练词表而是字节采用了qwen词表的原因 -- 相对于个人能使用的数据资源,还是经受考验的主流模型的词表可以提供更好的性能。通过提升词表的大小或者直接在目标领域的文本上训练词表理论上提升分词的准确性,但是这就是一个空间和算力换性能的问题了,如果你不准备自己从头开始训练,那讨论这个没什么意义
JaheimLee changed discussion status to closed

Sign up or log in to comment