본문 바로가기

Projekte

00. 데이터 가공하기

단어 학습 웹 프로젝트를 위해, 영어 단어 데이터를 가공했다.

먼저 가공했던 데이터는 교육부 지정 영어단어(초/중고/전문 세 가지로 분류됨)

 

https://ncic.go.kr/mobile.dwn.ogf.inventoryList.do#

 

NCIC 국가교육과정 정보센터

 

ncic.go.kr

2015년 개정시기 -> 중학교(2016.09) -> 영어과에서 가져온 데이터 셋을 엑셀로 가공했다.

해당 pdf파일에는 아무것도 없는 것(전문), *(초등), **(중고등), 등 세가지로 난이도를 구별해두었다.

 

이것을 엑셀 파일로 변경해둔 파일이 있어 가져와 사용하게 되었다

교육부_3천단어_수정본.xls
0.35MB

import pandas as pd

# XLS 파일 경로 설정
xls_file_path = 'vocab.xls'

# XLS 파일 읽기
df = pd.read_excel(xls_file_path)

#필요없는 열 제거
df = df.drop('no', axis=1)
df2 = df.drop('변형1', axis=1)
df2 = df2.drop('변형2', axis=1)

이렇게 하면 꽤 신뢰성 있는 데이터 완성

vocab2.xlsx
0.08MB


하지만 약 3000개이기 때문에 데이터 추가가 필요해보인다.

 

위의 데이터는 사실 가공해둔 데이터 셋이기 때문에 영단어 데이터 셋을 찾아 직접 가공해보는 과정이 필요할 듯 하다.

그래서 새로운 영단어 데이터 셋을 다운받아 가공했다.

word-meaning-examples.csv
7.52MB

크게 흐름은 전처리 » 해석 » 난이도 분석이다.

 

1. 전처리

1-1. 파일 읽기

import pandas as pd
import nltk
from nltk.tokenize import word_tokenize
from googletrans import Translator

# CSV 파일 경로 설정
csv_file_path = 'word-meaning-examples.csv'  # CSV 파일의 경로와 파일 이름을 지정합니다.

# CSV 파일 읽기
df = pd.read_csv(csv_file_path)

먼저 csv 파일을 읽는다.

 

1-2. 중복 제거

df = df.drop_duplicates()

 

1-3. 필요없는 데이터 제거

df2 = df.iloc[:, :2] #2번째 열부터 끝까지의 열 제거
df2 = df2.drop('Meaning',axis=1) #영어로 해석된 열 제거

 

1-4. NaN 제거

df = df.dropna()

 

데이터 전처리가 완료되었다.

필요하지 않은 데이터 및 중복, 비어있는 값(NaN)등을 제거해주었다.

 

2. 단어 해석

2-1. googletrans

from googletrans import Translator
# Translator 객체 생성
translator = Translator()

# 번역할 열 이름 설정
source_column_name = 'Word'

# 번역된 결과를 저장할 열 이름 설정
translated_column_name = 'Translated_Meaning'

# 엑셀 파일의 각 행에 대해 번역 수행
for index, row in df2.iterrows():
    english_text = row[source_column_name]
    if pd.notna(english_text):  # NaN이 아닌 경우에만 번역 수행
        translation = translator.translate(english_text, src='en', dest='ko')
        df.at[index, translated_column_name] = translation.text

# 번역된 결과를 엑셀 파일에 저장
output_excel_path = '번역된_엑셀_파일.xlsx'
df.to_excel(output_excel_path, index=False)

print(f'번역된 엑셀 파일을 {output_excel_path}에 저장했습니다.')

구글 Translator Api를 이용해 해석했다.

결과물은 무난했으나 이상하게 번역된게 발견되었다.

Crept 같은 경우 크립트. 라고 그대로 읽은 채로 해석되었다.

그래서 다음 단계인 난이도 분류겸 wordnet에 해당 단어의 정보가 없으면 삭제하기로 했다.

 

2-2. wordnet

import pandas as pd
import nltk
from nltk.corpus import wordnet

# WordNet 데이터를 다운로드합니다.
nltk.download('wordnet')

# 난이도를 계산하는 함수 정의
def calculate_difficulty(word):
    synsets = wordnet.synsets(word)
    if synsets:
        # WordNet의 synset 수를 기반으로 난이도를 계산합니다.
        synset_count = len(synsets)
        if synset_count <= 2:
            return 2
        elif synset_count <= 5:
            return 1
        else:
            return 0
    else:
        # WordNet에 해당 단어의 정보가 없으면 난이도를 3으로 설정합니다.
        return 3

# 난이도 열 추가 및 계산
df['difficulty'] = df['Word'].apply(lambda word: calculate_difficulty(word))


# 결과를 엑셀 파일에 저장
output_excel_path = '난이도_포함_엑셀_파일.xlsx'
translated_df.to_excel(output_excel_path, index=False)

print(f'난이도를 포함한 엑셀 파일을 {output_excel_path}에 저장했습니다.')

wordnet에 나타나는 빈도가 높으면 쉬운 단어, 즉 level이 낮아지는 것으로 설정해뒀다.

 

df = df[df['difficulty']!=3]

해당 단어의 정보가 없으면(난이도가 3이면) 데이터 삭제해주기

 

그러나 사실 "빈도"라는 것이 절대적인 난이도의 척도가 되지 않기 때문에 부정확한 결과가 나올 것이다.

혹시 몰라 비교해보니 첫번째 데이터셋과 두번째 데이터셋의 같은 단어를 비교해봤다. 같은 단어이지만 난이도가 다르게 나온 경우도 많았다.

그래서 wordnet으로 난이도 구하기는 사실상 실패..! ㅠㅠ 

 

2-3. 시각화

의미있는 작업인지는 모르겠지만 개인적으로 재밌었던 작업

데이터셋의 난이도가 균등하다고 가정하고 해보았다.(중요)

import matplotlib.pyplot as plt

# "new_difficulty" 열에서 각 숫자의 빈도를 계산
difficulty_counts = df['difficulty'].value_counts().sort_index()

# 막대 그래프로 시각화
plt.bar(difficulty_counts.index, difficulty_counts.values)
plt.xlabel('new_difficulty 값')
plt.ylabel('빈도')
plt.title('new_difficulty')
plt.xticks(difficulty_counts.index)
plt.xlim(0,20)
plt.show()

전처리 후 데이터 수가 약 8000개였으므로 1/3으로 나누기 위해 분류하였다.

그래서 wordnet 데이터 셋을 이용했을 때

synset_count가 2이하면 Level 0,

5이하면 Level 1,

그 외 나머지는 Level 2로 분류하는 것이 옳았던 것을 알 수 있다.

(다만 가정 자체가 말이 안되기 때문에 신뢰도는 없다. 분포가 고른 데이터를 만났을 때 같은 방법을 사용한다면 유용하게 써먹을 수 있을 듯 하다.)

 

결론 : 난이도는 상당히 주관적이므로 학습이 어려울 것 같다. 빈도로 난이도를 따지는 것은 매우 정확도가 떨어진다.

다만 인공지능이 주가 아니라, 데이터 분석의 목적으로써는 Nice Try..