File size: 4,679 Bytes
d22f4ca
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""

Emotion Summary Model - 推理示例

"""

from transformers import MT5ForConditionalGeneration, MT5Tokenizer
import json
import torch

def load_model(model_path="./emotion_summary"):
    """加载模型和tokenizer"""
    print(f"Loading model from {model_path}...")
    model = MT5ForConditionalGeneration.from_pretrained(model_path)
    tokenizer = MT5Tokenizer.from_pretrained(model_path)
    
    # 如果有GPU就使用GPU
    device = "cuda" if torch.cuda.is_available() else "cpu"
    model = model.to(device)
    model.eval()
    
    print(f"Model loaded on {device}")
    return model, tokenizer, device

def summarize_case(model, tokenizer, device, case_data, field="cause"):
    """

    对案例进行总结

    

    Args:

        model: 模型

        tokenizer: tokenizer

        device: 设备

        case_data: 案例数据(字典)

        field: 要生成的字段 (cause/symptoms/treatment_process/illness_characteristics/treatment_effect)

    

    Returns:

        生成的总结文本

    """
    
    # 构建输入
    case_desc = " ".join(case_data.get("case_description", []))
    consultation = " ".join(case_data.get("consultation_process", []))
    reflection = case_data.get("experience_and_reflection", "")
    
    full_text = f"Case: {case_desc}\nConsultation: {consultation}\nReflection: {reflection}"
    
    # 根据字段构建不同的prompt
    prompts = {
        "cause": f"Extract cause from: {full_text}",
        "symptoms": f"Extract symptoms from: {full_text}",
        "treatment_process": f"Extract treatment process from: {full_text}",
        "illness_characteristics": f"Extract illness characteristics from: {full_text}",
        "treatment_effect": f"Extract treatment effect from: {full_text}"
    }
    
    input_text = prompts.get(field, full_text)
    
    # 编码
    input_ids = tokenizer.encode(
        input_text,
        return_tensors="pt",
        max_length=512,
        truncation=True
    ).to(device)
    
    # 生成
    with torch.no_grad():
        output_ids = model.generate(
            input_ids,
            max_length=256,
            num_beams=4,
            early_stopping=True,
            no_repeat_ngram_size=3
        )
    
    # 解码
    output_text = tokenizer.decode(output_ids[0], skip_special_tokens=True)
    return output_text

def process_test_file(input_file, output_file, model_path="./emotion_summary"):
    """处理测试文件"""
    
    # 加载模型
    model, tokenizer, device = load_model(model_path)
    
    # 读取测试数据
    test_data = []
    with open(input_file, 'r', encoding='utf-8') as f:
        for line in f:
            if line.strip():
                test_data.append(json.loads(line))
    
    print(f"\nProcessing {len(test_data)} samples...")
    
    results = []
    for i, sample in enumerate(test_data, 1):
        print(f"  [{i}/{len(test_data)}] Processing ID: {sample['id']}...")
        
        result = {
            "id": sample["id"],
            "predicted_cause": summarize_case(model, tokenizer, device, sample, "cause"),
            "predicted_symptoms": summarize_case(model, tokenizer, device, sample, "symptoms"),
            "predicted_treatment_process": summarize_case(model, tokenizer, device, sample, "treatment_process"),
            "predicted_illness_Characteristics": summarize_case(model, tokenizer, device, sample, "illness_characteristics"),
            "predicted_treatment_effect": summarize_case(model, tokenizer, device, sample, "treatment_effect")
        }
        
        results.append(result)
    
    # 保存结果
    with open(output_file, 'w', encoding='utf-8') as f:
        for result in results:
            json.dump(result, f, ensure_ascii=False)
            f.write('\n')
    
    print(f"\n✓ Results saved to {output_file}")

if __name__ == "__main__":
    # 示例:处理单个案例
    sample_case = {
        "id": 1,
        "case_description": ["A 34-year-old male with health anxiety..."],
        "consultation_process": ["The consultation began with..."],
        "experience_and_reflection": "This case demonstrates..."
    }
    
    model, tokenizer, device = load_model()
    
    print("\nGenerating summaries...")
    cause = summarize_case(model, tokenizer, device, sample_case, "cause")
    print(f"\nCause: {cause}")
    
    # 如果要处理整个测试文件,取消下面的注释:
    # process_test_file("data/test/Emotion_Summary.jsonl", "results/predictions.jsonl")