개발 일지/자연어 처리

문자열 및 단어 표현 방식(TF-IDF, 원 핫 벡터, word2vec 등등)

RyanKwon 2022. 12. 22. 14:50
728x90

원본 데이터(문자열) 부터 tf-idf까지 정리.

여기에서는 개념 그 자체보다도 내가 이해했을때 어떤 특징이 있고 각 개념별 어떤 차이가 있는지를 위주로 서술.

 

0. 단어의 표현 방법에는 크게 두가지가 있다. 국소 표현, 분산 표현이 각각인데..

  - 국소 표현 : 단어 자체만 보고 단어를 표현

  - 분산 표현 : 주변 값을 참고하여 단어를 표현

위와 같은 차이가 있고, 각각에 또 여러 방법이 있다.

  - 국소 표현 (one hot vector, N-gram, DTM(Bag of Words))

  - 분산 표현 (word2Vec(FastText), LSA, Glove)

이 외에도 더 많을듯.

 

 

1. 정수 인코딩

원본 문자열의 예시는 다음과 같다. "키움 증권의 영웅문"

여기에서 명사만 추출한다면 키움, 증권, 영웅문 이렇게 3가지가 나오는데 소프트웨어상으로 이를 처리할 수 있도록 하기 위해 정수에 맵핑한다. 가령 키움 : 1, 증권 : 3, 영웅문 : 2 라면 위 문자열은 [1, 3, 2]가 된다.

 

2. 원 핫 인코딩

[1, 3, 2]는 단어를 정수에 대입해서 그 정수를 리스트로 표현한 것이다. 이는 행렬로도 표현할 수 있는데, 0~N번 열 각각을 하나의 단어로 설정하는 것이다. 위의 경우는 각 열이 키움, 영웅문, 증권이 될 것이다. 따라서

"키움" : [1, 0, 0]

"증권" : [0, 0, 1]

["키움", "증권"] : [[1, 0, 0] ,[0, 0, 1]]

이런 식으로 표현할 수 있다. 이러한 방법은 각 단어를 벡터화하고 문장간 유사도를 측정할 수 있게 한다. 다만 단어가 늘어날 수록 필요 공간이 계속 커진다는 단점이 있다.(비효율) 또한 단어간 유사성을 알기 어렵다.(단어의 잠재 의미 반영 어렵다)

 

 

3. Bag of Words

앞서 정수 인코딩을 했었는데 단어의 출현 빈도에 따라서 단어별로 순서를 매기는 정수 인덱스 부여 방법이 bag of words이다. 가령 하나의 paper에서 키움이 100번, 증권이 98번, 영웅문이 105번 출현하고 나머지 단어는 모두 97회 이하로 출현했다면

"영웅문" : 1

"키움" : 2

"증권" : 3

이런 식으로 인덱스가 부여된다. (1부터 인덱싱 가정)

그럼.. 이제 위 인덱스를 갖고 1번의 정수 인코딩을 하면 된다. 출현 빈도 기준으로 인코딩 하는걸 BOW라고 하는듯.

 

4. DTM

여러 문서에서 발생하는 단어의 빈도를 행렬로 표현한 것. 예를 들어서..

2번 원핫 인코딩에서

["키움", "증권"] : [[1, 0, 0] ,[0, 0, 1]] <- 이거를 [1, 0, 1]로 표현한 것이라고 보면된다.

빈도수를 생각해보면

["키움", "증권", "키움"] : [2, 0, 1] <- 이런식으로 빈도수에 따라서 입력 값이 달라진다.

서로 다른 문서의 BOW를 결합했기 떄문에 0 값이 들어가는 부분이 존재하게 된다.

희소표현이기 때문에 원핫인코딩처럼 저장공간이 커지게 되고, 빈도수 기반 접근으로 한계를 갖게 된다.

 

5. TF-IDF

DTM에서 각 단어의 중요도를 계산할 수 있도록 만든 가중치. 특정 단어가 등장한 문서의 수가 가장 중요하다.

식은 아래와 같다. 함수로 된 식은 찾아보면 나오니까 글로 풀어서 ..

 

(전체 문서 수 / (특정 단어가 등장한 문서의 수) + 1(혹시0일 수 있으므로)) <- 여기에 log 취함(차이 너무 커지는 것 방지)

 

전체 문서에서 특정 단어가 등장한 문서가 적을 수록 가중치가 커진다.

쉽게 말하자면 the같이 모든 문서에 등장하는 단어는 가중치가 작아진다. 

kiwoom이라는 단어가 들어간 문서가 10000개 중 딱 1개라면 kiwoom이라는 단어의 가중치는 상당히 크다.

 

4번 DTM값에 이렇게 계산한 IDF를 곱해주면 TF-IDF값이 나온다.

 

다시 말해서 전체 문서에서의 가중치를 구하고 한 문서 내에 해당 단어가 많은지 적은지를 또한 고려한다고 보면 된다.

 

6. Word2Vec

원 핫 인코딩은 단어간 유사성 표현 불가 -> 각 단어를 다차원 공간에 벡터화하는 방법을 사용(분산 표현) 예를 들어..

기존에 [1, 0] 이라는 벡터와 [0, 1] 이라는 벡터가 있고 각각 키움, 증권 이라는 단어가 맵핑되어있다면 우리가 봤을땐 두 단어는 유사성이 있지만 컴퓨터에서 [1, 0]과 [0, 1]은 아무런 유사성이 없다. 따라서 이를..

[0,46, 0,75], [0,52, 0.71] 이런식으로 나타내서(지금은 2차원에만 했지만 차원은 다양하게 가능) 단어벡터간 유사도를 계산하고자 한 것이 분산 표현. 이를 위한 대표적 학습 방법이 Word2Vec이다.

 

이 학습 방법에는 두가지 (CBOW, Skip-Gram)가 있다. 이는 추후 서술 ..

 

 

 

 

우선 여기까지 ..

정수 인코딩부터 word2vec까지 정리했다. word2vec같은 경우에는 더 얘기하기에는 내용이 조금 심도가 있어서, 그냥 배경을 살펴봤을때 저런 흐름으로 생겨난 개념이구나 + 저런 형태로 생긴거구나 만 서술했다.

 

개인적으로 word2vec, tf-itdf, 원 핫 인코딩 등의 개념이 헷갈려서 한번 정리할 필요를 느꼇다.

 

잘못된 정보가 있을 수도 있기 때문에 누구든 틀린 부분을 댓글로 말해주는건 환영입니다.

728x90