자연어처리(NLP) 14일차 (Word2Vec 실습)

정민수
6 min readJun 18, 2019

--

2019.06.17

출처 : https://wikidocs.net/book/2155

핵심키워드

  • Word2Vec

한국어 Word2Vec 만들기

이번에는 위키피디아 한국어 덤프 파일을 다운받아서 한국어로 Word2Vec을 직접 진행해보도록 한다. 영어와 크게 다른 점은 없지만 주의해야할 점이 하나 있다. 이미 전처리 챕터에서 언급했던 내용이지만, 한국어는 전처리가 중요하여 토큰화를 할 때 띄어쓰기 단위가 아니라 형태소 단위로 토큰화를 해야 임베딩의 좋은 성능을 얻을 수 있다. 간단히 말해서 형태소 분석기를 이용한다는 것이다.

1. 위키피디아 한국어 덤프 파일 다운로드

다운로드 : https://dumps.wikimedia.org/kowiki/latest/

위 링크에서 kowiki-latest-pages-articles.xml.bz2 파일을 다운 받는다. 해당 파일은 xml 파일이기 때문에 Word2Vec을 원활하게 진행하기 위해서는 텍스트 형식의 파일로 변환해줄 필요가 있다.

2. 위키피디아 익스트랙터 다운로드

해당 파일을 모두 다운로드 받았다면 위키피디아 덤프 파일을 텍스트 형식으로 변환시켜주는 오픈소스인 ‘위키피디아 익스트랙터’를 사용할 것이다.

‘위키피디아 익스트랙터’ 다운로드 : https://github.com/attardi/wikiextractor

3. 위키피디아 한국어 덤프 파일 변환

위키피디아 익스트랙터와 위키피디아 한국어 덤프 파일을 동일한 디렉토리 경로에 두고, 아래 명령어를 실행시키면 위키피디아 덤프 파일이 텍스트 파일로 변환된다.

python WikiExtractor.py kowiki-latest-pages-articles.xml.bz2

텍스트 파일로 변환된 위키피디아 한국어 덤프는 총 7개의 디렉토리(2019년 6월 기준)로 구성되어져 있다. AA ~ AG의 디렉토리로 각 디렉토리 내에는 wiki_00 ~ wiki_99라는 파일들이 들어있다. 각 파일들을 열어보면 이와 같은 구성이 반복되고 있다.

<doc id="문서 번호" url="실제 위키피디아 문서 주소" title="문서 제목">
내용
</doc>

예를 들어서 AA 디렉토리의 wiki_00 파일을 읽어보면, 지미 카터에 대한 내용이 나온다.

우리는 이 AA ~ AF 안의 wiki_00 ~ wiki_99 파일들을 word2vec의 편의를 위해 하나의 텍스트 파일로 통합할 것이다. (만약, 더 간단히 하고 싶다면 모든 디렉토리를 통합하지 않고, 하나의 디렉토리 내의 파일들에 대해서만 해도 통합 작업을 진행하면 속도를 단축시킬 수 있다. 하지만 보통 학습 데이터의 양이 많을 수록 Word2Vec의 성능이 올라가기 때문에 성능은 전체 파일에 대해서 진행한 경우보다 좋지 않을 수 있다.)

그럼 이제 AA ~ AG 안의 모든 wiki_00 ~ wiki_99 파일들을 하나의 텍스트 파일로 모으는 작업을 진행해보도록 하자. 작업은 각 디렉토리의 파일에 대해서 우선적으로 하나의 파일로 만든 다음에, 그렇게 생긴 7개의 파일을 하나의 파일로 만드는 순서로 진행할 것이다.

4. 훈련 데이터 만들기

a. 윈도우

우선 AA 디렉토리 안의 모든 파일인 wiki_00 ~ wiki_99에 대해서 wikiAA.txt로 통합해보도록 한다.

copy AA디렉토리의 경로\wiki* wikiAA.txt

해당 커맨드는 AA 디렉토리 안의 wiki로 시작되는 모든 파일을 wikiAA.txt로 복사하는 의미이다. 결과적으로 wiki_00~wiki_99 파일의 모든 내용이 wikiAA.txt로 복사되었다.

각 디렉토리에서도 동일하게 진행한다.

이렇게 되면 현재 경로에는 각 디렉토리의 파일들을 하나로 합친 wikiAA.txt 부터 wikiAG.txt라는 총 7개의 파일이 생겼다. 그럼 이제 이 파일들에 대해서도 하나의 파일로 합치는 작업을 진행한다.

copy 현재 디렉토리 경로\wikiA* wiki_data.txt

이제 모든 텍스트 파일을 하나로 만든 훈련 데이터가 완성되었다.

5. Word2Vec 작업

f = open('./wikiextractor-master/text/wiki_data.txt', encoding='utf8')

우선 파일을 불러왔다. 이제 줄 단위로 파일을 읽을 텐데, 파일이 정상적으로 읽히고 있는지 확인하기 위해 5개의 줄만 출력해보자.

i = 0
while True:
line = f.readline()
if line != '\n':
i += 1
print("%d번째 줄 :" %i + line)
if i == 5:
break
f.close()
1번째 줄 :<doc id="5" url="https://ko.wikipedia.org/wiki?curid=5" title="지미 카터">

2번째 줄 :지미 카터

3번째 줄 :제임스 얼 "지미" 카터 주니어(, 1924년 10월 1일 ~ )는 민주당 출신 미국 39번째 대통령 (1977년 ~ 1981년)이다.

4번째 줄 :지미 카터는 조지아주 섬터 카운티 플레인스 마을에서 태어났다. 조지아 공과대학교를 졸업하였다. 그 후 해군에 들어가 전함·원자력·잠수함의 승무원으로 일하였다. 1953년 미국 해군 대위로 예편하였고 이후 땅콩·면화 등을 가꿔 많은 돈을 벌었다. 그의 별명이 "땅콩 농부" (Peanut Farmer)로 알려졌다.

5번째 줄 :1962년 조지아 주 상원 의원 선거에서 낙선하나 그 선거가 부정선거 였음을 입증하게 되어 당선되고, 1966년 조지아 주 지사 선거에 낙선하지만 1970년 조지아 주 지사를 역임했다. 대통령이 되기 전 조지아주 상원의원을 두번 연임했으며, 1971년부터 1975년까지 조지아 지사로 근무했다. 조지아 주지사로 지내면서, 미국에 사는 흑인 등용법을 내세웠다.

정상적으로 출력되는 것을 볼 수 있다. 이제 본격적으로 Word2Vec을 위한 학습 데이터를 만들어보자.

from konlpy.tag import Okt
okt = Okt()
n = 0
result = []
with open('./wikiextractor-master/text/wiki_data.txt', encoding='utf8') as f_r:
for line in f_r:
if line:
n += 1
if n%5000 == 0: # 5,0000의 배수로 While문이 실행될 때마다
# 몇번째 while문인지 출력
print("%d번째 while문."%n)
tokenlist = okt.pos(line, stem=True, norm=True) #단어토큰화
temp = []
for word in tokenlist:
if word[1] in ["Noun"]: #명사일 때만
temp.append((word[0])) #해당 단어를 저장함
if temp: # 만약 이번에 읽은 데이터에 명사가 존재할 경우에만
result.append(temp)

여기서는 형태소 분석기로 KoNLPy의 Okt를 사용하였다. 한국어 Word2Vec을 할 때 가장 간단한 전처리 방법은 노이즈가 섞인 데이터로부터 한국어 명사만을 최대한 정확도가 높게 뽑아내는 형태소 분석기를 사용하는 것이다. 그런 면에서 형태소 분석기 Okt는 준수한 선택이다.

주피터 노트북으로 위 코드를 실행하면 커널이 자꾸 죽는데, 문제를 해결한 후에 다시 정리하도록 한다.

--

--

정민수
정민수

No responses yet