Spaces:
Sleeping
Sleeping
| """ | |
| 快速测试情绪分析模型效果 | |
| 对比规则引擎和微调模型 | |
| """ | |
| import sys | |
| import os | |
| from pathlib import Path | |
| # 添加项目路径 | |
| project_root = Path(__file__).parent.parent | |
| sys.path.insert(0, str(project_root)) | |
| # 设置环境变量,避免模块导入问题 | |
| os.environ['PYTHONPATH'] = str(project_root) | |
| # 导入必要的模块 | |
| import paddle | |
| from paddlenlp.transformers import AutoModelForSequenceClassification, AutoTokenizer | |
| class SentimentModelTester: | |
| """情绪模型测试器""" | |
| def __init__(self, model_path: str): | |
| """初始化模型""" | |
| print(f"加载模型: {model_path}") | |
| self.tokenizer = AutoTokenizer.from_pretrained(model_path) | |
| self.model = AutoModelForSequenceClassification.from_pretrained(model_path) | |
| self.model.eval() | |
| self.label_map = {0: 'positive', 1: 'neutral', 2: 'negative'} | |
| def predict(self, text: str) -> dict: | |
| """预测单条文本""" | |
| encoded = self.tokenizer( | |
| text, | |
| max_length=128, | |
| padding='max_length', | |
| truncation=True, | |
| return_tensors='pd' | |
| ) | |
| with paddle.no_grad(): | |
| logits = self.model( | |
| encoded['input_ids'], | |
| token_type_ids=encoded['token_type_ids'] | |
| ) | |
| probs = paddle.nn.functional.softmax(logits, axis=1).numpy()[0] | |
| pred_id = int(probs.argmax()) | |
| return { | |
| 'text': text, | |
| 'emotion': self.label_map[pred_id], | |
| 'confidence': float(probs[pred_id]), | |
| 'probabilities': { | |
| self.label_map[i]: float(prob) | |
| for i, prob in enumerate(probs) | |
| }, | |
| 'method': 'finetuned_model' | |
| } | |
| def rule_based_sentiment(text: str) -> dict: | |
| """基于规则的情绪分析(简化版)""" | |
| positive_keywords = ['好', '满意', '喜欢', '谢谢', '感谢', '可以', '行', '没问题', | |
| '支持', '理解', '配合', '接受', '认可', '专业', '高效'] | |
| negative_keywords = ['不', '没', '不行', '不好', '讨厌', '烦', '生气', '愤怒', | |
| '不满', '投诉', '举报', '错误', '失败', '拒绝', '反对'] | |
| pos_count = sum(1 for kw in positive_keywords if kw in text) | |
| neg_count = sum(1 for kw in negative_keywords if kw in text) | |
| if pos_count > neg_count: | |
| emotion = 'positive' | |
| confidence = min(0.9, 0.6 + pos_count * 0.1) | |
| elif neg_count > pos_count: | |
| emotion = 'negative' | |
| confidence = min(0.9, 0.6 + neg_count * 0.1) | |
| else: | |
| emotion = 'neutral' | |
| confidence = 0.5 | |
| return { | |
| 'emotion': emotion, | |
| 'confidence': confidence, | |
| 'method': 'rule_engine' | |
| } | |
| def main(): | |
| """主测试函数""" | |
| # HR场景测试用例 | |
| test_cases = [ | |
| # 积极情绪 | |
| ("好的,谢谢你的帮助,非常满意!", "positive"), | |
| ("没问题,我理解公司的规定", "positive"), | |
| ("太好了,感谢你的解答", "positive"), | |
| ("流程很规范,我很认可", "positive"), | |
| ("专业高效的回复,感谢支持", "positive"), | |
| # 中性情绪 | |
| ("您好,请问有什么可以帮您?", "neutral"), | |
| ("请问申请年假需要什么材料", "neutral"), | |
| ("我需要了解培训的具体时间", "neutral"), | |
| ("好的,我知道了", "neutral"), | |
| ("请问还有什么需要补充的吗", "neutral"), | |
| # 消极情绪 | |
| ("我对这个处理结果很不满意", "negative"), | |
| ("这个制度太不合理了,我很生气", "negative"), | |
| ("为什么要强制执行这个规定", "negative"), | |
| ("你们的做法让我很失望", "negative"), | |
| ("我要投诉这个处理方式", "negative"), | |
| ] | |
| print("=" * 80) | |
| print("情绪分析模型对比测试") | |
| print("=" * 80) | |
| # 检查模型是否存在 | |
| model_path = project_root / "models" / "sentiment-hr" / "final_model" | |
| if not model_path.exists(): | |
| print(f"\n错误: 微调模型不存在于 {model_path}") | |
| print("仅测试规则引擎\n") | |
| model_tester = None | |
| else: | |
| print(f"\n加载微调模型: {model_path}") | |
| try: | |
| model_tester = SentimentModelTester(str(model_path)) | |
| except Exception as e: | |
| print(f"加载模型失败: {e}") | |
| print("仅测试规则引擎\n") | |
| model_tester = None | |
| # 测试规则引擎 | |
| print("\n【方法1: 规则引擎】") | |
| print("-" * 80) | |
| correct_rule = 0 | |
| for text, expected in test_cases: | |
| result = rule_based_sentiment(text) | |
| predicted = result['emotion'] | |
| confidence = result.get('confidence', 0) | |
| method = result.get('method', 'unknown') | |
| status = "✓" if predicted == expected else "✗" | |
| if predicted == expected: | |
| correct_rule += 1 | |
| print(f"{status} {text[:35]:35} -> {predicted:8} (期望: {expected:8}) 置信度: {confidence:.2f} 方法: {method}") | |
| accuracy_rule = correct_rule / len(test_cases) * 100 | |
| print(f"\n准确率: {correct_rule}/{len(test_cases)} = {accuracy_rule:.1f}%") | |
| # 测试微调模型 | |
| if model_tester: | |
| print(f"\n【方法2: 微调模型】") | |
| print("-" * 80) | |
| correct_finetuned = 0 | |
| for text, expected in test_cases: | |
| result = model_tester.predict(text) | |
| predicted = result['emotion'] | |
| confidence = result.get('confidence', 0) | |
| method = result.get('method', 'unknown') | |
| status = "✓" if predicted == expected else "✗" | |
| if predicted == expected: | |
| correct_finetuned += 1 | |
| print(f"{status} {text[:35]:35} -> {predicted:8} (期望: {expected:8}) 置信度: {confidence:.2f} 方法: {method}") | |
| accuracy_finetuned = correct_finetuned / len(test_cases) * 100 | |
| print(f"\n准确率: {correct_finetuned}/{len(test_cases)} = {accuracy_finetuned:.1f}%") | |
| # 对比提升 | |
| improvement = accuracy_finetuned - accuracy_rule | |
| print(f"\n相比规则引擎提升: {improvement:+.1f}%") | |
| # 总结 | |
| print("\n" + "=" * 80) | |
| print("总结") | |
| print("=" * 80) | |
| print(f"规则引擎准确率: {accuracy_rule:.1f}%") | |
| if model_tester: | |
| print(f"微调模型准确率: {accuracy_finetuned:.1f}%") | |
| print(f"性能提升: {improvement:+.1f}%") | |
| print("=" * 80) | |
| if __name__ == "__main__": | |
| main() | |