123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- import random
- import jieba
- import numpy as np
- import os
- import pickle
- import sys
- import torch
- from fastapi import APIRouter
- from loguru import logger
- import traceback
- curr_path = os.path.abspath(os.path.dirname(__file__))
- project_root_path = curr_path[:curr_path.find("video_to_word") + len("video_to_word")]
- sys.path.append(project_root_path)
- random_num = random.random()
- print("OUT random_num", random_num)
- with open('/data/pythonProject/video_to_word/script_score/pkl/vocab.pkl', 'rb') as f:
- vocab = pickle.load(f)
- with open('/data/pythonProject/video_to_word/script_score/pkl/word_to_idx.pkl', 'rb') as f:
- word_to_idx = pickle.load(f)
- log_score_min = -19.266664505004883
- log_score_max = 0
- def split_by_jieba(x):
- seg_list = jieba.cut(x)
- seg_list = ','.join(seg_list)
- seg_list = seg_list.split(",")
- seg_list = [v for v in seg_list if v != ',']
- return seg_list
- def encode_samples(tokenized_samples):
- features = []
- for sample in tokenized_samples:
- feature = []
- for token in sample[0]:
- if token in word_to_idx:
- feature.append(word_to_idx[token])
- else:
- feature.append(0)
- features.append(feature)
- return features
- def pad_samples(features, maxlen=113, PAD=0):
- padded_features = []
- for feature in features:
- if len(feature) >= maxlen:
- padded_feature = feature[:maxlen]
- else:
- padded_feature = feature
- while len(padded_feature) < maxlen:
- padded_feature.append(PAD)
- padded_features.append(padded_feature)
- return padded_features
- def log_and_map_min_max_score(score):
- # log 变换
- log_score = np.log(score)
- # 映射到 0-100 分
- out_score = 0 + (100 - 0) / (log_score_max - log_score_min) * (log_score - log_score_min)
- out_score = round(out_score, 2)
- # 映射到 A/B/C 等级 (A:[95,100], B:[75,95), C:[0,75))
- score_level = 'C' if out_score < 75 else ('B' if out_score < 95 else 'A')
- return out_score, score_level
- router = APIRouter(tags=['evaluate_script_server'])
- @logger.catch()
- @router.post("/evaluate_script", description="脚本质量评级", summary="脚本质量评级")
- def evaluate_script(script):
- response = {'code': 0, "success": True, "result": [], "message": "脚本评分完成"}
- try:
- script_split_lst = split_by_jieba(script)
- feature = torch.tensor(pad_samples(encode_samples([[script_split_lst]])))
- from script_score.lstm_network import SentimentNet
- net = torch.load('/data/pythonProject/video_to_word/script_score/pkl/epoch52_test_auc_0.790_train_auc_0.815.pth',
- map_location='cpu')
- with torch.no_grad():
- score = net(feature)
- score, level = log_and_map_min_max_score(score[0][1].item())
- response["result"] = {"script_level": level, "script_score": score}
- return response
- except:
- response["code"] = -1
- response["success"] = False
- response["message"] = traceback.format_exc()
- return response
- if __name__ == '__main__':
- text = "十六块二十六块,只要二十六块包邮到家,这么大一件派克服,现在不要两百,不要一百二十六块就给你包邮到家,真的太划算了,咱们工厂现在为了扩大销售渠道,所以特地拿出一批货在桃树上做活动,这款派克服寒气版型,特别时尚,抽绳收腰设计,修身显瘦,加绒内里还保暖毛领,精致又洋气,喜欢的朋友赶紧点击视频下方链接进入操作即可就可以购买啦。"
- print(evaluate_script(text))
|