Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

出现wordPiece应该怎么办? #9

Open
yysirs opened this issue Jan 11, 2021 · 13 comments
Open

出现wordPiece应该怎么办? #9

yysirs opened this issue Jan 11, 2021 · 13 comments

Comments

@yysirs
Copy link

yysirs commented Jan 11, 2021

这样导致原本的word和token之间对应不上。

@hertz-pj
Copy link
Owner

理论上按照我的预处理方法处理出的数据应该不会有wordPiece出现,实在什么情况出现的该问题呢。

@Daniel19960601
Copy link

理论上按照我的预处理方法处理出的数据应该不会有wordPiece出现,实在什么情况出现的该问题呢。

您好,我在用英文数据集跑的时候会出现这样的问题,请问该如何解决?谢谢你。

@yysirs
Copy link
Author

yysirs commented Feb 25, 2021

在train的时候不去管他,在test的时候,如果有wordPiece出现,只保留第一个词。这样保证词的数量不变

@yysirs
Copy link
Author

yysirs commented Feb 25, 2021

if mode == "test" and len(token) > 1:
token = token[0]

@Daniel19960601
Copy link

if mode == "test" and len(token) > 1:
token = token[0]

您好,感谢回复。
可能是我描述不到位,我遇到的问题是:
数据集使用的Conll2003,Bert模型使用的是bert-base-cased。运行时出现如下错误:

File "D:\python-workspace\BERT-BiLSTM-CRF-NER-pytorch-master\utils.py", line 162, in convert_examples_to_features
assert len(ori_tokens) == len(ntokens), f"{len(ori_tokens)}, {len(ntokens)}, {ori_tokens}, {ntokens}"
AssertionError: 3, 8, ['[CLS]', '-DOCSTART-', '[SEP]'], ['[CLS]', '-', 'do', '##cs', '##tar', '##t', '-', '[SEP]']

可见,是tokenizer将单词切分了,导致assert len(ori_tokens) == len(ntokens)不能通过,请问如何解决?感谢您。

@yysirs
Copy link
Author

yysirs commented Mar 4, 2021

不好意思,之前没看到。
在train的时候,就是不考虑是否和之前的句子长度是否一样长,所以可以删掉你的这个assert。
在test的时候为了保证标签的输出一致,所以我只考虑了第一个分词

@Daniel19960601
Copy link

Daniel19960601 commented Mar 16, 2021

不好意思,之前没看到。
在train的时候,就是不考虑是否和之前的句子长度是否一样长,所以可以删掉你的这个assert。
在test的时候为了保证标签的输出一致,所以我只考虑了第一个分词

只保留第一个分词不会影响模型的预测结果吗?

@yysirs
Copy link
Author

yysirs commented Mar 17, 2021

可以尝试一下这样的做法。个人认为影响不是太大

@Daniel19960601
Copy link

Daniel19960601 commented Mar 17, 2021

可以尝试一下这样的做法。个人认为影响不是太大

好,我尝试一下,感谢您的回复。
您也是用英文数据的时候出现的这个情况吗?

@Daniel19960601
Copy link

if mode == "test" and len(token) > 1:
token = token[0]

只考虑第一个好像需要 token = [token[0]], 否则后面在for m in range(len(token)):还是会分开 🙂

@altctrl00
Copy link

altctrl00 commented Aug 26, 2021

我刚好也碰到这个问题,做英文ner,用wordpiece方法分词,就以[['[CLS]', '-', 'do', '##cs', '##tar', '##t', '-', '[SEP]']为例,我喂给bert的数据集features里tag_id是就只给第一个子词'do'原来’-docstart-‘的标签,其他的词用比如-100代替?那crf层的数据输入中mask也许要屏蔽掉除第一个字词的其他词嘛,输出结果又会是什么样的呢。

@altctrl00
Copy link

我刚好也碰到这个问题,做英文ner,用wordpiece方法分词,就以[['[CLS]', '-', 'do', '##cs', '##tar', '##t', '-', '[SEP]']为例,我喂给bert的数据集features里tag_id是就只给第一个子词'do'原来’-docstart-‘的标签,其他的词用比如-100代替?那crf层的数据输入中mask也许要屏蔽掉除第一个字词的其他词嘛,输出结果又会是什么样的呢。

我翻了下pytorch-crf源码 它的input_mask中所有的padding只在右边,所以就会是错误的

@hertz-pj
Copy link
Owner

我刚好也碰到这个问题,做英文ner,用wordpiece方法分词,就以[['[CLS]', '-', 'do', '##cs', '##tar', '##t', '-', '[SEP]']为例,我喂给bert的数据集features里tag_id是就只给第一个子词'do'原来’-docstart-‘的标签,其他的词用比如-100代替?那crf层的数据输入中mask也许要屏蔽掉除第一个字词的其他词嘛,输出结果又会是什么样的呢。

我翻了下pytorch-crf源码 它的input_mask中所有的padding只在右边,所以就会是错误的

之前确实没有考虑word piece的问题。这里我建议可能如果是word piece后的结果,也按照第一个开头的token标B,其他标注为I来进行标注,貌似比用-100合理一些,可以做实验验证一下。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants