如何迭代DataFrame的final_tweet列,用预训练模型批量实现情感分析
问题原因
你之前的代码存在两个核心问题:
- 直接传入pandas的Series列时,没有设置截断、填充参数,tokenizer无法处理长度不一致的文本序列,会直接报错
- 输出结果取
output[0][0]仅能获取单条文本的预测分数,不匹配批量输入的输出维度,无法拿到所有样本的结果
方案1:小数据集逐行处理
如果你的数据集规模不大(万条以内),直接用apply逐行调用单条推理逻辑即可,代码改动最小:
import pandas as pd def get_sentiment(text): encoded_input = tokenizer(text, return_tensors='pt', truncation=True, max_length=512) output = model(**encoded_input) scores = output[0][0].detach().numpy() scores = softmax(scores) # 获取最高置信度的情感分类和对应分数 ranking = np.argsort(scores)[::-1] top_label = config.id2label[ranking[0]] top_score = round(float(scores[ranking[0]]), 4) # 若需要返回三类情感的全部分数,可修改return为 [round(float(scores[0]),4), round(float(scores[1]),4), round(float(scores[2]),4)] 对应negative/neutral/positive return top_label, top_score # 给原数据集新增两列存储情感结果 df[['sentiment_label', 'sentiment_score']] = df['final_tweet'].apply(lambda x: pd.Series(get_sentiment(x)))
方案2:大数据集批量高效处理
如果数据量较大,建议分批次输入模型,减少IO开销提升推理速度:
from tqdm import tqdm text_list = df['final_tweet'].tolist() batch_size = 16 # 可根据你的显存大小调整批次大小 sentiment_labels = [] sentiment_scores = [] for i in tqdm(range(0, len(text_list), batch_size)): batch_text = text_list[i:i+batch_size] # 批量编码,统一开启填充和截断 encoded_input = tokenizer( batch_text, return_tensors='pt', padding=True, truncation=True, max_length=512 ) output = model(**encoded_input) # 按行计算softmax,得到批次内所有样本的情感分数 batch_scores = softmax(output[0].detach().numpy(), axis=1) # 处理批次内每条样本的结果 for s in batch_scores: ranking = np.argsort(s)[::-1] sentiment_labels.append(config.id2label[ranking[0]]) sentiment_scores.append(round(float(s[ranking[0]]), 4)) # 把结果写入原数据集 df['sentiment_label'] = sentiment_labels df['sentiment_score'] = sentiment_scores
内容的提问来源于stack exchange,提问作者coding
相关产品推荐
相关产品推荐

