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 |