import gradio as gr import re import json # JSON 파일 읽기 with open('perio_demo.json', 'r') as file: node_info = json.load(file) ############################################################################## class Stack: def __init__(self): self.items = [] def is_empty(self): return len(self.items) == 0 def push(self, item): self.items.append(item) def pop(self): if not self.is_empty(): return self.items.pop() else: return None # 스택이 비어있을 때는 None 반환 또는 예외 처리도 가능 def peek(self): if not self.is_empty(): return self.items[-1] else: return None # 스택이 비어있을 때는 None 반환 또는 예외 처리도 가능 def size(self): return len(self.items) def clear(self): self.items = [] # 스택을 비우기 stack = Stack() # 발화에 명령어가 포함되어 있는지 확인 # 명령어가 포함되어 있다면 해당 노드 추출 def classifier(utterance): print(utterance) if utterance == "reset": stack.clear() stack.push(node_info["items"][0]) stack.push(node_info["items"][1]) return str("Reset!") top = stack.peek() global_check = re.compile(r'^#global') # top node 의 dest node 를 모두 가져온다. for dest_node in top['dest_node']: # node_info 에서 start_node == dest_node 인 노드를 찾는다. for node in node_info["items"]: if node["utterance"] == utterance: if node["fallback"] is not None: if global_check.match(node["fallback"]): node["fallback"] = int(re.sub(r'\D', '', node["fallback"])) while(True): if stack.size() == 0: return peek = stack.peek() if peek['start_node'] == node["fallback"]: return str(str(node['depth']) + ':' + node['intent']) else: stack.pop() if node['start_node'] == dest_node: # candidate_node.append(node) # 최신 노드보다 발화 노드가 다음 state 인지 확인 if top['depth']+1 == node['depth']: # dest_node 의 uttr 추출 -> 발화에 / 발화가 포함되는지 확인 # node['uttrance'] 에 값이 다수 들어있는 경우 배열로 반환 # if '\n' in node['utterance']: node_utter = node['utterance'].split('\n') for n in node_utter: if utterance in n or n in utterance: stack.push(node) # print(node['intent']) if node['fallback']: while(True): if stack.size() == 0: return peek = stack.peek() if peek['start_node'] == node['fallback']: return str(str(node['depth']) + ':' + node['intent']) else: stack.pop() else: return str(str(node['depth']) + ':' + node['intent']) return str("Can't run this command!") # 1. 차트 웹 구동 ## state = 1 stack.push(node_info["items"][0]) # 2. 페리오 / 임플란트 각 차트 분기 ## 페리오 차트로 분기 stack.push(node_info["items"][1]) demo = gr.Interface(fn=classifier, inputs="textbox", outputs="textbox", examples=[ ["start listening"], ["select tooth 1"], ["pocket depth 1 2 3"], ["select tooth 2"], ["treatment note"], ["missing"], ["select tooth 5 buccal mesial pocket depth"], ["save"], ["stop listening"], ["reset"] ]) if __name__ == "__main__": demo.launch()