무냐의 개발일지

[2/14] 자연어처리 NLP 본문

Data Scientist Bootcamp

[2/14] 자연어처리 NLP

무냐코드 2024. 2. 15. 16:03

대망의 자연어처리! 두둥 !!

내가 제일 관심있는 분야이기도 하고, 재밌게 배워보겠다

 

0. 자연어 처리 과정 

1. Segmentation : 문장을 쪼갠다

2. Tokenizing : 단어별로 쪼갠다

3. Stop words : was, in, are, and, the 같은 쓸모없는 말들을 제거한다

4. Stemming : 동사 형태는 달라도 근본적 의미가 같은 것들 추리기 (ex. Skip + ing/ ed/  )

5. Lemmatization(어원) : 어원을 찾는다 (ex. am, are, is -> BE)

6. Speech Tagging : 동사, 명사, 형용사 등 각 단어의 문법별로 매칭시킨다

 

 

1. 자연어 처리 기초

* 형태소 분석

1. 단어의 의미 파악:

형태소 분석을 통해 단어를 구성하는 형태소를 추출하고 각 형태소의 의미를 파악할 수 있습니다. 이를 통해 문장에서 단어의 정확한 의미를 이해하고 분석하는 데 도움이 됩니다.

2. 문법 분석:

형태소 분석은 문장의 구조와 문법적 관계를 파악하는 데 중요한 역할을 합니다. 형태소의 종류와 위치를 분석하여 문장의 구성 요소와 의존 관계를 파악할 수 있습니다.

3. 정보 검색:

형태소 분석을 통해 텍스트의 주요 정보를 추출하고 색인화할 수 있습니다. 이를 통해 검색 엔진에서 사용자의 검색어와 관련된 문서를 효율적으로 검색하는 데 도움이 됩니다.

4. 기계 번역:

형태소 분석은 한 언어의 형태소를 다른 언어의 형태소와 매칭하여 정확한 번역을 수행하는 데 필요합니다.

5. 챗봇:

챗봇은 사용자의 질문을 이해하고 응답하기 위해 형태소 분석을 사용합니다. 형태소 분석을 통해 사용자의 의도를 파악하고 적절한 응답을 생성할 수 있습니다.

 

 

* 토큰화

import konlpy
from konlpy.tag import Okt
tokenizer = Okt()

text = "함께 탐험하며 성장하는 AI 학교 AIFFEL"
tokenizer.morphs(text)

##결과
['함께', '탐험', '하며', '성장하는', 'AI', '학교', 'AIFFEL']

#명사만 추출
tokenizer.nouns(text)

##결과
['탐험', '학교']

#품사 태깅
tokenizer.pos(text)

##결과
[('함께', 'Adverb'),
 ('탐험', 'Noun'),
 ('하며', 'Verb'),
 ('성장하는', 'Adjective'),
 ('AI', 'Alpha'),
 ('학교', 'Noun'),
 ('AIFFEL', 'Alpha')]

 

| 어휘사전 구축 (벡터화)

from sklearn.feature_extraction.text import CountVectorizer
#1 CountVectorizer 불러오기
vect = CountVectorizer() 

#2 토큰화 한 형태소들 불러오기
words = tokenizer.morphs(text)

#3 학습하기
vect.fit(words)

#4 학습된 어휘 확인하기
vect.get_feature_names_out()
##결과 
array(['ai', 'aiffel', '성장하는', '탐험', '하며', '학교', '함께'], dtype=object)

#5 단어 사전 확인하기
vect.vocabulary_
##결과
{'함께': 6, '탐험': 3, '하며': 4, '성장하는': 2, 'ai': 0, '학교': 5, 'aiffel': 1}

 

문자열을 컴퓨터가 인식할 수 있도록 수치 벡터로 만드는 대표적인 방법으로 CountVectorizer와 TfidfVectorizer 이 둘의 차이점

 

 ✅ CountVectorizer : 문서에서 단어의 출현 빈도를 기반으로 각 단어를 수치화

 

💡 TfidfVectorizer : 문서에서 단어의 상대적인 중요성을 고려하여 각 단어를 수치화합니다. 즉, TfidfVectorizer는 문서에 자주 출현하지만 다른 문서에서는 그렇지 않은 단어에 대해 높은 가중치를 부여합니다. → 단어 빈도뿐 아니라, 해당 단어가 전체 문서집합에서 얼마나 희귀한지/ 일반적인지 고려함 **(문서에서 희귀한 단어는 높은 TF-IDF값을 갖는다)

 

TF-IDF 값 계산 : 각 문서의 각 단어에 대해 TF-IDF 값을 계산합니다. TF(Term Frequency)는 특정 단어가 문서 내에서 등장하는 빈도를 나타내며, IDF(Inverse Document Frequency)는 특정 단어가 전체 문서 집합에서 등장하는 빈도의 역수에 로그를 취한 값입니다. TF와IDF를 곱한 값이 TF-IDF 값이 됩니다

from sklearn.feature_extraction.text import TfidfVectorizer
#순서는 CountVectorizer와 동일
vect = TfidfVectorizer()
words = tokenizer.morphs(text)
vect.fit(words)
vect.vocabulary_
## 결과 동일
### 다른 예시를 사용하면 다른 결과 나올 것

 

 

| 인코딩(CountVectorizer)

#1 인코딩 transform
df_t = vect.transform(words)

#2 인코딩된 matrix
df_t.toarray()
## 결과
array([[0, 0, 0, 0, 0, 0, 1],
       [0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0],
       [0, 0, 1, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0],
       [0, 1, 0, 0, 0, 0, 0]])

#3 데이터 프레임으로 전환
pd.DataFrame(df_t.toarray(), columns=vect.get_feature_names())

 

 

| 형태소 분석 라이브러리

  1. 한국어 자연어처리 형태소 분석 라이브러리
    • Python에서 사용할 수 있는 한국어 자연어 처리 라이브러리
    • 다양한 형태소 분석기 (Kkma, Komoran, Hannanum, Mecab) 지원
    • 품사 태깅, 명사 추출, 의존 관계 분석 등 다양한 기능 제공
    • 한국어 자연어처리 입문자에게 적합
    2) Khaiii:
    • 카카오에서 개발한 고성능 한국어 형태소 분석기
    • 딥러닝 기반 모델 사용으로 높은 정확도 제공
    • 사용자 사전을 통해 오분석 수정 가능
    • 속도와 정확도를 모두 중요시하는 경우 적합
    3) Sejong:
    • 서울대학교에서 개발한 한국어 형태소 분석기
    • 오랜 연구 기반으로 높은 신뢰도를 가짐
    • 다양한 형태소 분석 옵션 제공
    • 전문적인 연구 목적으로 적합

 

2. 감성 분석

  • 감성분석 : 텍스트에 들어있는 의견이나 감성, 평가, 태도 등의 주관적인 정보를 컴퓨터를 통해 분석하는 과정으로, 긍정적/ 부정적/ 중립 감점을 분류 해낸다.
  • ex) 고객 피드백, 콜센터 메세지, 기업관련 SNS홍보물에 달린 댓글 등

 

3. 자연어 전처리

한국어 자연어 처리 (Natural Language Processing, NLP)에서 사용하는 방법들을 다룹니다.

  1. 어휘 사전 구축(단어의 빈도 기반 조절)
    • max_df
      • 너무 자주 나타나는 단어(코퍼스-특이적 불용어, corpus-specific stopwords)를 제거
      • 문서의 대부분에서 등장하는 단어는 특정 주제나 내용을 구분하는 데 도움이 되지 않을 수 있음
      • max_df = 0.5 “문서에서 50% 이상 나온 단어를 무시”
      • max_df = 25 “문서에서 25번 이상 나온 단어를 무시”
      1-1. max_df: N번 이상 등장한 단어 무시
vect = CountVectorizer(tokenizer=tokenizer.morphs, max_df=10)
vectors = vect.fit_transform(df['document'])
model = RandomForestClassifier(random_state=2022)
cross_val_score(model, vectors, df['label'], scoring='accuracy', cv=5).mean()

 

 

  • min_df
    • 너무 희소하게 나오는 단어를 제거
    • 매우 드물게 등장하는 단어 (오타나 혹은 매우 전문적인 용어)는 모델을 훈련시키는 데 큰 영향을 미치지 않으며, 오히려 노이즈로 작용할 수 있음.
    • min_df = 0.01 “문서에서 1% 이하로 나온 단어를 무시”
    • min_df = 5 “문서에서 5번 이하로 나온 단어에 대해 무시”
    1-2. min_df: N번 미만 등장한 단어 무시
vect = CountVectorizer(tokenizer=tokenizer.morphs, min_df=2)
vectors = vect.fit_transform(df['document'])
model = RandomForestClassifier(random_state=2022)
cross_val_score(model, vectors, df['label'], scoring='accuracy', cv=5).mean()

 

 

  1. 불용어(stopword) 처리
    • 분석에 있어 실질적인 의미를 가지지 않는 단어 제거 ex) 을, 는, 이, 가 (조사), 여기, 저기 (부사), 그러나, 하지만 (접속사)
    • 불용어 처리
text = "함께 탐험하며 성장하는 AI 학교 AIFFEL"
stop_words = ['하며','ai'] #(영어는 모두 소문자 처리되어 소문자로 입력)
vect = CountVectorizer(stop_words=stop_words)
words = tokenizer.morphs(text)
vect.fit(words)
vect.vocabulary_

 

  max_df, min_df 불용어 처리
목적 너무 빈번(희소)하게 등장하는 단어를 자동으로 필터링하기 위해 사용 문법적으로 중요하지만 분석에 있어서는 유용하지 않은 단어를 수동으로 필터링하기 위해 사용
작동 방식 문서 빈도의 최대(최소) 임계값을 설정하여, 이 값을 초과하는 단어를 분석에서 제외 사전에 정의된 불용어 목록을 사용하여 특정 단어를 텍스트 분석에서 제외하는 과정
차이점 자동성: 데이터셋의 통계를 기반으로 자동으로 단어를 제외하는 방식 수동성: 사람이 정의한 목록을 사용하여 수동으로 단어를 제외하는 방식

 

 

   2. 띄어쓰기 전처리

# spacing 라이브러리 설치
!pip install git+https://github.com/haven-jeon/PyKoSpacing.git

from pykospacing import Spacing
spacing = Spacing()

text = "함께탐험하며성장하는AI학교아이펠"
spacing_test = spacing(text)   # 띄어쓰기 전처리
print(text)         # 원본 데이터
print(spacing_test) # 띄어쓰기 전처리된 데이터

 

 

   3. 반복되는 글자 정리

# soynlp 라이브러리 설치
!pip install soynlp

# 라이브러리 호출
from soynlp.normalizer import *

# 반복 글자 처리
emoticon_normalize('하하하하ㅋㅋㅋㅋㅋㅠㅠㅠㅠㅠㅠ', num_repeats=3)
  • ㅋㅋㅋ와 같이 반복되는 글자를 전처리할 수도 있음
  • 반복되는 글자를 정리하는 이유
    • 정규화 (Normalization)
      • 하하하, 하하, ㅋㅋㅋㅋ, ㅋㅋ 등은 모두 웃음을 표현하지만 표현의 길이와 형태가 다름.
      • 동일한 의미나 감정을 표현하는 단어나 구문의 다양한 변형을 표준 형태로 통일하면 모델이 이러한 표현들을 동일하게 인식할 수 있음
    • 차원 축소
      • 반복되는 글자의 다양한 변형이 그대로 데이터셋에 포함되면 모델이 처리해야 할 고유한 단어 수가 증가함 ⇒ 차원의 저주
      • 반복되는 글자를 일정 규칙에 따라 정리함으로써 모델이 학습해야 할 단어의 수를 줄이고 연산 효율성을 높일 수 있음
    • 과적합 방지
      • 특정 단어나 구문이 과도하게 반복되어 사용되는 경우, 모델이 이 특성에 지나치게 의존하여 일반화 능력이 떨어질 수 있음
      • 모델이 특정 표현 방식에 과도하게 의존하는 것을 방지