일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 면접왕이형
- 경제신문스크랩
- 과적합
- 학습 자동 중단
- 보이스피싱
- 모두의 딥러닝
- 밑바닥부터 시작하는 딥러닝
- MRC
- 선형회귀
- ESG 채권
- gradiant descent
- 경사하강법
- andoriod with kotlin
- 면접왕 이형
- 로지스틱 회귀법
- 안드로이드 구조
- 베스트 모델
- 딥페이크
- 밑시딥2
- 독서 #독서후기 #피로사회 #행동과잉 #긍정과잉
- nlp
- 안드로이드
- 뉴로 심볼릭
- GPT-3
- 밑시딥
- 예측선
- k겹 교차검증
- ESG
- 코틀린
- 다중분류
- Today
- Total
Practice makes perfect!
[밑시딥2] 2장 자연어와 단어의 분산 표현 본문
1. 자연어 처리란
NLP (Natural Language Processing)는 자연어를 처리하는 분야, 우리의 말을 컴퓨터에게 이해시키기 위한 기술이다.
영어, 한국어와 같은 자연어는 기계적이고 고정된 프로그래밍 언어와 달리 같은 의미의 문장도 여러 형태로 표현할 수 있고, 그 의미나 형태가 유연하게 바뀔 수 있다. 활용되는 예로 검색엔진, 기계번역, 질의응답 시스템, IME(입력기 전환), 문장 자동요약, 감정분석 등이 있다.
자연어를 컴퓨터에게 이해시키는 데는 '단어의 의미'를 이해시키는 것이 중요하다. 시소러스를 활용, 통계 기반, 추론 기반(word2vec) 이렇게 세 가지 기법이 있다.
2. 시소러스
먼저 시소러스는 사람이 직접 단어의 의미를 정의하는 방식이다. 시소러스는 '동의어'와 '유의어'가 한 그룹으로 분류된 사전이며 단어 사이의 '상/하위', '전체/부분' 등의 관계까지 정의해두기도 한다. 프린스턴 대학에서 구축한 WordNet이 가장 유명한데, NLTK 모듈을 설치해 사용할 수 있다. 그러나 이렇게 사람이 수작업으로 레이블링하는 방식에는 문제점이 있다. 변화하는 단어의 의미에 대응하기 어렵고, 엄청난 인적 비용이 발생하며, 단어의 미묘한 차이를 표현할 수 없다는 것이다. 이 문제를 피하기 위해 대량의 텍스트 데이터로부터 단어의 의미를 자동으로 추출하는 '통계 기반 방법'과 '추론 기반 방법'을 알아보자!
3. 통계 기반 방법
통계 기반 방법에서는 자연어 처리 연구 등을 염두에 두고 수집된 텍스트 데이터인 말뭉치(corpus)를 이용한다. 말뭉치에 담긴 문장들은 사람이 쓴 글이므로 문장을 쓰는 방법, 단어를 선택하는 방법 등 자연어에 대한 사람의 지식이 담겨있다고 볼 수 있다. (말뭉치에는 텍스트 데이터의 단어 각각에 품사가 레이블링 되는 등 추가 정보가 포함되는 경우도 있다) 말뭉치로는 위키백과, 구글 뉴스, 대문호의 작품들 등이 사용된다.
말뭉치 전처리는 텍스트 데이터를 단어로 분할하고, 분할된 단어를 ID 목록으로 변환한다.
text = 'You say goodbye and i say hello.'
text = text.lower()
text = text.replace('.', ' .') # 마침표 앞에 공백 삽입
words = text.split(' ')
단어를 텍스트 그대로 조작하는 것은 불편하기 때문에 딕셔너리를 이용해 단어 ID 와 단어를 짝지어준다.
word_to_id={}
id_to_word={}
for word in words:
if word not in word_to_id:
id = len(word_to_id)
word_to_id[word] = id
id_to_word[id] = word
'단어의 의미는 주변 단어에 의해 형성된다'는 분포 가설에 기초해 단어를 벡터로 표현할 수 있다. 주변에 놓인 단어를 몇 개나 맥락으로 포함할지를 '윈도우 크기'라 할 때 윈도우 크기가 2면 아래 그림과 같이 좌우 두 단어씩이 맥락에 포함된다. 한 단어의 맥락에 포함되는 단어의 빈도를 바탕으로 벡터로 표현할 수 있는데, 'you'를 [0,1,0,0,0,0,0] 으로 표현할 수 있다. (동시발생 행렬)
동시 발생 행렬에서 고빈도 단어의 문제점과 두 단어의 동시발생 횟수가 0일 때를 해결하기 위해 PPMI 행렬로 변환했다. 그러나 말뭉치의 어휘 수가 증가함에 따라 각 단어 벡터의 차원 수도 같이 증가한다는 큰 문제가 있었다. 또한 벡터 원소 대부분이 0 값을 가져 원소의 중요도가 낮았기 때문에 벡터의 차원 감소를 수행했다.
차원 감소의 핵심은 중요한 정보는 최대한 유지하면서 차원을 줄이는 것이다. 차원 감소 방법으로 SVD(Singular Value Decomposition)가 있는데 이는 임의의 행렬을 세 행렬의 곱으로 분해하여 특잇값이 작은 원소를 깍아내는 방법이다. 차원 감소의 결과로 희소 벡터는 원소 대부분이 0이 아닌 값으로 구성된 '밀집 벡터'로 변환된다. 이렇게 각 단어의 분산 표현을 만들어낼 수 있고 의미가 비슷한 단어들이 벡터 공간에서도 가까이 위치할 것으로 기대된다.
+ 텍스트 데이터 전처리 함수
- cos_similarity() : 벡터 간 유사도 측정
- most_similar() : 유사 단어의 랭킹 표시
'Study > 딥러닝' 카테고리의 다른 글
[모두의 딥러닝] 14장 베스트 모델 만들기 (0) | 2021.05.30 |
---|---|
[모두의 딥러닝] 13장 과적합 피하기 (0) | 2021.05.29 |
[모두의 딥러닝] 12장 다중 분류 문제 해결하기 (0) | 2021.05.29 |
[모두의 딥러닝] 11장 데이터 다루기 (0) | 2021.05.29 |
[모두의 딥러닝] 10장 모델 설계하기 (0) | 2021.04.17 |