자연어처리 - Tokenizing

Dae Hee Lee·2021년 7월 21일
0

NLP-tensorflow2

목록 보기
3/10
post-thumbnail

자연어처리의 목적은 결국 인간이 살아가면서 접할 수 있는 모든 형태의 언어, 즉 자연어를 기계가 이해하고 이를 활용하는데에 있을 것이다. 다시 말하면 자연어처리에서 중요한 것 중 하나는 바로 텍스트 데이터에 대한 정보를 단위별로 나누는 것에 있을 것이다. 우리는 이를 토크나이징(Tokenizing)이라고 부른다.

간단하게 예를 들면, 영화 한줄평 리뷰라면 데이터를 한 줄씩 입력받아 분석하는 것이 일반적일 것이다. 이러한 토크나이징은 당연히 언어의 특성에 따라 달라지므로 한글과 영어의 토크나이징 방식은 매우 다르다. 예를 들면 한글은 영어와 달리 초성-중성-종성 이 있고, 이를 음소 단위로 토큰화해서 분석할 수도 있다.

영어 토크나이징 방식은 NLTK(natural language toolkit)Spacy 두 가지가 있다.

NLTK

커맨드 환경이나 주피터노트북에서 다음과 같이 설치한다.

conda install nltk

그 다음 말뭉치를 다운로드 받아야한다. '말뭉치'라는 건 자연언어 연구를 위해 특정한 목적을 가지고 언어의 표본을 추출한 집합으로, 확률/통계적 기법시계열적인 접근으로 전체를 파악한다. 언어의 빈도와 분포를 확인할 수 있는 자료이며, 현대 언어학 연구에 필수적인 자료이다.

여기서는 ‘all-corpora’를 다운받도록 하겠다. 참고로 저장공간이 넉넉하지 않다면 구글 colab에서 진행하는 것이 오히려 편하고 나중에 GPU를 활용할 수 있어 더 나을 수 있다.

import nltk
nltk.download('all-corpora')

단어 토크나이징 방식은 다음과 같다.

from nltk.tokenize import word_tokenize

sentence = "Natural language processing (NLP) is a subfield of computer science, information engineering,and artificial intelligence concerned with the interactions between computers and human (natural) languages, in particular how to program computers to process and analyze large amounts of natural language data."

print(word_tokenize(sentence))
['Natural', 'language', 'processing', '(', 'NLP', ')', 'is', 'a', 'subfield', 'of', 'computer', 'science', ',', 'information', 'engineering', ',', 'and', 'artificial', 'intelligence', 'concerned', 'with', 'the', 'interactions', 'between', 'computers', 'and', 'human', '(', 'natural', ')', 'languages', ',', 'in', 'particular', 'how', 'to', 'program', 'computers', 'to', 'process', 'and', 'analyze', 'large', 'amounts', 'of', 'natural', 'language', 'data', '.']

특수문자를 따로 구분하며, 띄어쓰기 기준으로 단어별로 구성되어 있다.

경우에 따라 단어가 아닌 문장으로 먼저 나눠서 진행할 수 있다. 이 때 문장 토크나이징을 사용하고 문장 토크나이징 방식은 다음과 같다.

from nltk.tokenize import sent_tokenize

paragraph = "Natural language processing (NLP) is a subfield of computer science, ...(중략)"

print(sent_tokenize(paragraph))

nltk의 경우 토크나이징 외에 다양한 자연어처리 기능들이 있다. 대표적으로 Stopwords라고 하는 불용어를 제거하는 기능이 있는데, 불용어란 영어에서 is, the, a 와 같이 큰 의미를 가지지 않는 단어를 말한다. 이러한 불용어 또한 사전을 구축해놓고 내장된 불용어 사전을 불러와 활용하는 방식으로 사용할 수 있다.

spacy

spacy또한 nltk와 같은 오픈소스 라이브러리로 그 목적이 교육이나 연구 목적인 nltk와 달리 상업용으로 만들어진 것이 특징이다.

다음과 같이 설치한다.

conda install spacy

역시 언어 데이터 자료를 추가적으로 다운로드 받아야한다.

python -m spacy download en

spacy가 가지는 nltk와의 가장 큰 차이는 바로 객체를 생성한다는 점이다. spacy를 사용하여 구문 분석된 객체를 생성하고, 여기서 단어 또는 문장 토크나이징을 선택해서 진행할 수 있다. 이 방법을 쓰는 이유는 이 객체를 통해 토크나이징에서 그치는 것이 아니라 다른 다양한 자연어 전처리에 활용할 수 있기 때문이다. 사용방법은 다음과 같다.

#라이브러리 불러오기
nlp = spacy.load('en_core_web_sm')

sentence = "Natural language processing (NLP) is a subfield of computer science, information engineering, and artificial intelligence concerned with the interactions between computers and human (natural) languages, in particular how to program computers to process and analyze large amounts of natural language data."

#변수 할당
doc = nlp(sentence)

#단어 토큰화
word_tokenized_sentence = [token.text for token in doc]
print(word_tokenized_sentence)

#문장 토큰화
sentence_tokenized_list = [sent.text for sent in doc.sents]
print(sentence_tokenized_list)

여기까지 영어 토크나이징 방법을 알아보았다. 앞서 이야기했지만, 언어의 특성에 따라 토크나이징 방식은 달라질 수 있기 때문에 한글과 영어는 다른 토크나이징 라이브러리를 사용하고 있다. 지금부터는 한국어 토크나이징 라이브러리 KoNLPy에 대해 알아보겠다.

'한글'이라는 문자와 '한국어'라는 언어는 세계적으로 보편성을 지닌 언어는 아니다. 하지만 한글이라는 과학적인 언어를 스스로 만들어 사용하고 있다는 것은 세계적으로도 인정받는 일 중의 하나이고, 한국이 워낙 인터넷 친화적인 문화 양상을 가진 나라다 보니 그만큼 발생하는 텍스트 데이터도 많아 자연어처리 개발자로서 한국어 기반의 분석 역시 흥미있게 생각하고 있다.

KoNLPy

koNLPy에 따르면 '코엔엘파이'라고 부른다. 대표적인 한글 자연어 처리 라이브러리이며, 한글 자연어 처리에서 형태소 분석을 가능하게 하는 라이브러리이다.

가장 먼저 설치하는 방법은 Windows와 MacOS의 설치 방법이 다르다. 필자는 MacOS를 사용하고 있으므로 Windows의 설치 방법은 링크를 걸어놓도록 하겠다. 자바를 먼저 다운로드하고 KoNLPy를 설치하는 것이 차이점이다.

MacOS는 다음과 같이 간단하게 KoNLPy를 설치할 수 있다.

pip3 install konlpy

import konlpy

KoNLPy는 기존에 C나 JAVA 언어로 제작된 형태소 분석 라이브러리들을 파이썬 라이브러리로 통합해서 사용할 수 있게 만들었고, 다음과 같은 형태소 분석기들이 객체 형식으로 포함되어 있다.

  • Hannanum
  • Kkma
  • Komoran
  • Mecab
  • Okt(전 Twitter)

사용법은 대체적으로 비슷하므로, Okt사용법에 대해 알아보겠다.

먼저 라이브러리를 불러온 다음 객체를 생성한다.

import konlpy

okt = Okt()

Okt객체는 4개의 함수를 지원한다.

  • okt.morphs()
    텍스트를 형태소 단위로 나누는 함수로, 기본 옵션은 norm과 stem이 False로 설정된다. norm은 문장을 정규화하는 기능, stem은 단어에서 어간을 추출하는 기능이다.
  • okt.nouns()
    텍스트에서 명사만 뽑아낸다.
  • okt.phrases()
    텍스트에서 어절을 뽑아낸다.
  • okt.pos()
    텍스트 데이터에 품사를 태깅하는 역할을 한다. 품사를 태깅한다라는 말은 텍스트를 형태소 단위로 나누고, 나눠진 형태소들을 해당하는 품사와 함께 리스트화하는 것을 의미한다.
text = "한글 자연어 처리는 재미있어서 좋다"
print(okt.morphs(text)) # 형태소 단위 추출
print(okt.morphs(text, stem=True)) # 형태소 단위로 나눈 후 어간을 추출
print(okt.nouns(text)) # 명사 추출
print(okt.phrases(text)) # 어절 추출
['한글', '자연어', '처리', '는', '재미있어서', '좋다']
['한글', '자연어', '처리', '는', '재미있다', '좋다']
['한글', '자연어', '처리']
['한글', '한글 자연어', '한글 자연어 처리', '자연어', '처리']

품사 태깅 함수 pos를 사용할 때 join값을 주면 형태소와 품사를 붙여서 출력하는 기능이 있다.

print(okt.pos(text))
print(okt.pos(text, join=True)) # 형태소와 품사를 붙여서 리스트화
[('한글', 'Noun'), ('자연어', 'Noun'), ('처리', 'Noun'), ('는', 'Josa'), ('재미있어서', 'Adjective'), ('좋다', 'Adjective')]
['한글/Noun', '자연어/Noun', '처리/Noun', '는/Josa', '재미있어서/Adjective', '좋다/Adjective']

이 밖에도, KoNLPy를 활용하여 한국어 데이터를 불러와 단어 임베딩이나 형태소 분석 등을 연습할 수도 있다.

from konlpy.corpus import kolaw
from konlpy.corpus import kobill

kolaw.open('constitution.txt').read()
#1809890~1809899
kobill.open('1809890.txt').read()

여기까지 토크나이징 방법을 알아보았다. 이제 자연어 처리 개발 준비는 끝났고, 다음 글은 본격적인 자연어처리를 시작하기에 앞서 자연어 처리의 전반적인 개요에 대해서 이야기해보려 한다.

profile
Today is the day

0개의 댓글