자연어와 단어의 분산 표현
2.1 자연어 처리란
2.2 시소러스
2.3 통계 기반 기법
2.4 통계 기반 기법 개선하기
2.1 자연어 처리란
- 자연어: 사람들이 평소에 쓰는 말
- 자연어 처리: 컴퓨터가 사람 말을 이해하도록 하는 것
- 자연어 처리 예시 : 검색 엔진, 기계 번역, 질의응답 시스템, 문장 자동 요약, 감정 분석 등
자연어는 같은 의미의 문장도 여러 방법으로 표현할 수 있으며 중의적 속성도 있기 때문에 의미나 형태가 유연하게 바뀐다.
이러한 속성 때문에 컴퓨터에게 자연어를 이해시키는 작업이 힘들다.
말의 의미는 단어로 구성된다. 따라서 자연어를 컴퓨터에게 이해시키기 위하여 컴퓨터에게 단어를 이해시키는 작업이 중요하다. 이를 위한 3가지 방법이 있다.
- 시소러스를 활용한 기법
- 통계 기반 기법
- 추론 기반 기법
2.2 시소러스
시소러스란 유의어 사전으로, 동의어(뜻이 같은 단어)나 유의어(뜻이 비슷한 단어)가 한 그룹으로 분류되어 있다.
해당 유의어 집합을 만든 다음, 단어들의 관계를 그래프로 표현하여 단어 사이의 연결을 정의
=> 컴퓨터에게 단어의 의미를 (간접적으로라도) 이해시켰다고 주장할 수 있음.
또한 상위와 하위 또는 전체와 부분 등 관계까지 신경을 쓰는 경우가 존재한다.
자연어 처리 분야에서 가장 유명한 시소러스는 WordNet.
시소러스의 문제점
: 사람이 수작업으로 레이블링 하기때문에 결점이 존재함
: 시대 변화에 대응하기 어렵다.
: 사람을 쓰기 때문에 비용이 많이 든다.
: 단어의 미묘한 차이를 표현할 수 없다.
2.3 통계 기반 기법
통계 기반 기법의 목표는 사람의 지식으로 가득한 말뭉치에서 자동으로 핵심을 추출하는 것이다.
말뭉치: 대량의 텍스트 데이터
해당 방법을 적용하기 위해 전처리 과정이 필요하다.
텍스트 데이터를 단어로 분할하고 분할된 단어를 단어 ID목록으로 만들어주면 된다.
corpus = [word_to_id[w] for w in words]
corpus = np.array(corpus)
하지만 이 방식은 단어 사이의 연관성에 대한 정보를 담을 수 없다.
각 단어를 vector에 매핑하고 단어 사이의 연관성을 vector 사이의 norm에 반영하는 방식 등장
=> 단어의 분산 표현
- 단어의 분산 표현
= 단어의 의미는 주변 단어에 의해 형성된다라는 의미 이용
= 각 차원은 특정 의미나 문법적 특성을 나타내며, 단어 간 유사성은 벡터 간의 거리나 유사도를 통해 측정할 수 있다.
문장을 you say goodbye and i say hello라고 하고 윈도우의 크기는 1이라고 가정했을 때의 분석이다.
그 다음 단어인 say를 기준으로 주변에 무슨 단어가 있는지 확인해본다.
이러한 작업을 통해 나오는 행렬을 동시발생 행렬이라고 한다. 동시발생 행렬을 통해 단어를 vector로 매핑시킬 수 있게 된다. 이를 통해 나오는 단어들 사이 유사도는 벡터 사이의 유사도를 통해 도출할 수 있다.(대표적으로 cosine유사도를 활용한다.)
- 동시 발생 행렬(co-occurrence matrix): 어떤 단어에 대해서 윈도우 크기에 따른 주변에 동시 발생한 단어들이 어떤 것들이 있고 몇 번 등장했는지를 집계하여 행렬로 나타낸 것, 각 행은 해당 단어를 표현한 벡터가 된다
- 단어 벡터 간 유사도: 대표적으로 코사인 유사도
두 벡터 x, y가 가리키는 방향이 얼마나 비슷한지 -> 1이면 완전히 같다 / -1이면 완전히 반대
2.4 통계 기반 기법 개선하기
- 상호정보량(poinwise mutual information)
동시발생 행렬의 원소는 두 단어가 발생한 횟수를 나타내지만 고빈도 단어 측면에서 보면 좋은 특징이 아니다.
(the-car보다 car-drive의 관련성이 높지만 동시발생 행렬을 이용하면 the-car의 연관성이 높다고 나올 것)
이를 해결하기 위해 점별 상호정보량(PMI) 척도 사용
PMI의 값이 높을수록 두 단어가 관련성이 높다.
PMI는 두 사건이 서로 독립적인 경우에는 0에 가까운 값을 갖게 되며 양수 값일수록 두 사건 간의 양의 상관관계를 나타낸다.
위의 식의 문제: 두 단어의 동시발생 횟수가 0일 경우 에러 발생 => 해결책: PPMI(양의 상호정보량)
PPMI는 PMI값이 음수인 경우를 0으로 대체하여 불필요한 정보를 제거하고 상호정보량의 양수성을 보장한다.
그러나 PPMI 행렬에는 말뭉치의 어휘 수가 증가함에 따라 각 단어 벡터의 차원수가 증가한다는 문제와 원소 대부분이 0이라는 문제가 있다.
이는 벡터의 원소 대부분의 '중요도'가 낮다는 뜻이고 이러한 벡터는 노이즈에 약하고 견고하지 못하다는 약점이 있다.
이를 해결하기 위해 수행하는 기법이 벡터의 차원 감소 이다.
- 차원 감소
차원 감소는 중요한 정보는 최대한 유지하면서 벡터의 차원을 줄이는 방법이다.
- SVD(특이값 분해)
: 차원 감소 방법 중 특이값 분해는 임의의 행렬을 세 행렬의 곱으로 분해하며 수식은 X = USV^T 이다.
(U,V: 직교행렬, S: 대각행렬, 대각성분 외에 모두 0인 행렬)
직교행렬 U는 어떤 공간의 축을 형성하며 여기서는 단어공간이다. 대각행렬 S의 대각성분에는 특잇값이 큰 순서로 나열되어 있다.
벡터 공간에서 위치가 가깝다는 것은 곧 의미가 가깞다는 것을 말함.
차원 감소의 결과로 원래의 희소벡터(원소 대부분이 0)는 밀집벡터(원소 대부분이 0이 아닌 값)로 변환된다. 이것이 단어의 분산 표현이다.
- SVD에 의한 차원 감소
SVD를 파이썬 코드로 실행해 각 단어를 2차원 벡터로 표현한 후 그래프를 그린 것이다.
- PTB 데이터 셋
자연어 처리 분야에서 사용되는 대표적인 데이터셋 (월스트리트저널의 일부 포함하고 있음)
- 고속 SVD 추천(sklearn 모듈)
PTB 데이터셋에서 맥락에 속한 단어의 등장 횟수를 센 후 PPMI 행렬로 변환하고 SVD를 사용해 차원을 감소시킴으로써 단어의 의미나 문법적인 관점에서 비슷한 단어들이 가까운 벡터들로 나오는 좋은 벡터를 얻을 수 있다.
이것이 단어의 분산표현이다.
대규모의 말뭉치를 사용하면 단어의 분산 표현의 품질은 더 좋아질 것이다.