현재 진행중인 졸업프로젝트(9할 마무리되었지만...)로 챗봇캘린더를 진행하게 되었다.
3명이서 진행하는거라 역할은 ML/프론트/백엔드 이렇게 나누었고
내 역할은 ML이다.
우선 우리 프로젝트는 채팅으로 일정을 한 줄 입력하면
개체명(날짜/일정명)이 분류가 되어 자동으로 캘린더에 넣어주는 것이다.
너무 센세이션하지 않나요????????????
우선 내가 한 역할에 대해 설명하기 전에
프로젝트 결과 먼저!
우선 우리 프로젝트의 목표는 일정을 등록하는데 최소한의 시간과 노력을 들일 수 있게 한다는 것
Step만 봐도 현저히 축소되었음을 확인할 수 있다.
본인이 설정한 시간대에 웹푸시를 이용하여 사용자 웹브라우저로 알람이 가게끔 설정했다.
(내가 한 부분은 아니라 어떻게 했는지는 잘 모르겠다.)
이제 내가 한 부분!!!!!!!!!!!!
NER(Named Entity Recognition: 개체명 인식 모델)을 사용해서
입력받은 데이터를 시간 관련 클래스와 비시간 클래스로 분류하여준다.
(여기서, 시간 관련 클래스는 더 세분화해서 분류가 되지만 이 과정에선 의미없음)
데이터셋으로는 한국해양대학교 데이터셋과 네이버 데이터셋만 이용해서 진행했다.
(1) 한국해양대학교 자연어처리 연구실 NER 데이터 셋
:총 23,964개 문장
:BIO 태깅 시스템 사용
:10 종류의 Annotated Entities – { 인물(PER), 기관(ORG), 지명(LOC), 기타(POH), 날짜(DAT), 시간(TIM), 기간(DUR), 통화(MNY), 비율(PNT), 기타 수량표현(NOH) }
(2) NAVER NLP Challenge 2018
:총 82, 393개문장
:BIO 태깅 시스템 사용
: 14 종류의 AnnotatedEntities – { 인물(PER), 학문분야(FLD), 인공물(AFW), 기관및 단체(ORG), 지역명(LOC), 문명 및문화(CVL), 날짜(DAT), 시간(TIM), 숫자(NUM), 사건사고 및 행사(EVT), 동물(ANM), 식물(PLT), 금속/암석/화학물질(MAT), 의학용어/IT관련 용어(TRM) }
사진에서 보면 예시의 문장은
'내일 오후 3시 30분에 프로젝트 회의. 회의실 B에서 진행'이라고 나와있는데
내일 오후 3시 30분은 시간 관련 클래스
프로젝트 회의. 회의실 B에서 진행은 비시간 클래스로 분류가 된다.
구글코랩 TPU를 이용해서 NER 모델을 진행하였고
정밀도, 재현률 및 조화 평균이
시간 관련 클래스들은 높은 점수로 분류되었음을 확인할 수 있다.
원래 이 과정에서
1. 14 종류의 AnnotatedEntities – { 인물(PER), 학문분야(FLD), 인공물(AFW), 기관및 단체(ORG), 지역명(LOC), 문명 및문화(CVL), 날짜(DAT), 시간(TIM), 숫자(NUM), 사건사고 및 행사(EVT), 동물(ANM), 식물(PLT), 금속/암석/화학물질(MAT), 의학용어/IT관련 용어(TRM) } 14가지의 클래스로 나누기
2. 날짜, 시간 외에 변수들은 O 처리를 하고, 두 개(시간 관련, 비시간)의 클래스로 분류하게끔 하기
3. 한국해양대학교 데이터셋에는 기간도 포함되어있음. 날짜, 시간, 기간 3개
기간의 정확도가 상대적으로 낮으니 DATE와 DUR을 합쳐서 하나의 시간 데이터로 만들기
이렇게 세 번 모델을 진행하였는데(한 번 할 때마다 3시간 넘게 걸렸다 ㅜㅜ)
2, 3번은 정확도는 차치하고, 분류부터가 말썽이었다.(그래서 1번으로 진행함)
1월 17일이 DATE가 아니라 다른 클래스로 분류가 되었다든지...
여러 번 만져보고 다듬어보고 싶었는데 한 번 돌릴 때마다 3시간정도가 걸리니 자주 돌릴 엄두도 안 났다.
가뜩이나 무료 TPU를 이용하는거라 제한시간마저 존재하니...
돌릴 때마다 제한시간에 걸리지 않길 빌면서 진행했다.
1번 모델을 저장해서 TPU 필요없는 쥬피터로 도착(이제 난 자유야)
우선 저장한 모델을 불러와서 실행해보면
240517이 NUM으로 잘 분류된 것을 확인할 수 있다.
(24년5월17일로 하면 DATE로 분류되겠지만 채팅으로 입력하다보면 240517로 입력할 사람도 많을 것으로 판단이 되어 이것으로 테스트 해봄)
밑의 결과를 보면 시간 관련 클래스는 몽땅 합쳐서 1번 튜플, 비시간 클래스는 2번 튜플로 묶었다.
함수의 매개변수에 넣을 인수 역할을 하기 때문에 하나의 튜플 혹은 리스트로 만들어주었다.
이제 가장 중요한... 분류된 시간 관련 클래스를
년,월,일,시,분으로 더 세세하게 분류하는 작업이 필요하다.
그래서... 내가 함수를 만들었다(비장)
우선 sentence는 시간 관련 클래스, event는 비시간 클래스를 받아오는 매개변수 역할을 한다.
분류에 앞서 발생할 수 있는 예외상황을 커버하기 위해 사전작업을 실행하는데
일정이 기간(Duration)일 경우 시작일정과 종료일정이 존재하기 때문에
그것을 구분할 수 있는 단어가 필요하다.
예로 들어 ㅇㅇ부터 ㅁㅁ까지라는 말에 '까지'라는 말이 빠졌을 때를 해결하기 위해 붙여주고
ㅇㅇ부터 ㅁㅁ에라고 하면 말이 좀 이상하기 때문에 '에'를 '부터'로 바꿔주고
240215~240216처럼 특수문자로 작성할 경우 특수문자(UNK)를 '부터'와 '까지'로 바꿔준다.
내가 괜한 것을 한 거 같지요...
소규모 알파테스트를 하고 얻은 결과랍니다~
백퍼센트 20240729, 240729, 24729처럼 쓰는 이용자들이 존재할거라고 생각하고
그렇게 입력할 경우 24년7월29일로 바꿔주는 코드도 넣었고
7월29일부터 다음주까지, 내일까지 혹은
그냥 '내일'인 경우나
이번주 금요일
이렇게 숫자가 아닌 문자로 입력할 경우도 숫자로 바꿔주는 역할을 했다.
(모든 코드를 첨부하진 않겠음)
현재 날짜 2024-07-29
그럼 이렇게 분류가 된다!!!
(시작년도,시작월,시작일,오전오후,시작시간,시작분,종료년도,종료월,종료일,오전오후,종료시간,종료분,비시간 클래스)
내 역할은 이렇게 마무리
TODO LIST 등록도 할 수 있는데
여기선 비시간 클래스만 가져와서 투두리스트에 등록하는 시스템이다.
캘린더를 보면 일정마다 수행했을 때 체크하는 버튼이 있다.
일정마다 체크가 되었는지 확인한 후 일정 완료율을 계산한다.(성과 지표 확인창이 있음)
일정 완료율이 50% 이하인 경우, 강제 알람 시스템을 도입할 것이냐는 알림창이 뜨게 한다.
강제 알람 시스템을 도입하면 그 날 이후부터 존재하는 일정은 자동으로 알람이 가게끔 설정하고,
다음 달 1일에 일정 완료율이 50% 이상이 되었으면 강제 알림을 해지한다.
물론 이 과정은 프론트와 백엔드 분이 해주셨다.
우선 결론적으로 각자 본인의 역할을 잘 이행하였기 때문에
처음으로 팀프로젝트의 의의를 실감했다.
이전의 팀플들은 내가 선두해서 각자 해야할 것들을 지정하고
대부분 벼락치기로 해오기 때문에 약속한 시간까지 해오지 않을까봐 고생을 사서 했는데
이번에는 되려 약속한 시간 전부터 연락이 오거나
에러가 생겼으면 단톡을 활용해서 해결하려고 하는
진정한 '팀프로젝트'의 느낌이 나서 얼마나 심적으로 편안했는지 모르겠다.
아쉬운 점은 분류가 잘 되긴 하지만 그렇다고 100퍼센트 되는 건 아니라는 점.
아직 사용자 테스트를 진행하지 않아서(9월달에 진행할 예정)
사용자 테스트 이후 수정할 부분을 보완할 예정이다.
그럼 사용자 테스트 이후에 다시 글쓰러 올게요!!!!!!
안녕!