如何将微调后的西班牙语RoBERTa模型用于推特情感分析预测?
如何用微调后的西班牙语RoBERTa模型做情感分析预测
嘿,你已经把模型微调得相当出色了——训练准确率一路涨到97%,这结果太赞了!接下来我会一步步教你两种常用的预测方法,帮你给爬取的推特生成情感标签。
第一步:先把模型和Tokenizer一起保存(关键!)
你之前只保存了模型,但Tokenizer是预处理文本必不可少的部分,最好把它和模型存在同一个文件夹里,这样后续加载会非常方便:
from transformers import AutoTokenizer # 加载训练时用的Tokenizer tokenizer = AutoTokenizer.from_pretrained("BSC-TeMU/roberta-base-bne") # 和模型保存在同一个目录下 tokenizer.save_pretrained('Twitter_Roberta_Model')
执行完后,你的Twitter_Roberta_Model文件夹里会有这些文件:config.json、tf_model.h5(模型权重)、tokenizer_config.json、vocab.json等Tokenizer相关文件,它们都在你当前运行代码的工作目录里(Colab的话默认是/content/Twitter_Roberta_Model)。
方法一:直接用模型进行推理(灵活可控)
这种方法适合需要自定义预处理或后处理逻辑的场景,步骤很清晰:
1. 加载保存的模型和Tokenizer
from transformers import TFAutoModelForSequenceClassification, AutoTokenizer # 从保存的文件夹加载模型和Tokenizer loaded_model = TFAutoModelForSequenceClassification.from_pretrained('Twitter_Roberta_Model') loaded_tokenizer = AutoTokenizer.from_pretrained('Twitter_Roberta_Model')
2. 预处理文本并预测
注意:预处理的参数(padding、truncation、max_length)必须和你训练时的设置完全一致,否则预测结果会失真。
import tensorflow as tf # 先定义你的标签映射(要和训练时的类别顺序完全对应!) # 比如你训练时0=负面,1=中性,2=正面,就这么写 label_mapping = {0: "负面", 1: "中性", 2: "正面"} # 单条推特预测示例 tweet = "¡Este concierto fue absolutamente espectacular!" # 预处理文本:转换成模型能接受的张量格式 inputs = loaded_tokenizer( tweet, return_tensors="tf", # 返回TensorFlow张量 padding=True, truncation=True, max_length=128 # 替换成你训练时用的max_length ) # 模型输出的是logits(未归一化的分数) logits = loaded_model(inputs)[0] # 用softmax把logits转换成概率 probabilities = tf.nn.softmax(logits, axis=1).numpy()[0] # 找到概率最高的类别ID predicted_id = tf.argmax(probabilities).numpy() # 映射到最终标签 predicted_label = label_mapping[predicted_id] print(f"推特内容: {tweet}") print(f"预测情感: {predicted_label}") print(f"各情感概率: {dict(zip(label_mapping.values(), probabilities.round(4)))}")
批量预测多条推特
如果要处理大量爬取的推特,批量处理效率更高:
# 假设这是你爬取的推特列表 tweets = [ "No me gusta nada este servicio, muy malo.", "El nuevo teléfono tiene buenas características pero el precio es alto.", "¡Hoy es el mejor día de mi vida!" ] # 批量预处理文本 batch_inputs = loaded_tokenizer( tweets, return_tensors="tf", padding=True, truncation=True, max_length=128 ) # 批量预测 batch_logits = loaded_model(batch_inputs)[0] batch_probabilities = tf.nn.softmax(batch_logits, axis=1).numpy() # 遍历结果 for idx, tweet in enumerate(tweets): predicted_id = tf.argmax(batch_probabilities[idx]).numpy() predicted_label = label_mapping[predicted_id] print(f"\n推特: {tweet}") print(f"预测标签: {predicted_label}") print(f"概率分布: {dict(zip(label_mapping.values(), batch_probabilities[idx].round(4)))}")
方法二:用Hugging Face Pipeline(简洁高效)
Pipeline是Hugging Face提供的高层API,能帮你省去很多重复代码,非常适合快速部署:
from transformers import pipeline # 创建情感分析Pipeline classifier = pipeline( "sentiment-analysis", model='Twitter_Roberta_Model', # 直接用保存的模型文件夹路径 tokenizer='Twitter_Roberta_Model', return_all_scores=True, # 可选,返回所有类别的概率 function_to_apply="softmax", # 把模型输出的logits转换成概率 labels=["负面", "中性", "正面"] # 必须和训练时的类别顺序一致! ) # 单条预测 result = classifier("¡Este concierto fue absolutamente espectacular!") print(result) # 批量预测 results = classifier(tweets) for tweet, res in zip(tweets, results): # 找到概率最高的结果 top_result = max(res, key=lambda x: x['score']) print(f"\n推特: {tweet}") print(f"预测标签: {top_result['label']},概率: {top_result['score'].round(4)}")
关于你遇到的小疑问
- 模型保存位置:
model.save_pretrained('Twitter_Roberta_Model')会在你当前的工作目录下创建这个文件夹。如果是在Colab里,你可以用!ls命令查看,或者通过左侧文件面板找到它。 - 训练时的警告:那些警告是完全正常的——因为你从PyTorch预训练模型转成TensorFlow模型,
position_ids这类权重在TensorFlow里不需要,而分类头的权重是新初始化的(这正是微调要做的事),所以不用在意。
内容的提问来源于stack exchange,提问作者LeLuc




