File size: 3,148 Bytes
676ea16
 
 
e1a87f2
5ceb402
dc890aa
a17fb95
676ea16
 
4f9c001
 
6dcfc9d
ee8eafb
4f9c001
a17fb95
 
 
 
009f865
83061f6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
676ea16
 
e076757
a17fb95
 
 
e076757
4f9c001
 
a17fb95
b56984a
 
 
 
 
 
 
 
 
83061f6
 
 
 
 
 
 
 
b56984a
83061f6
b56984a
 
6dcfc9d
 
 
b56984a
e076757
 
a17fb95
 
676ea16
5ceb402
6dcfc9d
 
 
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
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
import uvicorn
import os
from predictor import SentenceExtractor  # 保证导入规范文件名 `predictor.py`

# 创建 FastAPI 应用
app = FastAPI()

# 初始化 SentenceExtractor
extractor = SentenceExtractor(
    eval_keywords_path="evaluation_keywords2.json",  # 相对路径将被转换为绝对路径
    model_path="distilled_model.onnx"
)

@app.get("/")
async def root():
    return {"message": "API is running. Use POST /evaluate to upload files."}

@app.get("/health")
async def health():
    try:
        # 暴露关键运行状态,便于部署环境自检
        return JSONResponse(content={
            "model_loaded": getattr(extractor, "model_loaded", False),
            "model_path_abs": getattr(extractor, "model_path_abs", None),
            "model_sha256": getattr(extractor, "model_sha256", None),
            "providers": getattr(extractor, "providers", None),
            "tokenizer_loaded": getattr(extractor, "tokenizer_loaded", None),
            "last_tokenizer_error": getattr(extractor, "last_tokenizer_error", None),
            "aggregation_mode": extractor.aggregation_mode,
            "min_sentence_char_len": extractor.min_sentence_char_len,
            "merge_leading_punct": extractor.merge_leading_punct,
        })
    except Exception as e:
        return JSONResponse(content={"error": str(e)}, status_code=500)

@app.post("/evaluate")
async def evaluate_file(file: UploadFile = File(...)):
    try:
        # 读取上传文件内容
        content = await file.read()
        text = content.decode("utf-8", errors="ignore")

        # 调用 extractor 进行文本分析
        result = extractor.extract(text)

        # 格式化输出结果
        formatted_result = {
            "综合评分": result["comprehensive_grade"],
            "积极词语评价数": result["positive_word_count"],
            "消极词语评价数": result["negative_word_count"],
            "中性词语评价数": result["neutral_word_count"],
            "句子评分": []
        }
        for i, item in enumerate(result["scored_sentences"], 1):
            source = item.get('source', '?')
            reason = item.get('reason') or item.get('last_tokenizer_error')
            suffix = f" ({source})"
            if source == 'rule' and reason:
                # 将回退原因直接拼接到可见文本,便于客户端看到具体错误
                if len(reason) > 120:
                    reason = reason[:120] + '...'
                suffix += f" - reason: {reason}"
            formatted_result["句子评分"].append({
                f"句子{i}": f"{item['sentence']} - {item['grade']}{suffix}"
            })

        # 附加调试信息便于客户端确认
        formatted_result["_debug"] = result.get("debug", {})

        return JSONResponse(content=formatted_result)

    except Exception as e:
        return JSONResponse(content={"error": str(e)}, status_code=500)

if __name__ == "__main__":
    port = int(os.getenv("PORT", 7860))
    uvicorn.run(app, host="0.0.0.0", port=port)