자연어 처리(Natural Language Processing, NLP)
: 컴퓨터를 통해 인간의 언어를 분석 및 처리 하는 인공지능의 한 분야
ex) 문서 분류, 키워드 추출, 감정 분석
학습 가능한 데이터양의 증가 및 연산 처리 속도의 발전으로 복잡한 머신러닝 기술 적용 가능
ex) 문서 요약, 기계 번역, Chat bot
데이터 탐색 -> 데이터 전처리 과정이 선행되어야 함.
데이터 통계치, 변수별 특징 -> 이상치 제거, 정규화
단어 개수, 단어별 빈도수 -> 특수기호 제거, 단어 정규화
토큰화(tokenization): 주어진 텍스트를 각 단어 기준으로 분리하는 것을 의미
(띄어쓰기를 기준)
-> 소문자 처리 및 특수기호 제거를 통해 동일한 의미의 토큰은 동일한 형태로 변환
rstrip() : 맨 오른쪽에 있는 것을 끊어냄(컴퓨터 text에 존재하는 줄바꿈 기호를 없애기 위함)
split(): 공백 기준으로 나눠서 각 요소를 리스트에 넣기
대부분 단어의 빈도수의 분포는 지프의 법칙(Zipf's law)를 따른다.
: 자주 발생하는 단어는 정말 많이 발생, noise가 많다고 볼 수 있음. 빈도수가 많지는 않지만 발생하는 단어의 개수를 보면서 long tail에 위치한 단어 고려
re : 정규표현식 라이브러리( 정규표현식: 정의하는 규칙을 가진 문자열 집합)
regex = re.compile('[^a-z A-Z]') -> 우리는 a부터 z, 공백, A부터 Z 만을 패턴으로!
print(regex.sub(' ', word)) -> 이 패턴이 아닌 단어는 공백으로 대체
<Stopword 제거>
import nltk: 전처리 더 쉽게 (nltk에는 stopwords 들이 정의되어 있음
from ntlk.corpus import stopwords
<Stemming: 정규화>
: 동일한 의미의 단어이지만, 문법적인 이유 등 표현방식이 다양한(3인칭 단수, 과거형) 단어를 공통된 형태로 반환
실습1
word_counter = dict()
# 단어가 key, 빈도수가 value로 구성된 딕셔너리 변수를 만드세요.
with open('text.txt', 'r') as f:
for line in f:
for word in line.rstrip().split():
if word not in word_counter:
word_counter[word] = 1
else:
word_counter[word] += 1
print(word_counter)
# 텍스트 파일에 내 모든 단어의 총 빈도수를 구해보세요.
total = 0
# 텍스트 파일 내 100회 이상 발생하는 단어를 리스트 형태로 저장하세요.
up_five = list()
for word, freq in word_counter.items():#딕셔너리 안 요소
total += freq
if freq >= 100:
up_five.append(word)
print(total)
print(up_five)
실습2
import re
word_counter = dict()
regex = re.compile('[^a-zA-Z]')
# 텍스트 파일을 소문자로 변환 및 숫자 및 특수기호를 제거한 딕셔너리를 만드세요.
with open('text.txt', 'r') as f: # 실습 1 과 동일한 방식으로 `IMDB dataset`을 불러옵니다.
for line in f:
words = line.rstrip().lower().split()
for word in words:
#전처리가 완료된 단어
processed_word = regex.sub('', word) #문자열 내 regex 변수의 정규표현식에 해당하는 모든 문자(''로 교체)
if processed_word not in word_counter:
word_counter[processed_word] = 1
else:
word_counter[processed_word] += 1
count = word_counter["the"]
# 단어 "the"의 빈도수를 확인해 보세요.
print(count)
실습 3 : NLTK를 통한 stopwords, stemming 처리
단어 임베딩
-> 각 단어를 연속형 벡터(방향성, 그리고 그 방향성의 길이가 있는 수학형 표현)로 표현하는 방법을 의미
자연어의 기본 단위인 단어를 수치형 데이터로 표현하는 것이 중요
ex) 고유한 id부여하기
유사한 단어의 임베딩 벡터는 인접한 공간에 위치하게끔 학습된다
서울 - 뉴욕 / 강아지 -고양이
-> 임베딩 벡터 간 합
word2vec
주어진 문맥에서 발생하는 단어를 예측하는 문제로 통해 단어 임베딩 벡터를 학습
뉴럴 네트워크
from gensim.models import Word2vec
중요한 인자로
w2v_model = Word2Vec(min_count = 2, window = 2, vector_size = 300)
min_count 인자는 최소 단어 횟수 설정
window 인자는 문맥의 범위를 뜻함. ex) 한 단어를 찾는다면, 앞 단어와 뒤에 위치한 단어를 입력으로 삼는다
vector_size는 차원의 수. 은닉층의 노드 수
build_vocab 은 학습 데이터 각각을 특정 정수 부여
train(doc(학습할 데이터), total_examples = w2v_mode.corpus_count or 문서의 개수, epochs(에폭스, 학습데이터를 몇번 순환하면서 학습할 건지 그 횟수) = 20)
--> 치명적 단점: 미등록 단어 문제, out-of-vocabulary
fastText
: 각 단어를 문자 단위로 나누어서 단어 임베딩 벡터를 학습
: 학습 데이터에 존재하지 않았던 단어의 임베딩 벡터 또한 생성 가능해서 문제 해결
'Data Analysis' 카테고리의 다른 글
문서 유사도 및 언어 모델 (0) | 2022.07.29 |
---|---|
한국어 자연어 처리 및 문장 유사도 (0) | 2022.07.29 |
감정 분석 서비스 (0) | 2022.07.29 |