使用Hugging Face对DataFrame文本分词后列值为空的解决方法
问题原因与解决方案
你的代码核心问题是:tokenizer处理文本列表后返回的是字典结构(包含input_ids、attention_mask等键,每个键对应一个长度等于样本数的列表),而pandas无法直接将这种字典赋值给单个列,导致生成的Tokenized_Text列无法正确加载数据,表现为空值。
修正方案
方案1:提取分词后的原始tokens存入列
如果你需要的是可读的分词文本列表,可以这样修改代码:
import pandas as pd from transformers import AutoTokenizer df = pd.read_csv('subject_messages.csv') # 先处理可能的空文本,避免分词报错 df["Message"] = df["Message"].fillna("") model_ckpt = "dccuchile/bert-base-spanish-wwm-uncased" tokenizer = AutoTokenizer.from_pretrained(model_ckpt) # 批量分词并提取tokens tokenized_output = tokenizer(df["Message"].to_list(), padding=False, truncation=True) # 将每个样本的input_ids解码为tokens df["Tokenized_Text"] = [tokenizer.decode(ids, skip_special_tokens=True).split() for ids in tokenized_output["input_ids"]] df.to_csv("tokenized_telegram_messages.csv", index=False)
方案2:保留完整分词输出(拆分多列)
如果需要保留tokenizer输出的全部信息(比如input_ids、attention_mask),可以将字典的每个键转为单独的列:
import pandas as pd from transformers import AutoTokenizer df = pd.read_csv('subject_messages.csv') df["Message"] = df["Message"].fillna("") model_ckpt = "dccuchile/bert-base-spanish-wwm-uncased" tokenizer = AutoTokenizer.from_pretrained(model_ckpt) tokenized_output = tokenizer(df["Message"].to_list(), padding=False, truncation=True) # 将字典的每个键转为DataFrame的列 for key, value in tokenized_output.items(): df[key] = value df.to_csv("tokenized_telegram_messages.csv", index=False)
额外注意事项
- 必须处理DataFrame中的空文本(用
fillna("")),否则分词器遇到NaN会抛出异常,间接导致列值异常。 - 加上
padding=False和truncation=True可以避免因文本长度不一致导致的批量处理问题,确保每个样本的分词结果独立。
内容的提问来源于stack exchange,提问作者Mark Davidson
相关产品推荐
相关产品推荐

