본문 바로가기
ETC

NLP 01 - 환경 세팅

by soojitasan 2023. 4. 30. 20:48

01. NLP 처리란?

  • Natural Language (자연어) : 일상 생활에서 사용하는 언어
  • Natural Language Processing (자연어 처리) : 일상 생활 언어를 컴퓨터가 처리할 수 있도록 하는 가공 작업
  • NLP 예시 ... 음성 인식, 번역, 감성 분석, 텍스트 분류, 챗봇
  • NLP 모델 ... 뒷 파트에서 서술

 

01-01. 아나콘다/코랩 환경 세팅

  • 파이썬 배포판 아나콘다 설치 진행 ... 아래 페이지에서 적당한 버전으로 설치
    https://repo.anaconda.com/archive/
  • 아나콘다 프롬프트 실행 및 파이썬 패키지 최신 버전 업데이트
> conda update -n base conda
...
done

> conda update --all
...
Retrieving notices: ...working... done
  • 구글 코랩 환경 설정
    런타임 -> 런타임 유형 변경 : GPU로 변경

 

01-02. 프레임워크 및 라이브러리 설치

  • 아나콘다 설치 시 Numpy, Pandas, Jupyter notebook, matplotlib 등이 설치되지만,
    tensorflow, keras 등은 별도 pip를 통해 설치 필요

 

1) Tensorflow

  • 머신러닝 오픈소스 라이브러리
  • 아나콘다 프롬프트에 커맨드 입력
> pip install tensorflow
  • ipython 쉘에 텐서플로우 임포트
In [1]: import tensorflow as tf

In [2]: tf.__version__
Out[2]: '2.11.0'

 

2) Keras

  • 텐서플로우의 백엔드로서 더 간단한 코드를 작성할 수 있게하는 라이브러리
    (텐서플로우에서 케라스 API를 사용하는 경우 보통 tf.keras로 표기)
# anaconda prompt

> pip install keras
# ipython

In [3]: import keras

In [4]: keras.__version__
Out[4]: '2.11.0'

 

3) Gensim

  • 머신러닝을 사용해 토픽 모델링 및 자연어 처리를 수행하게 해주는 오픈소스 라이브러리
# anaconda prompt

> pip install gensim
...
Successfully installed Cython~
# ipython

In [5]: import gensim

In [6]: gensim.__version__
Out[6]: '4.2.0'

 

4) Scikit-learn

  • 파이썬 머신러닝 라이브러리
    나이브 베이즈 분류, 서포트 벡터 머신 등의 모듈을 불러올 수 있음
    아나콘다로 자동 설치됨
# ipython

In [7]: import sklearn

In [8]: sklearn.__version__
Out[8]: '0.24.1'

 

5) Jupyter Notebook

  • 웹에서 코드를 작성하고 실행할 수 있는 오픈소스 웹 어플리케이션
    아나콘다로 자동 설치됨
  • 실행 방법 : 아나콘다 프롬프트에서 jupyter notebook 입력
    또는 웹 브라우저에 localhost:8888 입력

https://velog.velcdn.com/images/soojitasan/post/c917fa67-3144-4ca9-ae13-b71ccbda69b3/image.png

01-03. NLTK, KoNLPy 설치

  • 텍스트 전처리 실습을 위한 기본적인 자연어 패키지 설치

 

1) NLTK, NLTK Data 설치

  • NLTK : 자연어 처리를 위한 파이썬 패키지
       아나콘다로 자동 설치됨
# ipython

In [9]: import nltk

In [10]: nltk.__version__
Out[10]: '3.6.1'

2) KoNLPy 설치

  • KoNLPy : 한국어 자연어 처리를 위한 형태소 분석기 패키지
# anaconda prompt

> pip install konlpy
...
Successfully installed JPype1-1.4.1 konlpy-0.6.0
# ipython

In [12]: import konlpy

In [13]: konlpy.__version__
Out[13]: '0.6.0'

 

01-04. Pandas, Numpy, Matplotlib

  • Pandas, Numpy, Matplotlib 모두 아나콘다로 자동 설치됨

 

1) Pandas

  • 파이썬 데이터 처리를 위한 라이브러리
    보통 pd라는 명칭으로 임포트
  • 3가지의 데이터 구조 사용
# ipython

In [1]: import pandas as pd

In [2]: pd.__version__
Out[2]: '1.2.4'

 

(1) Series

  • 1차원 배열값(values)에 대응되는 인덱스(index)를 부여하는 구조를 가짐
import pandas as pd

sr = pd.Series([17000, 18000, 1000, 5000],
               index=["피자", "치킨", "콜라", "맥주"])

print('시리즈 출력 :')
print('-'*15)
print(sr)
시리즈 출력 :
---------------
피자    17000
치킨    18000
콜라     1000
맥주     5000
dtype: int64

print('시리즈의 값 : {}'.format(sr.values))
print('시리즈의 인덱스 : {}'.format(sr.index))
시리즈의 값 : [17000 18000  1000  5000]
시리즈의 인덱스 : Index(['피자', '치킨', '콜라', '맥주'], dtype='object')

(2) Dataframe

  • 행과 열을 가지는 2차원 자료구조
  • 열(columns), 인덱스(index), 값(values)로 구성
values = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
index = ['one', 'two', 'three']
columns = ['A', 'B', 'C']

df = pd.DataFrame(values, index=index, columns=columns)

print('데이터프레임 출력 :')
print('-'*18)
print(df)
데이터프레임 출력 :
------------------
       A  B  C
one    1  2  3
two    4  5  6
three  7  8  9
print('데이터프레임의 인덱스 : {}'.format(df.index))
print('데이터프레임의 열이름: {}'.format(df.columns))
print('데이터프레임의 값 :')
print('-'*18)
print(df.values)
데이터프레임의 인덱스 : Index(['one', 'two', 'three'], dtype='object')
데이터프레임의 열이름: Index(['A', 'B', 'C'], dtype='object')
데이터프레임의 값 :
------------------
[[1 2 3]
 [4 5 6]
 [7 8 9]]
  • 데이터프레임 생성 : 리스트, 시리즈, 딕셔너리, ndarrys, 데이터프레임으로부터 생성 가능
# 딕셔너리로 생성
data = {
    '학번' : ['1000', '1001', '1002', '1003', '1004', '1005'],
    '이름' : [ 'Steve', 'James', 'Doyeon', 'Jane', 'Pilwoong', 'Tony'],
    '점수': [90.72, 78.09, 98.43, 64.19, 81.30, 99.14]
    }

df = pd.DataFrame(data)
print(df)
     학번        이름     점수
0  1000     Steve  90.72
1  1001     James  78.09
2  1002    Doyeon  98.43
3  1003      Jane  64.19
4  1004  Pilwoong  81.30
5  1005      Tony  99.14

 

  • 데이터프레임 조회
    -- df.head(n) : 앞에서 n개만 조회
    -- df.tail(n) : 뒤에서 n개만 조회
    -- df['열이름'] : 해당되는 열 조회

 

  • 외부 데이터 읽기 : Pandas에서는 CSV, 텍스트, 엑셀, SQL, HTML, JSON 등의 파일을 읽어와 데이터프레임 생성 가능
# csv 파일 읽어오기

df = pd.read_csv('example.csv')

 

2) Numpy

  • 수치 데이터를 다루는 파이썬 패키지
    다차원 행렬 자료구조인 ndarray를 통한 선형대수 계산에서 주로 사용
    보통 np라는 명칭으로 임포트
# ipython

In [3]: import numpy as np

In [4]: np.__version__
Out[4]: '1.20.1'

 

(1) np.array()

  • 리스트, 튜플, 배열로부터 ndarray 생성
import numpy as np

# 1차원 배열 
vec = np.array([1, 2, 3, 4, 5])
print(vec)
[1 2 3 4 5]
# 2차원 배열
mat = np.array([[10, 20, 30], [ 60, 70, 80]]) 
print(mat)
[[10 20 30]
 [60 70 80]]

 

  • vec과 mat 배열 비교
print('vec의 타입 :',type(vec))
print('mat의 타입 :',type(mat))
vec의 타입 : <class 'numpy.ndarray'>
mat의 타입 : <class 'numpy.ndarray'>

-> numpy.ndarray로 동일한 타입으로 출력
축의 개수(ndim)와 크기(shape)로 배열의 크기 계산 -> ★중요★

print('vec의 축의 개수 :',vec.ndim) # 축의 개수 출력
print('vec의 크기(shape) :',vec.shape) # 크기 출력


print('mat의 축의 개수 :',mat.ndim) # 축의 개수 출력
print('mat의 크기(shape) :',mat.shape) # 크기 출력
vec의 축의 개수 : 1
vec의 크기(shape) : (5,)

mat의 축의 개수 : 2
mat의 크기(shape) : (2, 3)

 

3) Matplotlib

  • 데이터를 차트나 플롯으로 시각화하는 패키지
    보통 mpl라는 명칭으로 임포트
    주요 모듈인 pyplot을 보통 plt라는 명칭으로 임포트
# ipython

In [1]: import matplotlib as mpl

In [2]: mpl.__version__
Out[2]: '3.3.4'
import matplotlib.pyplot as plt

# 라인 플롯 그리기
plt.title('test')
plt.plot([1,2,3,4],[2,4,8,6])
plt.show()

# 축 레이블 삽입
plt.title('test')
plt.plot([1,2,3,4],[2,4,8,6])
plt.xlabel('hours')
plt.ylabel('score')
plt.show()

# 라인 추가 및 범례 삽입
plt.title('students')
plt.plot([1,2,3,4],[2,4,8,6])
plt.plot([1.5,2.5,3.5,4.5],[3,5,8,10]) # 라인 새로 추가
plt.xlabel('hours')
plt.ylabel('score')
plt.legend(['A student', 'B student']) # 범례 삽입
plt.show()

01-05. 판다스 프로파일링

  • 좋은 머신러닝 결과를 얻기 위해서는 데이터의 성격을 파악하는 과정이 선행되어야 함
  • EDA(Exploratory Data Analysis) : 탐색적 데이터 분석 - 데이터 분포, 변수 간 관계, 결측값 유무 확인 등의 파악 과정
# anaconda prompt

> pip install -U pandas-profiling
...
Successfully installed htmlmin-0.1.12~

 

★ pandas-profiling은 여러 라이브러리 버전에 의존적이므로,
2.8.0 버전으로 사용하는 것을 추천함.
(https://www.inflearn.com/questions/334386/pandas-profiling-version-%EC%98%A4%EB%A5%98%EC%99%80-profiling-report%EB%A5%BC-htlm-%ED%8C%8C%EC%9D%BC-%ED%98%95%EC%8B%9D%EC%9C%BC%EB%A1%9C-%EC%A0%80%EC%9E%A5%ED%95%98%EB%8A%94%EB%8D%B0-%EC%98%A4%EB%A5%98)

코랩에 파일 업로드 및 불러오기

import pandas as pd
import pandas_profiling
data = pd.read_csv('spam.csv',encoding='latin1')

data[:5]

  • 리포트 생성 및 살펴보기
    pr=data.profile_report() # 프로파일링 결과 리포트를 pr에 저장
    

pr # pr에 저장했던 리포트 출력



<br>

## 01-06. 머신러닝 워크플로우

![](https://velog.velcdn.com/images/soojitasan/post/d36f0070-012e-4211-bfe5-866996b2d613/image.png)

#### 1) 수집 (Acquisition)
말뭉치 = 코퍼스(corpus) : 학습 데이터로서 사용하기 위한 특정 도메인으로부터 수집된 텍스트 집합

<br>

#### 2) 점검 및 탐색 (Inspection and exploration)
EDA 단계 : 독립/종속 변수 및 변수의 데이터 타입 등을 점검하며 데이터의 특징과 구조적 관계를 알아내는 과정

<br>

#### 3) 전처리 및 정제 (Preprocessing and Cleaning)
토큰화, 정제, 정규화, 불용어 제거 등의 단계를 통해 데이터 전처리 진행

<br>

#### 4) 모델링 및 훈련 (Modeling and Training)
적절한 머신러닝 알고리즘을 선택하여 모델링이 끝났다면, 전처리가 완료된 데이터를 머신러닝 알고리즘을 통해 기계에 학습시킴 (훈련)

기계가 데이터에 대한 학습을 마쳤다면 자연어 처리 작업을 수행

<br>

**★ 과적합(Overfitting) 방지**

![](https://velog.velcdn.com/images/soojitasan/post/4a644576-1dd6-41e6-bfc4-2cb6cd403803/image.png)

전체 데이터 중 일부 데이터는 검증(테스트)용으로 남겨두어야 추후 테스트 데이터를 통해 성능 측정 및 과적합* 방지가 가능함.

* 과적합 (Overfitting) : 학습데이터를 과하게 학습하여 학습데이터에 대해서는 오차가 감소하지만 실제데이터에 대해서는 오차가 증가하게 되는 것

- 훈련용 : 학습지
- 검증용 : 모의고사
- 테스트용 : 수능시험

<br>

#### 5) 평가 (Evaluation)
학습이 완료되면 테스트용 데이터로 성능 평가

<br>

#### 6) 배포 (Deployment)
평가 단계에서 기계가 성공적으로 훈련이 된 것으로 판단된다면 완성 모델을 배포


<br>
<br>
<br>

참고문서 : 딥러닝을 이용한 자연어 처리 입문 ([https://wikidocs.net/book/2155](https://wikidocs.net/book/2155))

https://ko.wikipedia.org/wiki/%EA%B3%BC%EC%A0%81%ED%95%A9