단어 표현 방법
시작하기 전에…
이 글은 자연어 처리 시 텍스트를 표현하는 방법에 대해 다룹니다.
One Hot Vector
One Hot Vector란 표현하고자하는 하나의 단어에만 값을 넣고, 나머지는 0으로 채우는 vector다. Vector값 중 하나의 값만 1이 들어가있어 One Hot Vector라는 이름이 붙었다고한다.
아래 예시를 보자
1
2
3
4
5
6
7
8
9
10
11
12
13
words = ['unk', 'leeseojune', 'backend', 'developer', 'is'] # 단어들이 words와 같은 순서 (leeseojune : 1) 일 때
vector_value = one_hot_vector('leeseojune is backend developer nice')
# one_hot_vector 처리를하면 아래와 같이 값이 나오게 된다.
# vector_value = [
# [0, 1, 0, 0, 0], leeseojune이라는 단어는 words의 1번째 인덱스에 들어가있다. 1번 vector에 값이 On 된다. (1번 index)
# [0, 0, 0, 0, 1], is (4번 index)
# [0, 0, 1, 0, 0], backend (2번 index)
# [0, 0, 0, 1, 0], developer (3번 index)
# [1, 0, 0, 0, 0] nice는 words에 따로 등록되어있지 않은 값이므로 UNK(Unknown)값의 Index인 0번째 vector에 값이 On된다. (vocabulary에 없는 값은 unk(unknown)에 값을 넣는다.)
#]
One Hot Vector로 구성하게되면 발생하는 문제는 무엇일까?
바로 문장이 길어지면 Vector의 차원이 너무 많이 늘어난다는 것이다.
Bag of Words(BoW)
Bag of Words(BoW)는 One Hot Vector와 다르게 하나의 Vector로 뭉개서 표현한다.
1
2
3
4
5
6
7
8
9
10
11
12
words = ['unk', 'leeseojune', 'backend', 'developer', 'is'] # 단어들이 words와 같은 순서 (leeseojune : 1) 일 때
vector_value = bow('leeseojune is backend developer he is nice developer')
# BoW 처리를하면 아래와 같이 값이 나오게 된다.
# bow_value = [2, 1, 1, 2, 2]
# 문장에 words에 따로 등록되어있지 않은 unknown인 단어 he, nice 2 개가 있으므로 2 => 2
# leeseojune => 1
# backend => 1
# developer => 2
# is => 2