NLP实用小工具Tokenizer和pad_sequences进行文本的数字编码和长度填充或截断

本文介绍了如何使用Keras库中的Tokenizer和pad_sequences函数,实现文本数据的词汇编码和长度标准化,包括词ID生成、填充与截断操作,这对于NLP任务中的序列处理至关重要。

NLP任务中经常需要把词语转换成数字ID,然后又要统一文本长度,不够的填充0,多出的部分需要截断,keras里面自带了这样的功能模块如下。

from keras.preprocessing.sequence import pad_sequences
from keras.preprocessing.text import Tokenizer

具体使用效果如下

from keras.preprocessing.sequence import pad_sequences
from keras.preprocessing.text import Tokenizer

mx_length = 10#文本最大长度为10

text = [['我','爱','中国'],
     ['我','爱','科学'],
     ['深度','学习','很','有趣'],
     ['机器','学习','常见','的','模型','有','SVM']]
print('文本内容=')
print(text)
tokenizer=Tokenizer()  #创建一个Tokenizer对象
tokenizer.fit_on_texts(text)#直接读入文本进行词的ID获取
vocab=tokenizer.word_index #得到每个词的编号
x_train_word_ids=tokenizer.texts_to_sequences(text)#开始对text里面的每个汉字进行编号
print('编号结果=')
print(x_train_word_ids)
'''
padding='pre'表示从前面填充
padding='post'表示从后面填充
truncating='pre'表示从前面截断
truncating='post'表示从后面截断
'''
x_train_padded_seqs=pad_sequences(x_train_word_ids,maxlen=mx_length,padding='post',truncating='post') #将超过固定值的部分截掉,不足的用0填充
print('填充结果=')
print(x_train_padded_seqs)

运行结果
在这里插入图片描述

### 设置 `pad_token_id` 为 `eos_token_id: None` 的含义 在自然语言处理模型中,`pad_token_id` `eos_token_id` 是用于序列填充结束标记的重要参数。当 `pad_token_id` 被设置为 `eos_token_id: None` 时,这意味着不使用特定的结束符作为填充符号。 对于开放生成任务而言,这种配置意味着生成过程不会依赖于预定义的结束标志来终止生成序列[^1]。具体来说: - **无显式的结束标记**:由于 `eos_token_id` 设定为 `None`,模型无法识别何时应该停止生成新的 token。 - **影响生成长度控制**:这可能导致生成文本无限延续直到达到最大长度限制其他外部条件触发停止机制。 #### 对开放生成的影响 在这种情况下,生成行为会表现出如下特点: - **难以预测的输出长度**:因为缺乏明确的结束信号,每次运行可能会得到不同长度的结果,增加了结果多样性但也可能引入不必要的冗余信息。 - **潜在的质量下降风险**:如果生成过程中缺少有效的终止策略,则容易产生不合逻辑语义连贯性较差的内容片段。 为了更好地管理这种情况,在实际应用中通常建议设定合理的最大解码步数(max_length),并考虑采用其他方法如基于概率阈值提前截断等手段来改善最终效果。 ```python from transformers import AutoModelForCausalLM, AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("model_name") model = AutoModelForCausalLM.from_pretrained("model_name") # Set pad_token_id to eos_token_id which is None here. if tokenizer.eos_token_id is not None: model.config.pad_token_id = tokenizer.eos_token_id input_ids = tokenizer.encode("Your prompt text.", return_tensors='pt') output_sequences = model.generate( input_ids=input_ids, max_length=50, # Limit the maximum length of generated sequence ) print(tokenizer.decode(output_sequences[0], skip_special_tokens=True)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值