Spaces:
Sleeping
Sleeping
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)
|