무냐의 개발일지
[2/14] 자연어처리 NLP 본문
대망의 자연어처리! 두둥 !!
내가 제일 관심있는 분야이기도 하고, 재밌게 배워보겠다
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())
| 형태소 분석 라이브러리
- 한국어 자연어처리 형태소 분석 라이브러리
- Python에서 사용할 수 있는 한국어 자연어 처리 라이브러리
- 다양한 형태소 분석기 (Kkma, Komoran, Hannanum, Mecab) 지원
- 품사 태깅, 명사 추출, 의존 관계 분석 등 다양한 기능 제공
- 한국어 자연어처리 입문자에게 적합
- 카카오에서 개발한 고성능 한국어 형태소 분석기
- 딥러닝 기반 모델 사용으로 높은 정확도 제공
- 사용자 사전을 통해 오분석 수정 가능
- 속도와 정확도를 모두 중요시하는 경우 적합
- 서울대학교에서 개발한 한국어 형태소 분석기
- 오랜 연구 기반으로 높은 신뢰도를 가짐
- 다양한 형태소 분석 옵션 제공
- 전문적인 연구 목적으로 적합
2. 감성 분석
- 감성분석 : 텍스트에 들어있는 의견이나 감성, 평가, 태도 등의 주관적인 정보를 컴퓨터를 통해 분석하는 과정으로, 긍정적/ 부정적/ 중립 감점을 분류 해낸다.
- ex) 고객 피드백, 콜센터 메세지, 기업관련 SNS홍보물에 달린 댓글 등
3. 자연어 전처리
한국어 자연어 처리 (Natural Language Processing, NLP)에서 사용하는 방법들을 다룹니다.
- 어휘 사전 구축(단어의 빈도 기반 조절)
- max_df
- 너무 자주 나타나는 단어(코퍼스-특이적 불용어, corpus-specific stopwords)를 제거
- 문서의 대부분에서 등장하는 단어는 특정 주제나 내용을 구분하는 데 도움이 되지 않을 수 있음
- max_df = 0.5 “문서에서 50% 이상 나온 단어를 무시”
- max_df = 25 “문서에서 25번 이상 나온 단어를 무시”
- max_df
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번 이하로 나온 단어에 대해 무시”
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()
- 불용어(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)
- 하하하, 하하, ㅋㅋㅋㅋ, ㅋㅋ 등은 모두 웃음을 표현하지만 표현의 길이와 형태가 다름.
- 동일한 의미나 감정을 표현하는 단어나 구문의 다양한 변형을 표준 형태로 통일하면 모델이 이러한 표현들을 동일하게 인식할 수 있음
- 차원 축소
- 반복되는 글자의 다양한 변형이 그대로 데이터셋에 포함되면 모델이 처리해야 할 고유한 단어 수가 증가함 ⇒ 차원의 저주
- 반복되는 글자를 일정 규칙에 따라 정리함으로써 모델이 학습해야 할 단어의 수를 줄이고 연산 효율성을 높일 수 있음
- 과적합 방지
- 특정 단어나 구문이 과도하게 반복되어 사용되는 경우, 모델이 이 특성에 지나치게 의존하여 일반화 능력이 떨어질 수 있음
- 모델이 특정 표현 방식에 과도하게 의존하는 것을 방지
- 정규화 (Normalization)
'Data Scientist Bootcamp' 카테고리의 다른 글
[2/27] 시계열 데이터 분석 (Time Series) (1) | 2024.02.27 |
---|---|
[2/19] 전설의 포켓몬 예측하기!! (완전 신나게 한 프로젝트 ㅎㅎ) (0) | 2024.02.19 |
[2/14] 비지도 학습 (PCA, 클러스터링) (0) | 2024.02.14 |
[데싸통계] Day1 확률, 기술통계 (0) | 2024.01.26 |
[1/9] SQL 사용하여 데이터베이스 다루기 (0) | 2024.01.09 |