evaluate_script.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import random
  2. import jieba
  3. import numpy as np
  4. import os
  5. import pickle
  6. import sys
  7. import torch
  8. from fastapi import APIRouter
  9. from loguru import logger
  10. import traceback
  11. curr_path = os.path.abspath(os.path.dirname(__file__))
  12. project_root_path = curr_path[:curr_path.find("video_to_word") + len("video_to_word")]
  13. sys.path.append(project_root_path)
  14. random_num = random.random()
  15. print("OUT random_num", random_num)
  16. with open('/data/pythonProject/video_to_word/script_score/pkl/vocab.pkl', 'rb') as f:
  17. vocab = pickle.load(f)
  18. with open('/data/pythonProject/video_to_word/script_score/pkl/word_to_idx.pkl', 'rb') as f:
  19. word_to_idx = pickle.load(f)
  20. log_score_min = -19.266664505004883
  21. log_score_max = 0
  22. def split_by_jieba(x):
  23. seg_list = jieba.cut(x)
  24. seg_list = ','.join(seg_list)
  25. seg_list = seg_list.split(",")
  26. seg_list = [v for v in seg_list if v != ',']
  27. return seg_list
  28. def encode_samples(tokenized_samples):
  29. features = []
  30. for sample in tokenized_samples:
  31. feature = []
  32. for token in sample[0]:
  33. if token in word_to_idx:
  34. feature.append(word_to_idx[token])
  35. else:
  36. feature.append(0)
  37. features.append(feature)
  38. return features
  39. def pad_samples(features, maxlen=113, PAD=0):
  40. padded_features = []
  41. for feature in features:
  42. if len(feature) >= maxlen:
  43. padded_feature = feature[:maxlen]
  44. else:
  45. padded_feature = feature
  46. while len(padded_feature) < maxlen:
  47. padded_feature.append(PAD)
  48. padded_features.append(padded_feature)
  49. return padded_features
  50. def log_and_map_min_max_score(score):
  51. # log 变换
  52. log_score = np.log(score)
  53. # 映射到 0-100 分
  54. out_score = 0 + (100 - 0) / (log_score_max - log_score_min) * (log_score - log_score_min)
  55. out_score = round(out_score, 2)
  56. # 映射到 A/B/C 等级 (A:[95,100], B:[75,95), C:[0,75))
  57. score_level = 'C' if out_score < 75 else ('B' if out_score < 95 else 'A')
  58. return out_score, score_level
  59. router = APIRouter(tags=['evaluate_script_server'])
  60. @logger.catch()
  61. @router.post("/evaluate_script", description="脚本质量评级", summary="脚本质量评级")
  62. def evaluate_script(script):
  63. response = {'code': 0, "success": True, "result": [], "message": "脚本评分完成"}
  64. try:
  65. script_split_lst = split_by_jieba(script)
  66. feature = torch.tensor(pad_samples(encode_samples([[script_split_lst]])))
  67. from script_score.lstm_network import SentimentNet
  68. net = torch.load('/data/pythonProject/video_to_word/script_score/pkl/epoch52_test_auc_0.790_train_auc_0.815.pth',
  69. map_location='cpu')
  70. with torch.no_grad():
  71. score = net(feature)
  72. score, level = log_and_map_min_max_score(score[0][1].item())
  73. response["result"] = {"script_level": level, "script_score": score}
  74. return response
  75. except:
  76. response["code"] = -1
  77. response["success"] = False
  78. response["message"] = traceback.format_exc()
  79. return response
  80. if __name__ == '__main__':
  81. text = "十六块二十六块,只要二十六块包邮到家,这么大一件派克服,现在不要两百,不要一百二十六块就给你包邮到家,真的太划算了,咱们工厂现在为了扩大销售渠道,所以特地拿出一批货在桃树上做活动,这款派克服寒气版型,特别时尚,抽绳收腰设计,修身显瘦,加绒内里还保暖毛领,精致又洋气,喜欢的朋友赶紧点击视频下方链接进入操作即可就可以购买啦。"
  82. print(evaluate_script(text))