Transformer数据预处理(Tokenizer)的问题

加载数据报错‘expected sequence of length 4 at dim 1 (got 0)’

使用 transformer 将字符串转为 id 序列,字符串为中英文混杂形式,

运行中出现报错:'expected sequence of length 4 at dim 1 (got 0)'

发现是在encoder_plus转换时,将输入的文本根据max_length截断了,导致[MASK]等字段没剪除了,生成的 mask_pos (mask 在字符串中的位置)为空,这样在转为 Tensor 时产生了维度错误。

在预处理时,虽然通过设置的最大长度的对字符串做了筛选,但长度是通过空格split计算的,在encoder转换时,每个汉字对应一个id,英文(注:英文是单词或英文字符的拼接) 则根据vocab.txt中的词替换为 id,这样句长就会超过max_length,截断后会将最后的 [MASK] 删除。

解决方法:

        在预处理中用 encode 将字符串转为id序列,根据 id 序列长度及max_length过滤样本

BertTokenizer 中的 encoder、encode_plus 参数 truncation

        Sentence-Pair 分类任务中,遇到有关句子长度不一致的报错,可将 truncation设为'longest_first',这样就会依次删除较长句子的最后一个token,直到符合max_length的最大token数量为止。

        例如:设置句子最大长度是256,报错为最后一行显示不同的输入中,句子长度不一致问题。但在encode中已经设置了padding='max_length'和truncation=True,truncation=True 默认是only_first,仅对前面一句话做截断,不对后面一句做截断。当遇到sent1长度是50,sent2 长度是300的极端情况,使用“truncation=True”,总长度还是会超出256;truncation='longest_first' 会依次删除较长句子的最后一个token,直到符合 maxlength 的最大 token 数量为止(最新的tokenizer中True和longest_first已经等价了,暂未验证,Tokenizer (huggingface.co))

tokenizer时出现‘##’的词

Bert 有三个tokenizer:FullTokenizer,BasicTokenizer,WordpieceTokenizer;

FullTokenizer 会调用后面两个。
BasicTokenizer:清理特殊字符,去除控制符以及替换空白字符为空格,一些序列标注任务输入需要保持输入长度不变,否则标注无法对上,一般要么使用BasicTokenizer把原数据过一遍,再把标注对上,要么使用list方法代替 bert 的 tokenizer;中文分割:将中文每个汉字单独作为一个token
小写:可选,如果小写,还会对字符做做NFD标准化;标点符号分割:除中文汉字外,其它字符通过标点符号分割开
WordpieceTokenizer:对输入进行split,得到token列表,如果token的一部分在vocab中存在,就将token继续分割,分割后,除开第一部分,其它部分都会加上##,这就是wordpiece,例如visiable分割为:‘vi’, ‘##sia’, ‘##ble’,这个主要针对英文,但是在中文的全词mask,会利用这个特点,把一个词分割开,如“图书馆”分割为:图,#书,#馆
FullTokenizer:调用 BasicTokenizer 得到初步的token列表,对于token再用WordpieceTokenizer生成更细的token。

tokenizer 处理数据中的 attention_mask:多句子输入需要标准化,使其能够整齐划一的进行比较。如短句填充 padding 使其长度一致。由此产生的问题是训练时,模型不理解填充值,仍按照填充值计算,可能引入错误信息。为此,"attention_mask" 会告诉模型返回的数字编码中哪些是需要注意的实际数据,哪些是不需要关心的填充数据。

参考:

BERT句子对(sentence pair)分类任务的truncation='longest_first'之我见 - 知乎 (zhihu.com)

Bert中文vocab ##的作用_bert vocab_eryihahaha的博客-CSDN博客

Pytorch Transformer Tokenizer常见输入输出实战详解-CSDN博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 训练自己的 tokenizer 通常需要以下几个步骤: 1. 准备数据: 选择一些文本数据作为训练数据, 并将其按照一定的方式拆分成若干个 token, 例如将句子按照空格拆分成单词. 2. 选择模型: 选择一种适合你的任务的模型, 例如基于字符的模型或基于单词的模型. 3. 训练模型: 使用你准备的数据来训练你选择的模型, 例如使用机器学习框架训练神经网络. 4. 评估模型: 使用一些测试数据来评估你训练出来的模型的效果, 并根据评估结果调整模型的超参数或模型结构. 5. 使用模型: 使用你训练好的模型来处理新的文本数据, 将其拆分成 token. ### 回答2: 要训练自己的tokenizer,首先需要明确目标语言和领域。以下是一些步骤和技巧: 1. 收集数据:根据目标语言和领域,收集大量的文本数据。这些数据可以来自书籍、新闻、网站、社交媒体等各种来源。 2. 数据清洗:对收集到的文本数据进行清洗,去除无用的标记、特殊字符和HTML标签等,确保数据干净且符合需要。 3. 分词:使用分词工具对文本进行分词,将文本拆分成单个的词语或标记。可以尝试不同的分词工具或算法,选择最适合的方法。 4. 标记化:根据需要,将分词后的词语或标记进行进一步标记,例如词性标注、命名实体识别等。 5. 构建词汇表:将所有的词语或标记收集起来,构建词汇表。可以根据词频或其他标准对词汇表进行筛选,选择合适的词语。 6. 训练tokenizer:使用选定的算法和参数,训练tokenizer模型。可以使用机器学习算法(如朴素贝叶斯、条件随机场等)或神经网络模型(如循环神经网络、Transformer等)进行训练。 7. 优化和调试:对训练得到的tokenizer进行优化和调试,调整参数、算法或模型结构,以获得更好的性能。 8. 评估和验证:使用一部分独立的数据对训练得到的tokenizer进行评估和验证,检查其分词效果和准确性。 9. 迭代改进:根据评估和验证的结果,不断迭代改进tokenizer,修正错误并优化性能。 10. 应用和部署:将训练得到的tokenizer应用到实际任务中,比如文本分类、机器翻译、文本生成等。确保tokenizer在实际应用中的稳定性和可靠性。 通过上述步骤,可以训练自己的tokenizer,并根据实际需要进行定制化和改进,以提高文本处理的效果和准确性。 ### 回答3: 训练自己的tokenizer是一个复杂的任务,但可以通过以下步骤完成: 1. 收集训练数据:首先,您需要收集大量的文本数据作为训练材料。这些可以是各种类型的文本,包括新闻文章、小说、科技论文等。确保覆盖各种语言和主题。 2. 清洗和预处理数据:在训练tokenizer之前,必须对数据进行清洗和预处理。这包括去除标点符号、数字、html标签等,并将文本转换为统一的小写形式。您可以使用Python中的各种文本处理库和正则表达式来执行这些任务。 3. 构建词汇表:接下来,构建一个词汇表,将文本数据中的所有单词都收集起来。可以使用Python中的Counter或者其他计数方法来统计单词的频率,并选择适当的阈值来筛选出需要包含在词汇表中的单词。确保词汇表足够大且具有多样性。 4. 训练tokenizer:使用收集到的文本数据和词汇表,利用机器学习或深度学习技术,训练一个tokenizer模型。常见的tokenizer模型包括基于规则的tokenizer、n-gram模型和基于深度学习的tokenizer模型,如BERT、GPT等。根据自己的需求和数据规模选择适合的模型。 5. 评估tokenizer性能:在训练完成后,使用一些测试数据来评估tokenizer的性能。您可以使用一些标准的性能指标,如准确率、召回率和F1分数等。通过评估结果,可以进一步优化tokenizer的效果。 6. 部署tokenizer:当tokenizer达到您的期望性能后,将其部署到实际应用中。您可以将tokenizer模型集成到自己的应用程序中,以便实时处理文本数据。 总而言之,训练自己的tokenizer是一个需要经验和技术的过程。其中关键的步骤包括数据收集、预处理、构建词汇表、训练模型和性能评估。经过反复优化和调整,您可以构建一个高性能的tokenizer来处理各种文本数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值