基于XLNet模型的情感分析实践
情感分析技术原理
情感分析通过自然语言处理技术识别文本中的情绪倾向,在商业决策和舆情监控中具有重要价值。XLNet作为先进的预训练模型,采用置换语言建模策略,通过双流注意力机制捕捉长距离语义依赖,在情感分类任务中表现出色。
环境配置与数据准备
# 安装依赖库
!pip install transformers torch pandas
# 示例数据集
sentiment_data = [
{'content': '产品体验超出预期,强烈推荐', 'sentiment': 1},
{'content': '质量差劲,完全不值这个价格', 'sentiment': 0}
]
模型加载与预处理
from transformers import XLNetTokenizer, XLNetForSequenceClassification
# 初始化模型组件
text_tokenizer = XLNetTokenizer.from_pretrained('xlnet-base-cased')
sentiment_model = XLNetForSequenceClassification.from_pretrained('xlnet-base-cased')
# 文本编码处理
text_samples = [item['content'] for item in sentiment_data]
encoded_inputs = text_tokenizer(
text_samples,
padding=True,
truncation=True,
return_tensors='pt'
)
模型微调与评估
from torch.optim import AdamW
# 配置训练参数
model_optimizer = AdamW(sentiment_model.parameters(), lr=2e-5)
# 微调训练循环
sentiment_model.train()
for epoch in range(3):
model_outputs = sentiment_model(**encoded_inputs, labels=torch.tensor([d['sentiment'] for d in sentiment_data]))
loss = model_outputs.loss
loss.backward()
model_optimizer.step()
model_optimizer.zero_grad()
# 预测新样本
test_text = '服务周到,体验极佳'
test_encoding = text_tokenizer(test_text, return_tensors='pt')
prediction = torch.argmax(sentiment_model(**test_encoding).logits)
print('预测情感:', '正面' if prediction == 1 else '负面')
模型优化策略
超参数调整
# 最优超参数配置
optimal_params = {
'learning_rate': 3e-5,
'batch_size': 16,
'epochs': 4
}
注意力机制应用
# 可视化注意力权重
outputs = sentiment_model(**test_encoding, output_attentions=True)
attention_weights = outputs.attentions[0][0].detach().numpy()
生产环境部署
from flask import Flask, request
import torch
# 创建Web服务
app = Flask(__name__)
@app.route('/analyze', methods=['POST'])
def analyze_sentiment():
input_text = request.json['text']
inputs = text_tokenizer(input_text, return_tensors='pt')
with torch.no_grad():
logits = sentiment_model(**inputs).logits
return {'sentiment': torch.argmax(logits).item()}
实时分析实现
def realtime_analysis(input_string):
encoded_text = text_tokenizer(input_string, return_tensors='pt')
prediction = torch.argmax(sentiment_model(**encoded_text).logits)
return '积极' if prediction == 1 else '消极'
# 用户交互示例
user_input = "这款软件界面直观,功能强大"
print(realtime_analysis(user_input)) # 输出: 积极
