정리 노트

31일 차(2022/08/15) 본문

[TIL]국민대X프로그래머스 여름방학 인공지능 과정

31일 차(2022/08/15)

꿈만 꾸는 학부생 2022. 8. 15. 20:34
728x90

순차 데이터(자연어)의 표현 법

  저번에 봤던 CNN, GAN 같은 경우에 이미지를 벡터로 변환해서 학습이 이루어졌습니다. 자연어를 다룰 때에도 똑같습니다. 자연어를 벡터로 변환시킵니다. 벡터는 벡터끼리 연산이 가능합니다. 이 특징을 바꿔서 말하자면 자연어와 자연어 사이의 연산이 가능하게 된다는 것입니다.

1. One-hot 인코딩

  단어를 수치적으로 표현하는 가장 기본적인 방법입니다. 예를 들어 가지고 있는 전체 단어 목록이 아래와 같다고 합시다.

대한민국 독립 만세 일제 광복절 스마트폰 애국

  이때 "광복절"이라는 단어는 다음과 같은 벡터로 표현이 가능해집니다.

대한민국 독립 만세 일제 광복절 스마트폰 애국
0 0 0 0 1 0 0

=> [0, 0, 0, 0, 1, 0, 0]

지금 같은 상황이면, 단어 하나를 7차원에서 표현하게 됩니다. 이렇듯 one-hot 인코딩 방법은 하나의 단어를 표현하기 위해 m차원 벡터가 사용되는 비효율적인 상황이 발생하게 됩니다. 또한 모든 단어들이 원점에서부터 거리가 같아지기 때문에 단어 간의 유사성을 측정하는데 어려움을 겪게 됩니다.

2. BoW (Bag of Words)

  직관적으로 해석하면 '단어들의 가방'입니다. 이는 단어가 등장하는 순서는 무시하고, 단어의 출현 빈도를 세는 데이터 표현 방법입니다. 예를 들어 "대한민국 만세, 대한민국 만세, 광복절 만세"라는 문장이 있다고 하면 BoW로 표현하면 아래처럼 표현됩니다.

만세 대한민국 광복절
3 2 1

  BoW 방식을 사용하면 시간성 정보가 사라지게 됩니다. 예를 들어, "April is the cruelest month" 문장과 "The cruelest month is April"은 BoW로 표현하면 같아지기 때문에 순서의 의미가 사라지게 됩니다.

 

  BoW를 여러 문서에 적용해서 하나의 행렬로 만든 것을 Document-Term Matrix(DTM)이라고 합니다. 예를 들어 세 문서에 각각 하나의 문장씩 있다고 합시다.

  • 문서 1: 광복절 만세
  • 문서 2: 대한민국 만세 독립 만세
  • 문서 3: 애국 독립 만세

  이를 DTM으로 표현하면 아래처럼 표현할 수 있습니다.

  대한민국 독립 만세 일제 광복절 스마트폰 애국
문서 1 0 0 1 0 1 0 0
문서 2 1 1 2 0 0 0 0
문서 3 0 1 1 0 0 0 1

  이렇게 표현하는 방법에는 단점이 있습니다. 현재 표에서는 단어를 7개로 한정했지만 실제 저희가 사용하는 단어는 많습니다. 이를 벡터로 표현하면 수만, 수십만 차원의 벡터의 크기를 가지게 됩니다. 여기서 실제 유용한 데이터의 비중을 생각하면 메모리 낭비가 일어날 수 있다는 단점이 보입니다.

3. TF-IDF(Term Frequency - Inverse Document Frequency)

  BoW와 다르게 특정 문서에서 특정 단어의 중요도를 고려할 때 사용할 수 있는 표현 방법입니다.

  • Term Frequency: 특정 문서에서 특정 단어의 등장 횟수
  • Document Frequency: 특정 단어가 등장한 문서의 수
  • Inverse Document Frequency: log( (전체 문서의 수) / DocumentFrequency(t) ) (t: 특정 단어)
  • TF-IDF: TermFrequncy(d, t) * InverseDocumentFrequency(t) (d: 특정 문서, t: 특정 단어)

  예시)

    문서 1: "대한민국 좋아요 대한민국 역사 좋아요"

    문서 2: "공학 좋아요 나머진 관심 없어요"

    문서 3: "저는 잘래요"

 

TF Table

  공학 관심 나머진 대한민국 없어요 역사 잘래요 저는 좋아요
문서 1 0 0 0 2 0 1 0 0 2
문서 2 1 1 1 0 1 0 0 0 1
문서 3 0 0 0 0 0 0 1 1 0

IDF Table

  공학 관심 나머진 대한민국 없어요 역사 잘래요 저는 좋아요
IDF log3 log3 log3 log3 log3 log3 log3 log3 log( 3/2 )

TF-IDF Table

  공학 관심 나머진 대한민국 없어요 역사 잘래요 저는 좋아요
문서 1 0 0 0 0.95424 0 0.47712 0 0 0.35218
문서 2 0.47712 0.47712 0.47712 0 0.47712 0 0 0 0.17609
문서 3 0 0 0 0 0 0 0.47712 0.47712 0

하지만 TF-IDF에서도 sparse 문제가 발생합니다. 그리고 BoW에 비해 항상 성능이 좋지만은 않습니다.

벡터 간 유사도 측정법

  지금까지 자연어를 벡터로 변환하는 방법들을 봤습니다. 벡터로 변환했으면 이 벡터들 간의 유사도를 측정할 수 있습니다.

1. 유클리드 거리(Euclidean Distance)

  저희가 거리를 구하려고 생각하면 아마 가장 먼저 떠오르는 거리가 유클리드 거리일 것입니다. 이는 두 점 간의 거리를 구하는 것처럼 똑같이 생각하면 됩니다. 거리가 짧을 수록 유사하다는 의미를 가집니다.

EuclideanDistance(A, B) = √((A1 - B1)**2 + (A2 - B2)**2 + ... + (An - Bn)**2) (n은 벡터 A, B의 차원 수)

  하지만 이 유클리드 거리가 항상 효과적이지 않을 때도 존재합니다. 예를 들어 세 문서에 각각 한 문장씩 있다고 합시다.

  • 문서 1: 컴퓨터 좋아
  • 문서 2: 컴퓨터 좋아 컴퓨터 좋아 컴퓨터 좋아
  • 문서 3: 컴퓨터 싫어

  이를 BoW 표현으로 표현하면 아래와 같습니다.

  컴퓨터 좋아 싫어
문서 1 1 1 0
문서 2 3 3 0
문서 3 1 0 1

  이를 그림으로 표현하면 아래와 같습니다.

점으로 찍어서 표현한 그림

  벡터 '문서 1'과 벡터 '문서 2' 사이의 거리는 2√2이고, 벡터 '문서 1'과 벡터 '문서 3' 사이의 거리는 √2이므로 문서 1과 3은 반대의 내용이지만 거리가 가까우므로 두 문서의 내용은 유사하다고 판단하게 됩니다.

2. 코사인 유사도(Cosine Similarity)

  다음으로 확인해볼 방법은 코사인 유사도입니다. 이는 벡터의 크기가 아닌 두 벡터 사이의 각도만 고려하는 측정 방법입니다. 방향이 같으면 1, 방향이 정반대면 -1 값을 가집니다. 즉 1에 가까운 수가 나올수록 유사하다는 의미를 가지게 됩니다.

cos(𝜃) = (A · B) / (||A|| * ||B||) (𝜃: 벡터 A, B 사이의 각도, ||A||, ||B||: 벡터 A, B의 norm)

  이 식을 바탕으로 문서 1과 문서 2, 문서 1과 문서 3의 코사인 유사도를 각각 구해보면 1, 0.499... 가 나오므로 문서 1과 문서 2가 유사하다는 판단을 할 수 있습니다.

728x90

'[TIL]국민대X프로그래머스 여름방학 인공지능 과정' 카테고리의 다른 글

33일 차(2022/08/17)  (0) 2022.08.17
32일 차(2022/08/16)  (0) 2022.08.17
29일 차(2022/08/11)  (0) 2022.08.12
28일 차(2022/08/10)  (0) 2022.08.11
27일 차(2022/08/09)  (0) 2022.08.09