wangdongxu

jira:NYJ-1550 desc:football replay match

@@ -26,6 +26,7 @@ embedding = [ @@ -26,6 +26,7 @@ embedding = [
26 ] 26 ]
27 football-replay-match = [ 27 football-replay-match = [
28 "confluent_kafka==2.6.1", 28 "confluent_kafka==2.6.1",
  29 + "langchain-openai>=1.1.15",
29 ] 30 ]
30 # task-server 专用依赖 31 # task-server 专用依赖
31 task = [ 32 task = [
1 app_name: "Football Replay Service" 1 app_name: "Football Replay Service"
2 app_version: "1.0.0" 2 app_version: "1.0.0"
  3 +
  4 +match_by_time_threshold: 30 # 通过时间匹配进球事件的阈值(秒)
1 -def replay_match_event(data):  
2 - pass  
  1 +import logging
  2 +from aabd.base.enhance_dict import value_or_default
  3 +
  4 +logger = logging.getLogger(__name__)
  5 +
  6 +
  7 +class FootballReplayMatch:
  8 + def __init__(self, settings):
  9 + self.settings = settings
  10 + self.match_by_time_threshold = value_or_default(settings.match_by_time_threshold, 30) * 1000
  11 +
  12 + def match_by_time(self, replay, events):
  13 + start_utc = replay.get('start_utc')
  14 +
  15 + events = [(start_utc - e.get('event_utc'), e) for e in events]
  16 + events.sort(key=lambda x: abs(x[0]))
  17 + time_diff, event = events[0]
  18 + if time_diff < self.match_by_time_threshold:
  19 + return event
  20 + else:
  21 + return None
  22 +
  23 + def det_goal_replay(self, replay):
  24 + pass
  25 +
  26 + def match_by_llm(self, replay, events):
  27 + pass
  28 +
  29 + def replay_match_event(self, data):
  30 + """
  31 +
  32 + :param data:
  33 + {
  34 + id:xx,
  35 + match_id: 比赛id,
  36 + replay:{
  37 + id:,
  38 + url:,
  39 + start_utc:,
  40 + end_utc:,
  41 + }
  42 + events:[{
  43 + id:xx,
  44 + type:xx,
  45 + url:xx,
  46 + event_utc,
  47 + }]
  48 + }
  49 + :return:
  50 + """
  51 +
  52 + # 该时间段附近是否有进球事件
  53 + replay_info = data['replay']
  54 + live_events = data['events']
  55 + goal_live_events = [e for e in live_events if str(e.get('type', '')) == '1']
  56 +
  57 + matched_event = self.match_by_time(replay_info, goal_live_events)
  58 +
  59 + if matched_event is None:
  60 + replay_det_info = self.det_goal_replay(replay_info)
  61 + replay_event_name = replay_det_info.get('event_name', '')
  62 + if replay_event_name == '进球':
  63 + matched_event = self.match_by_llm(replay_info, goal_live_events)
  64 + if matched_event is None:
  65 + logger.info(f'LLM认为是进球但是未能找到匹配的事件')
  66 + else:
  67 + logger.info('LLM找到进球的事件')
  68 + else:
  69 + logger.info(f'LLM判断不是进球,无需匹配')
  70 + else:
  71 + logger.info(f'通过时间找到匹配的事件')
This diff could not be displayed because it is too large.