본문 바로가기

졸업프로젝트

한국어 기초사전 API를 사용하여 어휘문제 자동으로 만들기

어휘문제 만드는 단계는 총 3단계로 이뤄집니다.

1단계 : 지문에서 적절한 어휘 고르기

2단계 : 한국어 기초사전 API를 이용해서 필요한 어휘 정보 가져오기

3단계 : 문제와 보기 어휘 만들기


[ 어휘문제를 만들기 위해선 앞에 포스팅한 KoNLPY와 gensim 라이브러리가 필요합니다. 아직 설치를 안하셨다면 앞에 포스팅을 보면서 설치하시길 바랍니다. ]

1단계 : 지문에서 적절한 어휘 고르기

적절한 어휘를 선정하기 위해 "매체 교육 필수 어휘_3500자, 한국어 학습용 어휘목록"을 이용하여 어휘를 상(A),중(B),하(C) 별로 구분했습니다.

 

1.   출제 기준 어휘 나누기 

pandas 라이브러리를 이용해 excel 파일을 불러줍니다.

pd.read_excel(), 괄호 안에는 " 파일이 위치해 있는 경로 "를 작성해주세요.

df 파일을 출력해보면 다음과 같습니다.

 

다음 등급별로 어휘들을 나눠주겠습니다.

등급이 'A'인 열만 나오게 한 뒤 등급 열을 삭제해줍니다.

 

 

그 다음 데이터프레임을 리스트로 바꿔줍니다.

 

 

2차원 리스트인 listA를 1차원으로 변경해줍니다.

 

 

나머지 B,C 등급도 마찬가지로 진행해줍니다.

그 다음 만들어진 리스트를 각각 'A'등급만 있는 파일, 'B등급만 있는 파일, 'C'등급만 있는 파일로 저장합니다.


2.   출제 기준을 이용하여 지문 속 어휘 선정하기

원하는 지문을 하나 선택해 파일을 불러옵니다.

불러 온 파일을 KoNLPY를 이용해 "명사"로 토큰화합니다.

파일을 불러올 때 자신의 컴퓨터에 저장된 파일의 위치를 적어주세요.

encoding에러가 뜬다면 utf-8로 변경해보세요.

 

 

지문을 명사로 토큰화 한 데이터가 noun_list에 리스트 형식으로 저장되었습니다.

지문 파일을 불러온 방식대로 아까 저장한 어휘 등급 별 파일을 불러옵니다.

 

파일을 불러 온 뒤 리스트 안에 한개의 문자열로 되어있는 단어 배열을 분리합니다.

 

 

함수에 파라미터로 넣을 값은 어휘 등급 별 리스트 입니다.

( WORD_A_01은 A등급의 어휘들만 모은 리스트 입니다. + 같은 방식으로 B등급, C등급 어휘 리스트를 만들어주세요!)

그 다음 등급별 어휘와 지문에서 명사만 모은 noun_list를 이용하여 출제할 어휘를 선정하도록 하겠습니다.

출제할 어휘는 noun_list안에 등급별 어휘 리스트에 포함된 어휘만 해당됩니다.

 

 

파라미터 값 A01은 A등급 어휘 리스트이고 for문 안에 있는 WORD는 지문 속 명사만 모아둔 noun_list 입니다.

이렇게 지문과 출제 어휘 등급 리스트를 사용하여 출제할 어휘들을 추출했습니다.

어휘 추출 결과는 다음과 같습니다.

 

지문을 명사만 토큰화 한 리스트와 등급별 어휘 리스트를 이용하여 A등급에 해당하는 어휘 결과

 

이와 같이 B등급, C등급도 진행해주시고(진행하고 어휘 리스트 합쳐주세요) 다른 출제 기준 파일을 이용해서 해보세요!


2단계 : 한국어 기초사전 API를 이용해서 필요한 어휘 정보 가져오기

이제 한국어 기초사전 API를 이용해서 앞서 추출한 어휘에 대한 정보를 가져오겠습니다.

한국어 기초사전 API는 한국어 기초사전 사이트에서 얻을 수 있습니다. [ https://krdict.korean.go.kr/mainAction ]

1.    한국어 기초사전 회원가입 + 인증키 받기

먼저 회원가입을 한 후 하단 메뉴에 있는 개발지원(Open API)에 들어가서 오픈 API 사용을 신청한 다음 인증키를 받으면 됩니다.

 

 


2.   어휘 정보 파싱하기

그 후 단어 정보를 파싱하면 됩니다!

오픈 API 서비스 예시를 보면 XML 예제를 볼 수 있습니다. 이것을 참고해서 파싱하면 됩니다.

 

 

반박이라는 단어를 TEST함수에 넣어서 코드를 실행하면 parsing_result, example_result, similar_result 결과가 나옵니다.

 

parsing_result 결과 [ 단어의 코드와 단어, 뜻 ]

 

example_result 결과 [ 단어 코드, 단어의 용례 ]

 

similar_result 결과 [ 단어 코드, 유의어 ]

 

이제 TEST 함수를 이용하여 각각의 결과값을 이용해 어휘 문제를 만들어보겠습니다.


3단계 : 문제와 보기 어휘 만들기

이제 2단계에서 얻은 데이터들을 가지고 문제를 만들어보겠습니다.

1.   출제 어휘의 뜻과 예문, 유의어 데이터 만들기

parsing_result 데이터 값으로는 단어의 의미를 , example_result 데이터 값으로는 용례를, similar_result 값으로는 유의어를 가져와보도록 하겠습니다.

 

코드는 다음과 같습니다.

 

 

MEAN 함수는 parsing_result 값을 파라미터로 받아 뜻만 반환합니다.

EXAMPLE 함수는  example_result 값을 파라미터로 받아 예문을 반환합니다.

EXAMPLE_test는 EAMPLE의 리턴값을 받아 예문 속 해당 어휘가 포함된 부분을 빈칸으로 만들어 반한합니다.

SIMILAR 함수는 similar_result 값을 파라미터로 받아 유의어만 반환합니다.

 

 

REMOVE 함수는 반환할 때 불필요한 기호들을 제거해주는 함수입니다. 

함수들을 각각 사용해보고 불필요한 기호들이 포함되어 있다면 REMOVE 함수를 이용해 제거해주세요.

각각 함수들의 리턴값을 이용하면 

 

 

이렇게 뜻과 용례 빈칸, 유의어들을 깔끔하게 얻을 수 있습니다.


2.   출제 어휘 문제의 보기 어휘 만들기 [ Word2Vec 사용]

객관식 문제에 사용할 보기어휘들을 만들어 보겠습니다.

문제의 퀄리티가 높으려면 정답어휘와 매우 유사하면서 또 매우 동떨어지지 않은 어휘들을 골라야합니다.

그렇다면 어떻게 자동으로 보기 어휘들을 만들 수 있을까요?

여기서 사용되는 알고리즘은 바로 Word2Vec 알고리즘 입니다.

 

그럼 Word2Vec 알고리즘은 무엇일까요?

Word2Vec알고리즘은 간단히 말해 단어 벡터 간 유의미한 유사도를 반영할 수 있도록 단어의 의미를 수치화한 것입니다. 

자세한 설명은 옆에 사이트에 들어가 확인해 보세요. [ https://wikidocs.net/22660 ]

 

Word2Vec을 하기 위해서는 많은 데이터셋이 필요하며, 이 데이터셋을 학습시켜야합니다. 하지만 많은 데이터셋 구하기와 학습시키는데는  시간이 많이 걸립니다. 여기서 우리는 많은 데이터 셋을 미리 학습시킨 데이터를 이용하도록 하겠습니다.

한국어를 미리 학습시킨 Word2Vec 모델은 "박규병"님이 공개한 데이터셋을 이용하도록 하겠습니다.

"박규병"님이 학습시킨 모델 설명은 "https://github.com/Kyubyong/wordvectors" 여기 github에 들어가 확인하시길 바랍니다.

모델은 "https://drive.google.com/file/d/0B0ZXk88koS2KbDhXdWg1Q2RydlU/view  여기 링크로 들어가 다운로드 받길 바랍니다. ko.zip파일을 다운로드 받아서 압축을 풀면 ko.bin이라는 파일이 있습니다. 우리는 이 파일을 이용하여 단어 유사도를 계산해보겠습니다.

 

 

"반박"이라는 어휘에 대한 유사한 어휘들이 다음과 같이 나왔습니다.

이렇게 나온 결과를 이용해 바로 보기 어휘로 문제를 만들 수 있지만 우리는 한단계 더 나아가 다른 데이터도 추가하여 Word2Vec해보겠습니다.


+ Word2Vec 추가 학습 시키기

저는 공공 뉴스데이터를 이용하여 추가 학습 시켰습니다.

 

 

추가로 이용할 데이터들을 사전처리 해줍니다.

그 후 전처리된 데이터들을 기존 데이터에 합하여 학습시킵니다.

 

 

새로운 데이터까지 학습시킨 word2vec파일을 ko_new.bin 파일로 저장하고 이 파일을 이용하여 보기 어휘문제를 출제하겠습니다.


추가 학습시킨 ko_new.bin 파일을 이용해 "반박" 어휘에 대한 word2vec 결과를 보겠습니다.

 

 

앞에 한 결과와 차이가 없지만 다른 어휘들을 넣어서 한번 확인해보시면 약간의 차이를 확인할 수 있습니다.

그러면 우리는 정답 어휘와 이 보기 어휘들을 가지고 선지를 만들어 보겠습니다. 

정답 어휘를 제외하고 word_list에서 4개의 어휘만 가져오면 됩니다.

 

 

Word2Vec한 결과의 리스트에서 랜덤하게 4개의 어휘를 뽑을 수 있도록 코드를 짰습니다.

또한 보기 어휘들의 뜻도 알 수 있게끔 다음과 같이 코드를 짜 보기 어휘 뜻들도 추출해줍니다.

 


3.   JSON파일로 문제 유형과 정답, 선지, 해설 만들기

이제 json파일을 이용하여 문제 유형과 정답, 선지, 해설을 만들겠습니다.

앞선 코드를 이용하여 모든 데이터들을 불러오겠습니다.

 

다음과 같이 json파일을 만들어 줍니다.

 

 

word는 추출한 어휘

test는 추출한 어휘에 대한 문제 -> EXAMPLE_test(word)

mean은 추출한 어휘의 뜻 -> MEAN(word)

w2v_word는 추출한 어휘를 word2vec한 결과 -> W2V(word)

w2v_mean은 보기어휘들의 뜻 -> W2V_mean(w2v_word)

이렇게 데이터들을 json파일로 묶어 줍니다.

 

 

그러면 위와 같이 하나의 데이터로 묶여 나중에 편하게 이용할 수 있습니다! (웹서버로 올릴 때 데이터 하나씩 전달하기 쉬움)

 


이제 한국어 기초사전 API를 이용해서 어휘문제를 자동으로 만드는 방법을 모두 설명했습니다.

문제 유형은 용례 빈칸 문제 말고도 유의어 문제, 동음이의어 문제, 어휘의 사전적의미 문제들을 만들 수 있습니다.

위의 코드들을 보며 다양하게 응용해서 문제를 만들어 보세요 :)


 

+ 사용한 라이브러리

from konlpy.tag import Kkma

from gensim.models import Word2Vec

import itertools

import json

from collections import OrderedDict

import requests

from bs4 import BeautifulSoup

import random

 

 + 동음이의어 문제의 경우 target code가 두개 이상인 데이터들만 추출하면 됩니다.