본문 바로가기
R

파이썬에서 형태소 분석 후 R로 넘겨주기 - 자연어 처리 고수되기 1탄

by 코딩하는 시인 2021. 2. 23.
반응형

자연어 처리

슬기로운통계생활에서는 R을 중심으로 여러 멤버들이 칼럼을 작성 중입니다. 그런데 '왜 갑자기 Python 이야기인가' 궁금해할 분들이 많을 것입니다. 여기서 Python을 언급한 이유는 자연어 처리(Natural language processing)에서 가장 중요한 과정인 형태소 분석(Morphological analysis) 때문입니다. 잠시 자연어 처리를 이야기하자면 컴퓨터에게 인간의 언어를 이해시키려면 인간의 언어(자연어)를 컴퓨터가 이해할 수 있는 형태로 변환하는 과정이 필수적입니다. 예컨대 인공지능 스피커에게 우리가 말을 하면, 인공지능 스피커는 우리가 한 말을 통으로 인식할 수 없습니다. 알고리즘에 따라 다르겠지만, 인간이 말한 문장을 부분부분 끊어서(분절화) 인식합니다. 왜냐하면 인간의 말은 그 자체로 디지털화가 되지 않은 아날로그 상태의 자연어이기 때문이죠.

 

기계에게 아무리 말을 해도 기계는 모릅니다. 기계가 알아듣도록 바꿔줘야 하죠. :)

형태소 분석

여기서부터 형태소 분석 개념이 등장합니다. 대한민국 고교 과정을 정상적으로 이수한 사람이라면 누구나 배운 '형태소'라는 것이 있습니다 (국어 시간에 배우지만 모두가 까먹었겠죠). 형태소는 언어학에서 의미가 있는 최소한의 단위를 뜻합니다. 즉 인공지능 스피커에게 '철수한테 전화 걸어'라고 말했을 때, 스피커는 ['철수', '한테', '전화', '걸', '어'] 이렇게 형태소 단위로 분절한 후 인식합니다. 물론 개발자나 연구자가 알고리즘에 입력할 형태소를 '명사'로만 제한한다거나, 몇몇 단어는 불용어(stopwords)로 삭제한다거나 하는 선택이 가능하지만요.

 

정리하자면 자연어 처리든 텍스트에서 인사이트를 뽑아내는 텍스트 마이닝(Text mining)이든 텍스트를 형태소 단위로 분절화하는 과정이 가장 중요한 일입니다. 그렇지 않으면 컴퓨터가 인식하지 못하니까요. 특히 한국어의 경우 조사가 계속 첨가되고, 띄어쓰기도 복잡해서 고성능의 형태소 분석기가 꼭 필요합니다.

형태소 분석기 in Python

다시 R과 Python 이야기로 돌아오겠습니다. 저는 R과 Python을 모두 활용하는 연구자이지만 R에서 선택할 수 있는 형태소 분석기 폭이 좁아 형태소 분석이 필요할 경우는 Python을 활용합니다. 제가 추천하는 형태소 분석기는 kiwikhaiii이며 여러 형태소 분석기를 동시에 사용할 수 있는 konlpy도 추천합니다. kiwi와 khaiii를 추천하는 이유는 현재 업데이트가 계속 이뤄지는 패키지이며, 특히 kiwi의 경우 미등록 단어 추출 등 추가 함수를 제공하기에 활용성이 높습니다. khaiii는 딥러닝 기반의 형태소 분석이 가능하고요. 또한 최근 카카오 브레인에서 출시한 pororo의 경우 4개의 언어(한국어/중국어/일본어/영어)를 종합적으로 지원하는 자연어 처리 패키지로 단순 형태소 분석 뿐만 아니라 개체명 인식(NER), OCR 등 다양한 기능을 지원하기에 추천합니다.

 

물론 R에서도 MeCab-ko 기반의 NLP4kec 혹은 RcppMeCab 등의 패키지가 있지만, 두 패키지의 기반이 되는 MeCab-ko는 현재 최신 버전 업데이트가 없고 다른 형태소 분석기를 사용하고 싶을 때 곤란한 경우가 많습니다. 따라서 이번 칼럼에서는 Python에서 형태소 분석 완료한 결과물을 R의 reticulate 패키지를 활용해 불러오는 과정을 살펴보려 합니다.

 

R과 Python은 친구입니다.

pickle 파일 저장

일단 Python에서 형태소 분석한 결과가 있는 pandas의 DataFrame 변수를 pickle로 저장해야 합니다. pickle은 R의 RData 확장자처럼 복수의 변수를 파일로 저장해 필요할 때마다 꺼내 쓰는 기능을 제공합니다.

예: 네이버 영화평 텍스트

아래처럼 DataFrame이 구성됐다고 가정해봅시다. text 컬럼에는 형태소 분석 전의 텍스트가 있고, token 컬럼에는 형태소 분석 결과가 list 형태로 저장됐습니다.

id text token
1 '뭐 이런 영화를 보냐? 비추' ['뭐', '이런', '영화', '를', '보', '냐', '?', '비추']
2 '저는 강추합니다. 빠른 스토리 전개와 괜찮은 연기' ['저', '는', '강추', '합니다', '.', '빠르', '스토리', '전개', '와', '괜찮, '은', '연기']
... ... ...

이제 df라는 변수를 pickle 파일로 저장하겠습니다. 이때 주의할 점은 Python의 가상 환경 (여기서는 conda로 설명)과 RStudio의 python 가상환경이 동일해야 한다는 것입니다. 이를테면 Python에서 nlp라는 conda 가상환경 (python 3.7) 위에서 pickle 파일을 저장했다면, RStudio에서도 동일한 nlp 가상 환경을 이용해야 합니다.

import pickle

with open('df.pickle','wb') as f:
    pickle.dump(df,f)

reticulate 환경 설정

RStudio의 최신 버전(1.4 이상) 설치하면 Tools→Gloabl Options 메뉴에서 Python 메뉴가 생긴 것을 알 수 있습니다. 여기서 RStudio의 Python 가상 환경을 설정할 수 있습니다. 위 pickle 파일을 저장했을 때와 동일한 가상환경을 설정하십시오. 저는 Conda 환경을 활용했고, nlp라는 가상환경을 설정해두었습니다.

pickle 파일 R에서 불러오기

이제 reticulate 패키지를 활용해 pickle 파일을 R로 불러와야 합니다.

# 라이브러리 로드
library(reticulate)
library(data.table)

# Python 환경 확인
py_config()

# Python 변수 R로 불러오기
df <- data.table(py_load_object('df.pickle'))

# 불러온 변수 확인
summary(df)

reticulate 패키지의 py_load_object 함수를 활용합니다. Python에서 저장한 df.pickle 파일을 불러오면 됩니다. data.table 함수에 해당 변수를 투입한 것은 형태소 분석 결과가 대용량 파일일 경우가 많은데, data.table 패키지가 대용량 파일을 훨씬 잘 다루기 때문입니다. tibble이나 data.frame 형식을 좋아하시면 해당 함수를 활용하셔도 됩니다.

 

해보시면 생각보다 간단하게 Python의 변수를 R에서 불러올 수 있습니다. 단, 아직 reticulate가 불완전하기 때문에 py_load_object 함수를 불러오다가 R이 멈추는 경우도 있었고, Python과 R의 conda 가상 환경이 달라 고생한 기억도 있습니다. 하지만 같은 가상 환경을 설정해준다면 Python에서 형태소 분석기를 돌린 결과를 R에서 바로 활용할 수 있습니다.

텍스트 마이닝 in R

실제로 저는 Python으로 거의 모든 형태소 분석과 텍스트 전처리(불용어 처리, 정규표현식 등)를 끝내놓고 R에서는 Structural topic model 같이 Python에서 없는 텍스트 마이닝 패키지를 활용 중입니다. 많은 분들이 Python과 R 중에 무엇을 공부해야 하는지 고민하시는데요, 저는 이렇게 대답합니다. 둘 중에 하나로 입문하시되, 결국 두 언어 모두 공부해야 한다. Python에만 있는 패키지도 있고, R에만 있는 패키지도 있기 때문이죠. 그리고 이미 두 언어를 혼합해서 개발할 수 있는 환경은 충분히 구축돼 있습니다. 다음 시간에는 앞에서 언급한 구조적 토픽 모델링 (Structural topic model)을 한번 다뤄보겠습니다. R에만 있는 매우 매우 유용한 텍스트 마이닝 패키지입니다.

 

🌱 필자소개 Byungjun Kim (코딩하는시인)

📝활동 장소

 

ByungjunKim - Overview

디지털인문학/텍스트마이닝 연구자. ByungjunKim has 8 repositories available. Follow their code on GitHub.

github.com

Photo by Icons8 Team on Unsplash

반응형

댓글