본문 바로가기

Developer Diary

NLP(자연어 처리)2

23.01.03


자연어 처리(Natural Language Process)란?

 

인간이 사용하는 언어컴퓨터에게 전달하고 학습시켜

원하는 결과물을 얻기 위한 과정이다.

 

간단하게 자연어처리 수집부터 배포까지의 과정을 보고

과정마다의 내용을 살펴보겠다.


 

🔥 자연어 처리 머신러닝 플로우 🔥

(Natual Language Process Machine Learning Flow)

 

1) 수집(Acquisition)

  • 필요한 데이터를 수집
  • 자연어 데이터를 말뭉치 또는 코퍼스(corpus)라고 부른다.

💡 코퍼스(corpus) : 조사나 연구 목적에 의해서 특정 도메인으로부터 수집된 텍스트 집합

 

✔ 텍스트 파일 : txt 파일, csv 파일, xml 파일

✔ 출처 : 음성 데이터, 웹 수집기, 영화 리뷰 등등

 

2) 점검 및 탐색(Inspection and exploration)

  • 목적 : 데이터의 구조, 노이즈 데이터, 머신 러닝 적용
  • 실행 : 데이터 정제

 💡 탐색적 데이터 분석(Exploratory data Analysis, EDA) 단계

 

 독립 변수, 종속 변수, 변수 유형, 변수의 데이터 타입을 점검

 데이터의 특징과 내재하는 구조적 관계를 알아내는 과정을 의미

 

3) 전처리 및 정제(Preprocessing and Cleaning)

  • 토큰화, 정제, 정규화, 불용어 제거 등의 단계
  • 전처리 과정에서 머신 러닝이 사용되기도 한다.

4) 모델링 및 훈련(Modeling and Training)

  • 전처리가 완료된 데이터를 학습시킬 모델의 모델링 단계
  • 적절한 머신 러닝 알고리즘 선택
  • 학습(Training) = 훈련
  • 훈련용, 검증용, 테스트용으로 나눠서 확인하는 게 베스트.

5) 평가(Evaluation)

  • 모델이 얼마나 학습이 잘 되었는지 평가
  • 모델이 예측한 예측데이터가 테스트 데이터의 예측 데이터와 얼마나 차이가 나는지 확인

6) 배포(Deployment)

  • 완성된 모델을 배포하는 단계
  • 앱, 프로그램, 웹 등으로 공유가능.

 


전처리

머신러닝의 세계에서는 전처리가 아주 중요하다.

컴퓨터에게 들어갈 거 이왕이면 좀 더 효율적으로 넣어줘야 하기 때문이다.

 

이 과정으로 인해 시간효율성이 판가름 나고

결과에도 중대한 영향을 끼친다.

 

그렇다면 우리가 자연어를 전처리 할 때

자주 쓰는 툴이 뭐가 있을까?

 


NLTK(Natual Language Toolkit)

 

파이썬에서 가장 기본적으로 쓰이는 자연어 처리 툴킷이다.

자연어 처리용 라이브러리프로그램들이 모여있다.

 

분류, 토큰화, 형태소 분석, 태깅,

구문 분석의미론적 추론 기능을 지원한다.

 


KoNLPy(코엔엘파이)

 

한국어 자연어 처리 도구

KoNLPy는 한글 자연어 처리를 쉽고 간결하게 처리할 수 있도록

만들어진 오픈소스 라이브러리이다.

 

형태소 분석  및 품사 태깅

말뭉치사전

를 제공한다.

 


판다스 프로파일링(Pandas-Profiling)

 

판다스에서 제공하는 데이터 탐색 패키지

 

DataFrame.info()

DataFrame.docribe()

등의 기능을 한 번에 쓸 수 있다.

 

1) 개요(Overview)

= 데이터의 전체적인 개요를 보여준다.

✔ 데이터의 크기, 변수의 수, 결측치 비율, 데이터 종류 확인가능.

 

2) 변수(Variables)

= 데이터에 존재하는 모든 특성 변수들에 대한 결측값,

중복을 제외한 유일한 값의 개수등의 통계치를 보여준다.

 상위 5개의 값에 대해서는 우측에 바 그래프로 시각화한 결과를 제공

 

3) 상세사항 확인하기(Toggle details)

빈도값(common values)

앞서 바 그래프로 확인했던 각 값의 분포를 좀 더 상세하게 보여준다.

 

구성(composition)

전체 값의 최대 길이, 최소 길이, 평균 길이값의 구성에 대해서 볼 수 있다.

 

4) 기타 기능

상관계수(correlations)

결측값에 대한 히트맵(headmap)

수지도(dendrogram)

 


토큰화(Tokenization) ✨

 

= 주어진 코퍼스(corpus)에서 토큰(token)이라 불리는 단위로 나누는 작업

 

1. 단어 토큰화(Word Tokenization)

✔ 토큰의 기준을 단어(word)로 하는 경우를 말한다.

# 단어 외에도 단어구, 의미를 갖는 문자열로도 간주한다.

 

토큰화 작업은 구두점이나 특수문자를 전부 제거하는

정제(cleaning) 작업을 수행하는 것만으로 해결 불가능.

 

토큰화의 기준에 따라 자연어의 의미가 달라진다.

 

구두점이나 특수 문자를 단순 제외해서는 안된다.

 

 NLTK는 영어 코퍼스의 토큰화를 도와주는 도구이다.

 

KoNLPy는 한국어의 토큰화를 도와주는 도구이다.

 


2. 문장 토큰화(Sentence Tokenizatin)

 

코퍼스 내에서 문장 단위로 구분하는 작업으로 때로는 문장 분류(sentence segmentation)라고도 부른다.

 

명확한 구분자(boundary)를 사용하여 토큰화 하는것이 중요하다.

 

NLTK에서 sent-tokenize를 지원한다.


3. 한국어 토큰화

 

영어와 다르게 한국어를 토큰화 하는데는 많은 난관이 있다.

왜냐하면 한국어는 영어와 다르게 교착어이기 때문이다.

 

 

💡 교착어

조사, 어미 등을 붙여서 말을 만드는 언어.

 

조사는 한 글자에 붙어 뜻을 다양하게 해석하게끔 만든다.

 

한국어는 조사등의 무언가가 부어있는 경우가 많다.

 

💡 형태소

 

= 뜻을 가진 가장 작은 말의 단위

자립 형태소와 의존 형태소로 나뉜다.

 

💡

  • 자립 형태소 : 접사, 어미, 조사와 상관없이 자립하여 사용할 수 있는 형태소. 그 자체로 단어가 된다.

체언(명사, 대명사,수사), 수식언(관형사, 부사), 감탄사 등이 있다.

 

  • 의존 형태소 : 다른 형태소와 결합하여 사용되는 형태소.

 접사, 어미, 조사, 어간을 말한다.


추가적으로 한국어는 띄어쓰기가 잘 지켜지지 않을 때도 있다.

 

✔ 한국어 = 모아쓰기 방식, 영어 = 풀어쓰기 방식

 

ex) 한국어는이렇게써도이해가됩니다.

ex) Idon`tunderstandEnglishwhenyouwriteitlikethis.

 


4. 품사 태깅(part-of-speech tagging)

 

단어는 표기는 같지만 품사에 따라서 단어의 의미가 달라지기 때문

품사를 구분화 하여 토큰화 해야 한다.

 

ex) "안"

 

한국어에서 "안"이라는 글자는 위와 같이

여러 품사에 의해 뜻이 달라진다.

 


정제(Cleaning) 와 정규화(Normalization)

 

토근화 작업전, 후에 텍스트 데이터를 용도에 맞게

만들어 주는 과정.

 

정제(Cleaning) : 코퍼스로부터 노이즈 데이터를 제거 하는것.

정규화(Normalization) : 표현 방법이 다른 단어들을 통합 시켜 같은 단어로 만들어 주는것.

 

✔ 정제 작업은 토큰화 전,후 과정에서 빈번히 발생한다.


1. 규칙에 기반한 표기가 다른 단어들의 통합

어간 추출(stemming)과 표제어 추출(lemmatization)이 있다.

 

목적은 문서 내의 단어 수 줄이기! = 코퍼스로부터 복잡성을 줄이는 것

 

💡 표제어 추출(Lemmatization)

 

표제어란 '기본 사전형 단어'를 의미한다.

표제어 추출은 표제어를 찾아가 통합하는 과정.

 

형태학적 파싱을 먼저하고 추출하는것이 베스트.

 

  💡 형태학적 파싱?

 

    1) 어간(stem)
    : 단어의 의미를 담고 있는 단어의 핵심 부분.

    2) 접사(affix)
    : 단어에 추가적인 의미를 주는 부분.

 

 어간과 접사를 분리하는 작업.

 

 단어의 형태가 적절히 보존되는 양상을 보이는 특징

 

💡 어간 추출(stemming)

 

형태학적 분석과 비슷하나,

사전에 존재하지 않는 단어로 나오기도 한다.

 

영어 같은 경우 NLTK에서

 

포터 알고리즘(Porter Algorithm)

랭커스터 스태머(Lancaster Stemmer)

 

두 가지를 지원한다.

 

✔ 한국어의 경우

5언(체언, 수식언 관계언, 독립언, 용언)

9품사(명사, 대명사, 수사, 관형사, 부사, 조사, 감탄사, 동사, 형용사)

 

용언(동사, 형용사)에서 어간을 추출할 수 있다.

 


2. 대, 소문자 통합

 

✔ 한국어의 경우 의미가 없다.

✔ 영어의 경우 대,소문자를 통합하는 것은 단어의 개수를 줄일 수 있는 정규화 방법이다.


3. 불필요한 단어의 제거 

 

💡 노이즈 데이터(noize data) 

 

  • 자연어가 아니면서 아무 의미도 없는 글자. (특수문자 등)
  • 목적에 맞지 않는 불필요 단어들

 

불필요한 단어들

 

불용어

✔ 등장 빈도가 적은 단어

길이가 짧은 단어 (영어권)


4. 정규 표현식(Regular Expression)

 

수집한 코퍼스에서 노이즈 데이터의 규칙을 잡아낼 수 있다면

정규 표현식을 통해 이를 제거할 수 있다.

 


불용어(Stopword) 처리 ✨

 

가지고 있는 데이터에서

자주 등장하거나 큰 의미가 없는

데이터를 처리하는 일

 

# 영어의 경우 NLTK에서 불용어로 패키지로 정의하는것이 있음

 

💡 한국어의 불용어 제거

 

✔ 토큰화 후에 조사, 접속사 등을 제거하는 방법이 있다.

 사용자가 직접 불용어 사전을 만들게 되는 경우가 많다.

 


정규 표현식(Regular Expression) ✨

 

파이썬의 re(정규 표현식 모듈)를 사용하여

정규 표현식으로 텍스트를 정리한다.

 

NLTK에서 정규 표현식을 사용해서 단어 토큰화를 수행하는

RegexpTokenizer를 지원

 


정수 인코딩(Integer Ecoding) ✨

 

자연어 처리에서 텍스트를 숫자로 바꾸는 여러가지 기법

단어를 고유한 정수맵핑(mapping)

 

1. dictionary 사용하기

2. Counter 사용하기

3. NLTK의 FreqDist 사용하기

 

높은 빈도수를 가진 단어일수록 낮은 정수 인덱스를 부여한다.

 


패딩(padding) ✨

 

각 문장,문서의 길이가 다른 경우

병렬 연산을 위해 문장의 길이를 임의로 동일하게 맞추는것.

 

Numpy로 패딩하는 경우

 

모든 단어를 고유한 정수로 변환하고 # 정수 인코딩가장 길이가 긴 문장의 길이를 기준으로

 

반복문과 조건문을 걸어.append(0)으로 부족한 길이에 0을 채워준다(=패딩한다.)

 

 


⭐ 한국어 전처리 패키지(Text Preprocessing Tools for Korean Text)

 

🔥 PyKoSpacing

 

띄어쓰기가 되어있지 않은 문장을 띄어쓰기를 한 문장으로 변환해주는 패키지.

대용량 코퍼스를 학습한 딥러닝 모델이다.


 

🔥 Py-Hanspell

 

네이버 한글 맞춤법 검사기를 바탕으로 만들어진 패키지

띄어쓰기도 보정해준다.

 


 

🔥 SOYNLP

 

✔ soynlp는 품사 태깅, 단어 토큰화 등을 지원하는 단어 토크나이저이다.

 비지도 학습으로 단어 토큰화를 한다는 특징.

 데이터에 자주 등장하는 단어들을 단어로 분석한다.

 soynlp는 내부적으로 단어 점수 표로 동작한다.

 이 점수는 응집 확률(cohesion probability)과 브랜칭 엔트로피(branching entropy)를 활용한다.

 

💡 응집 확률(cohesion probability)

 

내부 문자열(substring)이 얼마나 응집하여 자주 등장하는지 판단하는 척도.

 

ex) 롯데월드

 

cohesion(2) = P(롯데 | 롯)

cohesion(3) = P(롯데 | 롯) * P(롯데월 | 롯데)

cohesion(4) = P(롯데 | 롯) * P(롯데월 | 롯데) * P(롯데월드 | 롯데월)

 

수식을 완전히 타이핑한건 아니다.

느낌만 알고가자.

 

💡 브랜칭 엔트로피 (branching entropy)

 

Branching Entropy는 확률 분포의 엔트로피값을 사용합니다.

이는 주어진 문자열에서 얼마나 다음 문자가 등장할 수 있는지를 판단하는 척도입니다.

 

# 어릴때 자주했던 스무고개의 느낌이다.

 

💡 L tokenizer

 

"동해물과" 를 어절로 나눈다면

"동해물" + "과"로 나눌수도,

"동해" + "물과"로 나뉠 수도 있다.

 

이때 나눠진 두 토큰을 L 토큰R 토큰으로 볼 수 있는데

L tokenizer는 분리 기준을 점수가 가장 높은

L 토큰을 찾아내는 원리를 가지고 있다.

 

💡 최대 점수 토크나이저

 

띄어쓰기가 되지 않는 문장에서

점수가 높은 글자 시퀀스를 순차적으로 찾아내는 토크나이저다.


 

🔥 Customized KoNLPy

 

내가 살리고 싶은 단어를 형태소 분석기를 돌렸을때

가져오지 못하는 경우

 

우리는 직접 수동으로 사전에 등록 해줘야 한다.

 

.add_dictionary("단어", "품사")를 사용한다.

 

 


 

'Developer Diary' 카테고리의 다른 글

NLP_단어 표현(Word Representation)  (1) 2023.01.15
Toy Project 6일차  (0) 2023.01.05
Toy Project 5일차  (0) 2023.01.03
Toy Project 4일차  (0) 2023.01.03
NLP (자연어 처리)  (0) 2023.01.01