본문 바로가기

Natural_Language

[NLP] 02. 자연어 처리 개발 준비 - 자연어 토크나이징 도구/전처리

반응형

자연어 처리에는 다양한 토크나이징도구들이 있는데

이번에는 자연어 토크나이징 도구를 살펴 볼 예정

 

 

자연어 토크나이징 도구

토크나이징이란,

입력 정보(문장 또는 발화)를 하나의 특정 기본 단위로 자르는 것

// 영어 토크나이징 라이브러리

- 여기서는 영어 토크나이징 작업을 수행할 수 있는 라이브러리를 소개한다.

=== NLTK ===

- 파이썬에서 영어 텍스트 전처리 작업을 하는데 많이 쓰이는 라이브러리이다.

- 50여 개가 넘는 말뭉치 리소스를 활용해 영어 텍스트를 분석할 수 있게 제공한다.

 

# 라이브러리 설치

conda install nltk

import nltk
nltk.download()

- nltk는 단순히 라이브러리를 설치한다고 해서 바로 토크나이징 할 수 없다. 말뭉치를 다운받아야한다.

- 토크나이징을 위해 'all-corpora' 말뭉치를 다운받는다.

 

 

# 단어 단위 토크나이징

from nltk.tokenizer import word_tokenize

sentence = "영어 문장 입력"

word_tokenize(sentence)

- word_tokenize 함수를 사용하면 입력한 문장이 단어 단위로 구분되어 리스트로 출력된다.

 

 

# 문장 단위 토크나이징

from nltk.tokenize import sent_tokenize

sentence = "영어 문장 입력"

sent_tokenize(sentence)

- sent_tokenize 함수를 사용하면 자동으로 문장기준으로 나눠준다.

 

 

# 텍스트 데이터 전처리

- nltk 라이브러리는 불용어 사전이 내장돼 있어서 따로 불용어를 정의할 필요없이 바로 사용 가능하다. 

 

=== Spacy ===

- NLTK와 같은 오픈소스 라이브러리이다.

- 주로 교육, 연구목적이 아닌 상업용 목적으로 만들어졌다는 점에서 다른 목적으로 만들어진 라이브러리이다.

- 현재 영어를 포함한 8개 국어에 대한 자연어처리 모듈을 제공한다.

 

 

// 한글 토크나이징 라이브러리

=== KoNLPy ===

- 한글 자연어 처리를 쉽고 간결하게 처리할 수 있도록 만들어진 오픈소스 라이브러리이다.

 

# 라이브러리 설치

pip install JPype1-0.63-cp36-cp36m-xin_amd64.whl
pip install konlpy

- 1.7버전 이상의 자바가 설치되어있어야한다

- JAVA_HOME으로 환경변수를 만들고 경로는 자바가 설치된 경로로 지정

- 0.5.7버전 이상의 JPype1을 설치해야한다.

- 그 다음에 konlpy를 설치한다.

 

 

# 형태소 단위 토크나이징

- 한글 텍스트의 경우에는 형태소 단위 토크나이징이 필요할 때가 있다.

- 각 형태소 분석기는 클래스 형태로 돼 있고, 이를 객체로 생성한 후 매서드를 호출해서 토크나이징

 

 

# 형태소 분석 및 품사 태밍

- 형태소란, 의미를 가지는 가장 단위로서 더 쪼개지면 의미를 상실하는 것들이다.

- 형태소 분석기 목록

Hannanum / Kkma / Komoran / Mecab / Okt(Twitter)

위 객체들은 모두 동일하게 형태소 분석 기능을 제공하는데, 각기 성능이 조금씩 다르다.

- 그중 하나인 Okt를 사용해서 예제를 실행

 

 

# Okt 형태소 분석기

from konlpy.tag import Okt

#객체 생성
okt = Okt()

1. okt = Okt()

- 객체 생성

 

2. okt.morphs()

- 텍스트를 형태소 단위로 나눈다. 옵션으로는 norm과 stem이 있다 

- norm은 normalize의 약자로 문장을 정규화하는 역할

- stem은 각 단어에서 어간을 추출하는 기능

 

3. okt.nouns()

- 텍스트에서 명사만 뽑아낸다.

 

4. okt.phrases()

- 텍스트에서 어절을 뽑아낸다.

 

5. okt.pos()

- 각 품사를 태깅하는 역할. 

- 품사를 태깅한다는 것은 주어진 텍스트를 형태소 단위로 나누고, 나눠진 각 형태소를 그에 해당하는 품사와 함께 리스트화 하는 것을 의미한다. 

 

 

# 실제 사용

text = "한글 자연어 처리는 재밌다. 이제부터 열심히 해야지ㅎㅎㅎㅎ"

okt.morphs(text)
okt.morphs(text, stem = True)

- okt.morphs(문장) : 텍스트를 형태소 단위로 나눠준다.

- okt.morphs(문장, stem =True) : 텍스트를 형태소 단위로 나누는데, 이때 각 단어에서 어간을 추출한다.

 

결과 창

 

text = "한글 자연어 처리는 재밌다. 이제부터 열심히 해야지ㅎㅎㅎㅎ"

okt.nouns(text)
okt.phrases(text)

- okt.nouns(text) : 명사만 추출

- okt.phrases(text) : 어절단위로 나눠서 추출

 

결과 창

 

text = "한글 자연어 처리는 재밌다. 이제부터 열심히 해야지ㅎㅎㅎㅎ"

okt.pos(text)
okt.pos(text, join=True)

- okt.pos(text) : 품사태깅을 하는 함수

- okt.post(text, join=True) : join=True로 주면 형태소와 품사가 함께 나온다.

 

결과 창

 

 

그 밖의 라이브러리(전처리)

Numpy_넘파이

- 빠르고 효율적인 계산을 위해 만들어진 파이썬 라이브러리이다.

- 고성능의 다차원 배열 객체와 이러한 배열을 계산할 효율적인 도구를 제공한다.

- 넘파이의 핵심은 ndarray 객체이다.

 

# 넘파이 설치

conda intsall numpy

import numpy as np

 

# 넘파이 배열의 속성

- ndarray.ndim : 배열의 축(차원)의 수를 반환한다.

- ndarray.shape : 배열의 형태를 반환한다.

- ndarray.size : 배열 내 원소의 총 개수를 반환한다.

- ndarray.dtype : 배열 내 원소들의 자료형을 반환한다.

 

 

#넘파이 배열 생성

- numpy.zeros : 모든 배열의 원소가 0인 배열을 생성.

- numpy.ones : 모든 배열의 원소가 1인 배열을 생성.

- numpy.empty : 배열의 크기만 정해주고 원소는 초기화하지 않은 배열 생성. 원소는 매우크거나 작은값

- numpy.arange : 파이썬의 range 함수와 유사한 형태로 배열을 생성. 배열의 원소가 수열을 구성

- numpy.full :  배열의 모든 값이 하나의 상수인 배열을 생성

- numpy.eye : 지정한 크기의 단위행렬을 생성한다.

- numpy.random.random :  배열의 원소를 임의 값으로 생성한다. 값은 0부터 1사이

 

 

# 넘파이 기본 연산

- np.add(a,b) : 배열의 합 = a + b

- np.subtract(a,b) : 배열의 차 = a - b

- np.dot(a,b) : 배열의 내적계산 = a.dot(b)

- axis = 0 : 열 기준 

- axis = 1 : 행기준

>> 기본적인 연산 외에 중요한 연산 기능은 축을 기준으로 한 연산

 

 

# 넘파이 배열 인덱싱, 슬라이싱

- 넘파이 배열은 파이썬 리스트와 마찬가지로 인덱싱과 슬라이싱 기능 제공

 

 

# 넘파이 배열 형태 변환

- ndarray.ravel() : 배열을 1차원 배열로 만든다

- ndarray.reshape() : 배열의 형태를 바꾼다.

                         : 특정한 행, 열만 지정해도 나머지는 자동으로 맞출 수 있다. (나머지에 -1을 준다)

- ndarray.T : 트랜스포즈 된 배열을 만든다. 전치만 사용할 수 있는 연산이 많다.

 

 

# 넘파이 브로드 캐스팅

- 넘파이는 브로드캐스팅이라는 기능을 통해 다른 형태의 배열끼리도 연산이 가능하게 한다.

 

 

Pandas_판다스

 

- 데이터 분석을 위한 라이브러리

- 편리한 데이터 구조와 데이터 분석 기능을 제공하기 때문에 데이터를 다루기 위해서는 반드시 알아야한다.

 

# 판다스 설치

conda install pandas

import pandas as pd

 

# 판다스의 데이터 구조

1> 시리즈 ( Series ) : 1차원의 데이터 구조

2> 데이터 프레임 ( DataFrame) : 2차원의 데이터 구조

3> 패널 (Panel) : 3차원의 데이터 구조

 

 

# 판다스 데이터 생성

1> 시리즈 생성

pandas.Series( data, index, dtype, copy )

- data를 제외한 값은 생략할 수 있다.

- 시리즈 데이터는 기본적으로 순서대로 index가 존재한다

- 딕셔너리를 활용해 시리즈를 생성하면 index값은 키 값으로 들어간다.

 

2> 데이터 프레임 생성

pandas.DataFrame( data, index, columns, dtype, copy )

- 데이터 프레임도 data를 제외한 값은 생략 가능하다

- columns을 통해 각 열의 라벨을 지정할 수 있다.

- 파이썬의 딕셔너리를 활용해 데이터 프레임을 생성하면, 칼럼은 키 값으로 지정된다.

 

 

# 판다스 데이터 불러오기 및 쓰기

pandas.read_csv('file_path')

 

# 판다스 데이터 다루기

data_frame.describe()

- describe() 함수를 사용하면 데이터에 대한 평균, 표준편차 등 다양한 수치 값을 얻을 수 있다.

 

 

Matplotlib

conda install matplotlib

import matplotlib

 

Matplotlib.pyplot

- 파이플롯은 맷플롯립 안에 포함된 서브 모듈이다. 시각화를 위한 많은 함수가 있다.

 

# 파이플롯 사용

import matplotlib.pyplot as plt
%matplotlib inline

- 주피터 노트북을 사용하는 경우에는 아래 코드를 입력해, 주피터 노트북 내부에서 그림을 표시

 

 

# 기본적인 그래프

X = [1,3,5,7,9]
Y = [100,200,300,400,500]

plt.plot(X,Y)

- 위의 코드를 실행시키면 아래와 같은 그래프가 나온다.

 

 

 

# 판다스 데이터 시각화

import pandas as pd

data_frame = pd.read_csv('./data/datafile.csv')
data_frame.plot()

- 판다스의 시리즈와 데이터 프레임은 기본적으로 plot() 함수를 내장한다.

- 따라서 맷플롯립을 따로 불러오지 않고도 판다스의 plot() 함수를 사용할 수 있다.

- 누적된 값을 가지고 데이터의 증감에 대해 시각화 하고 싶다면 pandas.cumsum() 함수 사용

data_sum = data_frame.cumsum()
data_sum.plot()

- 데이터를 누적 값으로 바꿔서 출력해준다.

반응형