주제
Do you know? 게임
Do you know? 게임은 파리올림픽에 출전한 선수들의 이름을 맞추는 게임입니다.
선수들의 이름을 맞출 수 있는 힌트 단어를 플레이어에게 보여주고 플레이어는 해당 힌트 단어와 연관된 선수의 이름을 맞추는 게임입니다.
문제 정의
힌트 단어, 유사 단어
플레이어가 선수들의 이름을 맞추는 데 필요한 단어들은 반드시 선수들의 이름과 유사하고 관련성이 높은 단어이어야 합니다.
그러므로 이 게임을 성공적으로 만들기 위해서는 유사 단어, 즉 선수의 이름과 텍스트 유사도가 높은 단어를 찾는 것이 핵심 문제입니다.
난이도
게임을 좋아하는 사람이라면 난이도의 중요성은 말하지 않아도 알 것입니다.
유사 단어를 추출한다고 해도 그 단어들을 난이도에 맞게, 플레이어가 '재미있게' 플레이 할 수 있는 난이도를 설정하는 것 또한 핵심 문제였습니다.
데이터 수집
저희는 파리올림픽 기간 동안 나온 파리올림픽 관련 뉴스 기사 본문 데이터를 수집했습니다.
뉴스 데이터는 정제되어있는 표현, 정확성 등 여러 측면에서 다른 데이터에 비해 유리하다고 판단했습니다. 또한 네이버 뉴스 데이터는 저희가 비교적 쉽게 수집할 수 있다는 점도 중요했습니다.
좀 더 정교한 게임을 만들기 위해서는 많은 양의 데이터가 필요했습니다. 하지만 정적으로 데이터를 수집한다면 하루 최대 20개 정도의 기사만 추출할 수 있었습니다. '더보기' 버튼을 동적으로 접근해 눌러줘야 더 많은 뉴스를 볼 수 있었기 때문입니다.
따라서 저희는 동적 스크래핑을 위해 셀레니움을 활용했습니다.
결과적으로 저희는 27,000개 정도의 뉴스 본문 데이터를 모을 수 있었습니다.
2024.08.09 - [[Deep daiv.]/[Deep daiv.] 복습] - [Deep daiv.] TIL - 2. 동적 크롤링
아래는 저희가 수집한 본문 데이터입니다.
데이터 전처리
위에 저희가 수집한 데이터를 보면 알 수 있듯, 여러 가지 특수 기호나, '연합 뉴스'와 같은 의미 없는 텍스트들이 들어가있는 것을 볼 수 있습니다.
이러한 데이터들은 선수 이름과 유사한 단어를 찾는데에 방해가 되기 때문에 전처리의 대상이 됩니다.
더 나은 결과를 위해 저희가 한 전처리는 다음과 같습니다:
- 명사 기반 토큰화
- 선수 이름 사용자 사전 저장
- 추가 불용어 설정
- 길이가 1인 토큰 삭제
명사 기반 토큰화
저희가 추출하고자 했던 단어들은 (선수 이름, 유사 단어) 대부분 명사이기 때문에 명사 기반 토큰화는 당연했습니다. 하지만 처음에는 형용사나 용언들도 같이 토큰화 해서 좀 더 다양한 유사 단어를 만들어야겠다고 생각했었습니다.
예를 들어,
'날아오르는 우상혁'
'뒤집기 허미미'
등등의 데이터를 얻고 싶었습니다.
형용사 기반 토큰화?
대분류 | mecab-ko-dic 품사 태그 | |
태그 | 설명 | |
체언 | NNG | 일반 명사 |
NNP | 고유 명사 | |
NNB | 의존 명사 | |
NNBC | 단위를 나타내는 명사 | |
NR | 수사 | |
NP | 대명사 | |
용언 | VV | 동사 |
VA | 형용사 | |
VX | 보조 용언 | |
VCP | 긍정 지정사 | |
VCN | 부정 지정사 | |
관형사 | MM | 관형사 |
부사 | MAG | 일반 부사 |
MAJ | 접속 부사 | |
감탄사 | IC | 감탄사 |
조사 | JKS | 주격 조사 |
JKC | 보격 조사 | |
JKG | 관형격 조사 | |
JKO | 목적격 조사 | |
JKB | 부사격 조사 | |
JKV | 호격 조사 | |
JKQ | 인용격 조사 | |
JX | 보조사 | |
JC | 접속 조사 | |
선어말 어미 | EP | 선어말 어미 |
어말 어미 | EF | 종결 어미 |
EC | 연결 어미 | |
ETN | 명사형 전성 어미 | |
ETM | 관형형 전성 어미 | |
접두사 | XPN | 체언 접두사 |
접미사 | XSN | 명사 파생 접미사 |
XSV | 동사 파생 접미사 | |
XSA | 형용사 파생 접미사 | |
어근 | XR | 어근 |
부호 | SF | 마침표, 물음표, 느낌표 |
SE | 줄임표 … | |
SSO | 여는 괄호 (, [ | |
SSC | 닫는 괄호 ), ] | |
SC | 구분자 , · / : | |
SY | ||
한글 이외 | SL | 외국어 |
SH | 한자 | |
SN | 숫자 |
형용사를 기반으로 토큰화 하기 위해 mecab의 pos() 메소드를 통해 토큰화된 결과와 품사 태그를 튜플의 형태로 얻습니다.
그 후 mecab 품사 태그 중, 형용사인 VA 태그와 선수의 이름만 남겨두고 모두 삭제했습니다.
(* 선수들의 이름은 동시 등장 행렬 등 여러 가지 연산을 형용사와 같이 해야하기 때문에, 선수들의 이름은 남겨주었습니다.)
하지만 선수들 이름에 비해 형용사 태그가 붙은 토큰의 개수가 너무 적어서 선수들의 이름들만 우세하게 남는 결과가 발생했습니다.
아래의 사진은 형용사와 선수 이름만 남겼을 때의 결과입니다.
(* 김우민 선수의 이름이 매우 많이 남아있습니다.)
그렇기 때문에 추후 수행할 여러 가지 방법들을 적용하는데 여러 가지 문제가 있을 것이라고 판단했고,
형용사를 기반으로 토큰화 하지 않고 명사를 기반으로 토큰화를 하는것으로 결정했습니다.
선수 이름 사용자 사전 저장
mecab()을 통한 토큰화를 할 때, 선수들의 이름이 하나의 토큰으로 저장되지 않는 케이스를 발견했습니다.
이를 해결하기 위해 저희는 사용자가 정의할 수 있는 사전에 파리올림픽에 출전한 모든 선수들을 추가해,
선수들의 이름이 토큰화되지 않는 경우를 방지했습니다.
아래의 코드는 사용자 정의 사전에 선수들의 이름을 넣는 파이썬 코드입니다:
word_list = [('고진영', 0), ('김주형', 0), ('김효주', 0), ('안병훈', 0), ('양희영', 0),
('김선우', 0), ('서창완', 0), ('성승민', 0), ('전웅태', 0),
('김승준', 0), ('이승찬', 0), ('이한빛', 0),
('강민혁', 0), ('공희용', 0), ('김가은', 0), ('김소영', 0), ('김원호', 0), ('백하나', 0), ('서승재', 0), ('채유정', 0), ('안세영', 0), ('이소희', 0), ('전혁진', 0), ('정나은', 0),
('오연지', 0), ('임애지', 0),
('김홍열', 0),
('박하준', 0), ('최대한', 0), ('금지현', 0), ('반효진', 0), ('임하나', 0), ('이은서', 0), ('조영재', 0), ('송종호', 0), ('이원호', 0), ('김예지', 0), ('양지인', 0), ('오예진', 0), ('강지은', 0), ('김민수', 0), ('장국희', 0), ('이보나', 0),
('김유로', 0), ('송민지', 0),
('하지민', 0),
('김민섭', 0), ('김서영', 0), ('김영현', 0), ('김우민', 0), ('김지훈', 0), ('양재훈', 0), ('이호준', 0), ('이유연', 0), ('이은지', 0), ('이주호', 0), ('조성재', 0), ('지유찬', 0), ('최동열', 0), ('황선우', 0), ('허연경', 0),
('김나현', 0), ('김수지', 0), ('김영택', 0), ('신정휘', 0), ('우하람', 0), ('이재경', 0),
('이리영', 0), ('허윤서', 0),
('서채현', 0), ('신은철', 0), ('이도현', 0),
('황영식', 0),
('김우진', 0), ('김제덕', 0), ('이우석', 0), ('임시현', 0), ('전훈영', 0), ('남수현', 0),
('김수현', 0), ('박주효', 0), ('박혜정', 0), ('유동주', 0), ('장연학', 0),
('김민종', 0), ('김원진', 0), ('김지수', 0), ('김하윤', 0), ('안바울', 0), ('윤현지', 0), ('이준환', 0), ('이혜경', 0), ('정예린', 0), ('한주엽', 0), ('허미미', 0),
('김장우', 0), ('우상혁', 0), ('최병광', 0),
('류성현', 0), ('신솔이', 0), ('엄도현', 0), ('여서정', 0), ('이다영', 0), ('이윤서', 0), ('이준호', 0), ('허웅', 0),
('신유빈', 0), ('이은혜', 0), ('임종훈', 0), ('장우진', 0), ('전지희', 0), ('조대성', 0),
('김유진', 0), ('박태준', 0), ('서건우', 0), ('이다빈', 0),
('강영미', 0), ('구본길', 0), ('김재원', 0), ('도경동', 0), ('박상원', 0), ('송세라', 0), ('오상욱', 0), ('윤지수', 0), ('이혜인', 0), ('전은혜', 0), ('전하영', 0), ('최세빈', 0), ('최인정', 0), ('하태규', 0),
('강경민', 0), ('강은서', 0), ('강은혜', 0), ('김다영', 0), ('김보은', 0), ('류은희', 0), ('박새영', 0), ('송지영', 0), ('신은주', 0), ('신진미', 0), ('우빛나', 0), ('전지연', 0), ('정진희', 0), ('한미슬', 0),]
make_user_dic_csv(morpheme_type="NNP", word_list=word_list, user_dic_file_name='user-nnp.csv')
추가 불용어 설정
토큰화를 진행하면 분석에 불필요한 토큰들, 즉 불용어들이 종종 발견됩니다.
이 불용어들은 분석에 방해가 되기 때문에 삭제해줘야 합니다.
따라서 토큰화 과정 중에 흔히 사용하는 불용어 리스트를 인터넷에서 찾아 전처리 해주었습니다.
아래는 저희가 찾은 불용어 리스트 중 일부입니다:
stopwords = "아 휴 아이구 아이쿠 아이고 어 나 우리 저희 따라 의해 을 를 에 의 가 으로 로 에게 뿐이다 의거하여 근거하여 입각하여 기준으로 예하면 예를 들면 예를 들자면 저 소인 소생 저희 지말고 하지마 하지마라 다른 물론 또한 그리고 비길수 없다 해서는 안된다 뿐만 아니라 만이 아니다 만은 아니다 막론하고 관계없이 그치지 않다 그러나 그런데 하지만 든간에 논하지 않다 따지지 않다 설사 비록 더라도 아니면 만 못하다 하는 편이 낫다 불문하고 향하여 향해서 향하다 쪽으로 틈타 이용하여 타다 오르다 제외하고 이 외에 이 밖에 하여야 비로소 한다면 몰라도 외에도 이곳 여기 부터 기점으로 따라서 할 생각이다 하려고하다 이리하여 그리하여 그렇게 함으로써 하지만 일때 할때 앞에서 중에서 보는데서 으로써 로써 까지 해야한다 일것이다 반드시 할줄알다 할수있다 할수있어 임에 틀림없다 한다면 등 등등 제 겨우 단지 다만 할뿐 딩동 댕그 대해서 대하여 대하면 훨씬 얼마나 얼마만큼 얼마큼 남짓 여 얼마간 약간 다소 좀 조금 다수 몇 얼마 지만 하물며 또한 그러나 그렇지만 하지만 이외에도 대해 말하자면 뿐이다 다음에 반대로 반대로 말하자면 이와 반대로 바꾸어서 말하면 바꾸어서 한다면 만약 그렇지않으면 까악 툭 딱 삐걱거리다 보드득 비걱거리다 꽈당 응당 해야한다 에 가서 각 각각 여러분 각종 각자 제각기 하도록하다 와 과 그러므로 그래서 고로 한 까닭에 하기 때문에 거니와 이지만 대하여 관하여 관한 과연 실로 아니나다를가 생각한대로 진짜로 한적이있다 하곤하였다 하 하하 허허 아하 거바 와 오 왜 어째서 무엇때문에 어찌 하겠는가 무슨 어디 어느곳 더군다나 하물며 더욱이는 어느때 언제 야 이봐 어이 여보시오 흐흐 흥 휴 헉헉 헐떡헐떡 영차 여차 어기여차 끙끙 아야 앗 아야 콸콸 졸졸 좍좍 뚝뚝 주룩주룩 솨 우르르 그래도 또 그리고 바꾸어말하면 바꾸어말하자면 혹은 혹시 답다 및 그에 따르는 ..."
추가적으로 저희가 사용하는 데이터는 '파리 올림픽' 관련 '뉴스' 기사이기 때문에,
수집한 데이터에 맞는 추가적인 불용어를 설정해야 합니다.
예를 들어,
'파리 올림픽'
'기자'
'사진'
등의 단어들이 여러 기사에 자주 등장함을 알 수 있었습니다.
이런 단어들은 선수들의 이름과 유사한 단어를 찾는데 불필요한 단어들이기 때문에 따로 불용어로 추가했습니다.
아래는 저희가 추가한 불용어 리스트 입니다:
additional_stopwords = "파리 올림픽 기자 사진 프랑스 파리올림픽 연합뉴스 영상 제보 카카오톡 구독 홈페이지 제공 제보 데일리 선수 무단 배포 금지 너무 시간 현지 시각 여자 남자 메달 오후 오전 새벽"
길이가 1인 토큰 삭제
다양한 불용어들을 처리해주었지만,
여전히 분석에 불필요한 토큰들이 남아 있을 수 있습니다.
아래는 n-gram을 통해서 얻은 유사 단어 리스트입니다:
(* '일', '년', '번', '위'와 같은 토큰들이 상위권에 위치함을 볼 수 있습니다.)
이에 길이가 1인, 무의미한 토큰들을 추가적으로 삭제해주는 작업을 수행했습니다.
아래는 이를 수행하는 파이썬 코드입니다:
from tqdm.auto import tqdm
# stop_words 에 없고 길이가 1이 아닌것만 남김
df['Cleaned_content_token'] = df['Cleaned_content_token']
.map(lambda x: [word for word in x if word not in stop_words and len(word) != 1])
모델링 및 방법론
유사 단어 추출 방법
Text similarity
저희는 텍스트 유사도를 측정할 수 있는 다양한 방법을 알아봤습니다.
알아본 방법들을 아래와 같습니다:
- Cosine Similarity
- Word2Vec
- Co-occurence Matrix
- n-gram(* Statistical Language Model)
Cosine Similarity
코사인 유사도를 구하기 위해서는 단어들을 벡터화해야 합니다.
단어를 벡터화 하는 방법에는 여러 가지 방법이 있지만, 저희는 TF-IDF 를 통해 얻은 행렬의 열 하나하나를 단어 벡터로 간주했습니다.
TF-IDF 는 여러 문서에서 자주 등장하는 단어는 핵심 단어가 될 수 없다는 아이디어에서 출발합니다.
기본 BoW 에서는 각 행렬의 값이 그냥 문서에 등장한 빈도 수인데 반해, TF-IDF 는 해당 문서에서 특정 단어의 빈도 수가 많더라도 많은 문서에서 자주 등장했다면 값이 작아집니다.
TF-IDF의 계산은 다음과 같습니다:
- TF (Term Frequency): 문서에서 해당 단어가 등장한 횟수.
- IDF (Inverse Document Frequency): 단어의 중요도를 측정하기 위해 사용되며, 모든 문서 중 해당 단어가 등장한 문서의 수에 따라 달라집니다. 공식은 다음과 같습니다:
여기서 N은 문서의 총 수, df(t)는 단어 t가 등장한 문서의 수입니다.
예를 들어, 다음과 같은 말뭉치가 있을때 다음과 같은 tf-idf 행렬을 얻을 수 있습니다:
말뭉치 (Corpus):
- "I love NLP"
- "NLP is fun"
- "I love learning NLP"
BoW(* DTM):
I love NLP is fun learning
문서1 | 1 | 1 | 1 | 0 | 0 | 0 |
문서2 | 0 | 0 | 1 | 1 | 1 | 0 |
문서3 | 1 | 1 | 1 | 0 | 0 | 1 |
각 단어의 TF-IDF를 계산하여 아래와 같은 TF-IDF 행렬을 얻습니다:
I love NLP is fun learning
문서 1 | 0.44 | 0.44 | 0.22 | 0 | 0 | 0 |
문서 2 | 0 | 0 | 0.22 | 0.58 | 0.58 | 0 |
문서 3 | 0.44 | 0.44 | 0.22 | 0 | 0 | 0.58 |
말뭉치에서 얻은 tf-idf 행렬의 열벡터들 중, 선수 이름에 해당하는 열 벡터와 가장 유사한 열 벡터, 즉 단어 벡터를 계산해 선수 이름과 유사한 단어를 얻는 방법입니다.
코사인 유사도의 경우 벡터의 크기는 무시하고 벡터의 방향성에 집중해서 유사도를 구하는 방법입니다.
위 그림과 같이 비슷한 방향을 향하는 벡터의 경우 유사도가 높고, 두 벡터가 만드는 각이 90도인 경우에는 유사도가 아예 없다고 해석합니다.
단어 벡터들의 방향성을 통해 유사도를 구하는 방법이 코사인 유사도를 통해 유사도를 구하는 방법입니다.
하지만, 선수 이름은 144개이고, 토큰화와 전처리를 통해 얻은 단어의 개수는 3만개 가량이기 때문에 모든 단어 벡터들에 대해 코사인 유사도를 구하는 방식은 계산 비용이 너무 크다고 판단했고, 결과적으로 이 방법은 사용하지 않았습니다.
Word2Vec
Word2Vec은 단어를 임베딩하는 방법들 중 하나입니다.
W2V은 단어들을 벡터화 할 때, 단어 간의 유의미한 유사도를 반영하여 벡터화를 한다는 특징을 가지고 있습니다. 이를 통해 선수 이름 단어 벡터와 유사도가 가장 높은 단어들을 추출할 수 있습니다.
W2V에는 목표 단어(* target word) 를 통해 주변 단어를 예측하는 Skip-gram 방식과 주변 단어들을 통해 목표 단어를 예측하는 CBoW 방식이 존재합니다.
두 방식을 그림으로 나타내면 다음과 같습니다:
일반적으로 CBoW보다는 Skip-gram 의 방식이 성능이 좋기 때문에 저희 게임에서 유사 단어를 찾을 때는 Skip-gram 방식을 사용했습니다.
Co-occurence Matrix
동시 등장 행렬입니다.
우선 등장 행렬을 얻어야 합니다. 등장 행렬은 기본 BoW, 즉 DTM(* Document-Term Matrix)에서 행렬의 값이 1 이상이면 1로, 0 이면 그냥 값을 수정하지 않는 방법으로 구할 수 있습니다.
이는 어떤 문서에서 특정 단어가 한 번이라도 등장한 적이 있다면 1로, 한 번도 등장한 적이 없다면 0으로 값을 설정하는 것을 의미합니다.
이때, 선수 이름 단어 열 벡터들과 등장 행렬과의 내적을 통해 선수 이름들과 동시에 등장하는 단어들에 대한 동시 등장 행렬을 구할 수 있습니다.
하지만, 이렇게 구한 동시 등장 행렬은 핵심 단어에 대한 가중치가 고려되지 않았습니다.
TF-IDF 와 같이 여러 문서에서 많이 등장한 단어는 핵심 단어가 될 수 없다는 아이디어가 적용되지 않은 행렬이기 때문에, 더 나은 데이터를 얻기 위해서 저희는 Lift 의 개념을 도입해주었습니다.
Lift의 개념을 다음과 같습니다:
아이템 집합 A = {a1, a2 ,a3}, B = {b1, b2, b3}가 있을 때:
- 아이템 집합 X와 Y간의 상관관계를 나타내는 Association Rules 중 하나
- X와 Y가 독립이라고 가정했을 때와 비교했을 때 얼마만큼의 상관관계가 있는지 나타냄
- LIFT 값의 의미
- LIFT > 1 : X와 Y 간에 양의 상관관계 존재
- LIFT = 1: X와 Y는 독립
- LIFT < 1: X와 Y 간에 음의 상관관계 존재
이를 통해 음의 상관관계가 있는 단어 조합인 경우 가중치를 적게, 양의 상관관계가 있는 단어 조합인 경우 가중치를 크게 만들었습니다.
n-gram
n-gram 을 통한 언어 모델은 카운트를 기반으로 하는 통계적 접근 방식입니다.
n-gram 에서 n은 연속적인 단어 나열을 의미합니다. 예를 들어 문장
An adorable little boy is spreading smiles
가 있을 때, 각 n 에 대해서 n-gram 을 전부 구해보면 다음과 같습니다:
- unigrams
- : an, adorable, little, boy, is, spreading, smiles
- bigrams
- : an adorable, adorable little, little boy, boy is, is spreading, spreading smiles
- trigrams
- : an adorable little, adorable little boy, little boy is, boy is spreading, is spreading smiles
- **4-**grams
- : an adorable little boy, adorable little boy is, little boy is spreading, boy is spreading smiles
이를 통해 ‘An adorable little boy is spreading’ 다음에 나올 단어를 예측할 수 있습니다.
n=4라고 한 4-gram 을 이용한 언어 모델을 사용한다고 했을 때, spreading 다음에 올 단어 w를 예측하는 것은 n-1에 해당되는 앞의 3개의 단어 만 고려하는 방식으로 예측합니다.
그렇다면, ‘boy is spreading’ 다음에 단어 w 가 올 확률은 다음과 같이 구할 수 있습니다:
만약 가지고 있는 코퍼스에서 boy is spreading가 1,000번 등장했다고 하고 boy is spreading insults가 500번 등장했으며, boy is spreading smiles가 200번 등장했다고 한다면,
boy is spreading 다음에 insults가 등장할 확률은 50%이며, smiles가 등장할 확률은 20%입니다. 확률적 선택에 따라 우리는 insults가 더 적합하다고 판단하게 됩니다.
저희 게임에서는 bigram 뿐 아니라 trigram 이나 4-gram까지 이용해 선수 이름 다음에 올 수 있는 단어들 중 가장 확률이 높은 단어를 유사단어로 간주하고, 추출했습니다.
난이도 선정 방법
처음 프로젝트를 시작할 때는
선수 이름 뒤에 나올 확률이 가장 높은 단어(* n-gram),
선수 이름과 같이 등장한 횟수가 가장 많은 단어(* co-occurence matrix),
선수 이름과 의미적으로 가장 유사한 단어(* Word2Vec)가 선수를 가장 잘 설명하는 단어이고 그 단어가 선수를 맞추기에 쉬운 단어라고 생각했습니다.
하지만 결과를 확인해보니 아니었습니다. 아래의 리스트에서 가장 난이도가 쉬운 단어가 가장 위에 있는 단어는 아님을 알 수 있습니다.
다음은 각 결과가 적용된 신유빈 선수에 대한 유사 단어 리스트입니다:
(* 사우스를 보고 신유빈 선수를 알 수 있을까요..?)
저희는 각각의 방법을 통해 얻은 유사 단어들의 난이도를 높은 확률 순(* n-gram), 동시 등장 빈도 순(* co-occurence), 유사도 순(* Word2Vec) 으로 선정하려 했지만 객관적인 지표, 수치적인 지표로 주관적인 난이도를 선정하기에는 매우 어려웠습니다.
그렇기 때문에 저희는 직접 유사 단어들의 난이도를 분류하기로 했습니다.
구현
저희 게임은 2단계로 나누어서 진행됩니다.
1단계는 비교적 어려운 난이도로, 플레이어가 한 번에 문제를 맞히지 못하게 하고 플레이어에게 선수에 대한 좀 더 새로운 정보를 제공해주는 단계입니다.
2단계는 비교적 쉬운 난이도로, 선수에 대한 직접적인 대표적인 별명 등, 플레이어가 선수를 맞추도록 유도하는 단계입니다.
저희가 각 방법으로 나온 유사 단어들을 분석해보니 다음과 같은 특징이 있었습니다:
- 동시 등장 행렬: 같은 종목 선수 이름, 종목 이름, 경기 장소 등 일반적인 내용
- Word2Vec, n-gram: 선수들의 별명, 관련 이슈 등의 보다 직접적인 내용
같은 종목 선수 이름, 종목, 경기 장소 등의 포괄적인 내용으로는 특정 선수를 유추하기 어려울 것으로 판단했고, 다음과 같은 난이도 설정 기준을 만들었습니다:
- 동시 등장 행렬 키워드 → 어려운 난이도
- Word2Vec, n-gram → 쉬운 난이도
다음은 게임의 진행을 그림으로 나타낸 결과입니다:
(* 선정 키워드는 Word2Vec 과 n-gram 중 괜찮은 단어를 팀원이 선정한 후 담은 리스트입니다.)
다음은 실제 게임 화면입니다:
평가 및 피드백
난이도를 설정하는 단계에서 좀 더 수리적이고 객관적인 지표를 만들어봤으면 어땠을까 하는 아쉬움이 있었습니다.
'[Deep daiv.] > [Deep daiv.] Deep Learning 입문 프로젝트' 카테고리의 다른 글
[Deep daiv.] 딥러닝 입문 프로젝트 (2) - 소설 쓰고 앉아 있네... (4) | 2024.11.04 |
---|