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
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
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