Replies: 1 comment 3 replies
-
和huggingface的策略保持一致的话有没有什么不足呢? |
Beta Was this translation helpful? Give feedback.
3 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
Abstract
Token Classification任务本质上是一个序列标注的任务,主要是给文本中的token打上不同的标签。可是不同的分词工具对文本的词切分情况不一致,其中就包括将一个词切成多个subword的情况,例如:"2019" -> ["20", "##19"],此时2019对应的标签B/I/O需要如何变化?在解码器(如CRF)中是否需要计算["20", "##19"]两个token的损失?还是只需要计算第一个?这个RFC我们就来讨论讨论这些问题。
Problem
在Token Classification的任务当中,tokens和labels的长度必须是一致的,可是存在一些情况会导致其不一致:
当数据集中已经给出tokens和labels的数据,如tokens=["I", "love", "\xa0", "chinaaaaa"] , labels = ["O", "O", "O", "B"]
当token经过tokenizer之后,由于\0ax会变成空字符串,
chinaaaaa
会变成china, ##a, ##a, ##a, ##a等token,这个时候就会出现问题.在以上例子当中,总结而言有三个问题:
\xa0
(空格字符)在经过tokenizer之后会判定为空哥被删掉。Solution
针对于以上面临的三个问题,在此我给出以下解决方案,在座的小伙伴们也可以一起来贡献出自己的思考。
问题一:无效字符被删除
最简单的做法就是无视,直接删掉即可。可是在实际的项目当中,有时候需要将结果对齐原始文本中的字符,此时如果删掉了token在计算上而言会比较麻烦。不过也是可以通过offset mapping来解决。所以,优点是简单粗暴,缺点是后处理麻烦。
保守一点的做法就是保留。可是这类的特殊字符如果仍然保留需要被处理成来处理,所以在文本语义上的计算会造成一定的干扰,最后导致文本的预测效果不太好。优点是:后处理稍微简单点,缺点是容易影响语义计算。
针对于此问题,我个人的看法是支持第一个方法。
问题二:sub-tokens的标签重复规则
由于解码阶段有不同的解码策略,如BIO、BIOSE、IOB、BILOU、BMEWO、BMEWO等,是不是眼花缭乱。那针对于不同的解码策略可能需要处理的方法不一样。
最简单粗暴的方法就是:直接将sub-tokens的标签重复n-1次。然后在计算标签损失的时候,将这些重复的标签给忽略掉,所以需要有一个logit mask的向量。
问题三:重复的标签计算
就像在上面提到的,重复的标签只需要使用logit-mask来忽略对应的计算即可,当然这种方法也是借鉴huggingface transformer的处理方法。
References
欢迎各位参与到此讨论当中来。
Beta Was this translation helpful? Give feedback.
All reactions