상세 컨텐츠

본문 제목

자연어처리(3)_임베딩

카테고리 없음

by teminam 2023. 6. 26. 17:43

본문

    임베딩은 고차원의 데이터를 저차원의 벡터 공간으로 매핑하는 기술입니다.
    이러한 임베딩은 주로 기계학습 모델에서 입력 데이터를 처리하고 표현하는 데
    사용됩니다. 임베딩은 데이터의 특성을 보존하면서 벡터 형태로 표현함으로써
    기계학습 알고리즘에 데이터를 효과적으로 제공할 수 있습니다.

    일반적으로, 임베딩은 원-핫 인코딩과 달리 실수 벡터로 표현됩니다. 각 차원은
    특정한 의미를 나타내며, 벡터 공간에서의 거리와 유사도를 활용하여 데이터
    간의 관계를 파악할 수 있습니다. 예를 들어, 단어 임베딩에서는 단어 간의
    의미적 유사성을 계산할 수 있으며, 이미지 임베딩에서는 유사한 이미지를 찾을
    수 있습니다.

    임베딩은 다양한 방법으로 생성될 수 있습니다. 일부 주요한 임베딩 기법은
    다음과 같습니다:

    1. Word2Vec: 단어 임베딩을 학습하기 위한 기법으로, 단어의 분산 표현을
    만듭니다. CBOW(Continuous Bag-of-Words)와 Skip-gram 두 가지 모델이 있으며,
    주변 단어를 이용하여 특정 단어를 예측하는 방식으로 학습됩니다.

    2. GloVe: 전역적인 통계 정보를 이용하여 단어 간의 의미 관계를 임베딩합니다.
    단어의 동시 등장 행렬을 분해하여 단어 벡터를 생성하는 방식입니다.

    3. FastText: 단어를 n-gram의 집합으로 나누어 표현하고, 이를 기반으로 단어
    벡터를 생성합니다. 특히, 희귀한 단어에 대한 표현을 더 잘 처리할 수 있는
    장점이 있습니다.

    4. 이미지 임베딩: Convolutional Neural Network (CNN)과 같은 딥러닝 모델을
    사용하여 이미지를 저차원 벡터로 변환합니다. 이를 통해 이미지 간의 유사성을
    계산하거나 이미지 분류 및 검색에 활용할 수 있습니다.

    이 외에도 다양한 임베딩 기법과 모델이 개발되고 있으며, 특정한 태스크나

    도메인에 따라 적합한 임베딩 방법을 선택할 수 있습니다. 임베딩은 데이터의
    특성을 잘 표현하고 기계학습 모델의 성능을 향상시키는 중요한 요소로 인정받고
    있습니다.

 

1. 자연어의 특성

  • 자연어를 기계가 처리하도록 하기 위해서는 먼저 자연어를 기계가 이해할 수 있는 언어로 바꾸는 방법을 알아야 함
  • 토큰화 작업의 결과인 단어 사전을 기계가 이햐할 수 있는 언어로 표현하는 과정이고, 단어 사전 내 단어 하나를 어떻게 표현할까의 문제로 볼 수 있음

1-1. 단어의 유사성과 모호성

  • 대부분의 언어에서 단어의 의미는 유사성과 모호성을 가지고 있는데, 단어는 겉으로 보이는 형태인 표제어 안에 여러가지 의미를 담고 있음
  • 대부분 사람은 주변 정보에 따라 숨겨진 의미를 파악하고 이해할 수 있으나, 기계는 학습의 부재 또는 잘못된 데이터로 의미를 파악하지 못하는 경우가 있음
  • 한 가지 형태의 단어에 여러 의미가 포함되어 생기는 중의성 문제는 자연어 처리에서 매우 중요
    • 동형어와 다의어
      • 동형어: 형태는 같으나 뜻이 서로 다른 단어(동음이의어)
      • 다의어: 하나의 형태가 여러 의미를 지니면서도 그 의미들이 서로 관련이 있는 단어(먹다)
    • 동의어
      • 서로 다른 형태의 단어들이 동일한 의미를 가지는 단어
    • 상의어와 하위어
      • 상의어: 상위 개념을 가리키는 단어
      • 하위어: 하위 개념을 가리키는 단어
 

1-2. 언어의 모호성 해소

  • 동형어나 다의어처럼 여러 의미를 가지는 단어들이 하나의 형태로 공유, 동의어처럼 하나의 형태를 가지는 단어들이 서로 같은 의미를 공유
  • 단어 중의성 해소(WSD) 알고리즘 방법을 통해 단어의 의미를 명확히 함
    • 지식 기반 단어 중의성 해소
      • 컴퓨터가 읽을 수 있는 사전이나 시소러스(어휘집) 등을 바탕으로 단어의 의미를 추론하는 접근 방식
      • 사람이 직접 선별해서 데이터를 넣으므로 노이즈가 적음
      • 영어 자연어처리 분야에서 가장 유명한 WordNet이 있음
      • 관계 구축에 많은 리소스가 필요함
      • 시의성을 반영하지 못함
      • 데이터 편향이 생길 수 있음
    • 지도 학습 기반 단어 중의성 해소
      • 지도 학습은 데이터에 정답이 있다는 의미로, 각종 기계학습 알고리즘을 통해 단어 의미를 분류해내는 방법
      • WSD라고 하면 보통 단어의 세부 의미가 부착된 코퍼스를 학습 데이터로 사용하여 학습에 쓰이지 않았던 새로운 문장에서 단어 의미를 판별해내는 경우
      • 좋은 성능을 위해서는 질 높은 레이블을 가진 크기가 큰 데이터가 필요함
      • 데이터가 충분할 경우, 일반화된 환경에서도 괜찮은 성능을 낼 수 있음
    • 비지도 학습 기반 단어 중의성 해소
      • 비지도 학습 WSD는 단어 의미추론 작업인 WSI를 가리키는 경우가 많음
      • 문장에 등장하는 각 단어의 의미를 사전적인 의미에 연결하지 않고, 세부 의미가 같은 맥락을 군집화하는 데에 초점을 맞춤
      • 대규모 자연어 코퍼스로부터 추가 작업 없이 자동적으로 학습을 수행할 수 있어서 활용 가능성이 높음
      • 사람이 직접 제작한 학습 데이터를 사용하지 않기 때문에 성능을 내기 어려움

2. 임베딩 구축 방법


2-1. 임베딩이란

  • 자연어처리 작업에서 특징 추출을 통해 자연어를 수치화하는 과정이 필요하고, 이런 벡터화의 과정이자 결과
  • 토큰화 작업의 목표는 사실상 임베딩을 만들기 위한 단어 사전을 구축하는 것

2-2. 임베딩의 역할

  • 자연어의 의미적인 정보 함축
    • 자연어의 중요한 특징들을 추출하여 벡터로 압축하는 과정
    • 임베딩으로 표현된 문장은 실제 자연어의 주요 정보들을 포함하고 있음
    • 벡터인 만큼 사칙연산이 가능하여 단어 벡터간 덧셈/뺄셈을 통해 단어들 사이의 의미적 문법적 관계를 도출
    • 임베딩의 품질을 평가하기 위해 사용되는 단어 유추 평가 예시
  • 자연어 간 유사도 계산
    • 자연어를 벡터로 표현하면, 코사인 유사도를 활용하여 두 벡터 간 유사도를 계산할 수 있음
    • 코사인 유사도는 -1 이상 1 이하의 값을 가지며, 값이 1에 가까울수록 유사도가 높다고 판단함
  • 전이 학습
    • 품질 좋은 임베딩을 사용할수록 목표로하는 자연어처리 작업의 학습속도와 성능이 향상됨
    • 이미 만들어진 임베딩을 다른 작업을 학습하기 위한 입력값으로 쓰임 -> 전이학습
    • 매번 새로운 것을 배울때 scratch 부터 시작한다면 매 학습이 오래 걸림
    • 파인튜닝: 학습하는데 임베딩을 초기화하여 사용하면 새로운 작업을 학습함에도 빠르게 학습할 수 있고 성능도 좋아짐

2-3. 임베딩을 만들 때 쓰는 통계적인 가설

  • 문장을 구성하는데 어떤 단어가 얼마나 많이 쓰이는가?
  • 문장에 어떤 단어가 같이 쓰이는가
  • 단어가 어떤 순서로 등장하는가?
 

2-4. 단어 출현 빈도에 기반한 임베딩 구축 방법

  • 원 핫 인코딩
    • 자연어를 0과 1로 구별하겠다는 인코딩 방법
    • 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 나머지 인덱스에는 0을 부여하는 벡터 표현방식
    • 희소문제(Sparsity Problem)
      • 예) 단어 사전의 크기가 10,000 이라면, 총 10,000개 중 현재 단어를 표현하는 1개의 차원만 1이고, 나머지 9,999개의 차원은 0으로 표현
      • 대부분의 값들의 0인 행렬을 희소행렬이라 하는데, 단어가 늘어날수록 행렬의 크기는 계속 증가하나 증가하는 크기에 비해 표현 효율성이 떨어짐
    • 단어의 유사도를 표현하지 못함
  • Bag of Words
    • 단어들의 순서는 전혀 고려하지 않고, 단어들의 출현빈도에 집중하는 자연어 코퍼스의 데이터 수치화 방법
    • 각 단어에 고유한 정수 인덱스를 부여하여 단어 집합을 생성하고, 각 인덱스 위치에 단어 토큰의 등장 횟수를 기록한 벡터를 만듦
    • 단어 단위의 압축 방식이기 때문에 희소문제와 단어 순서를 반영하지 못함
  • TF - IDF
    • 단어의 빈도와 역문서 빈도를 사용하여 문서-단어 행렬 내 각 단어들의 중요한 정도를 가중치로 주는 표현 방식
    • 문서의 유사도를 구하는 작업, 검색 시스템에서 검색 결과의 중요도를 정하는 작업, 문서 내에서 특정 단어의 중요도를 구하는 작업 등에서 효과적으로 쓰일 수 있음
    • 단어의 중요도를 고려해도 여전히 단어의 빈도로 판단하는 표현 방식이기 때문에 맥락적 유사도를 반영하지 못함
    • 단어 사전의 규모 자체를 축소하는 방법이 아니기 때문에 단어 사전의 규모가 크다면 높은 계산 복잡도를 요구하는 표현방식(희소 문제)

2-5. 분포가설과 언어모델

  • 비슷한 위치(문맥) 내에서 등장하는 단어들은 비슷한 의미를 가진다는 가설
  • 움트다
  • ex. 봄이 되자 나뭇가지에는 파릇파릇 싹이 움트고 있었다
  • ex. 잎사귀가 움트기 시작해도 물 올라가는 나무뿌리
  • 분포가설은 목표 단어의 단어들, 즉 window 크기에 따라 정의되는 문맥의 의미를 이용해 단어를 벡터로 표현하는 것이 목표
  • 분포가설 이라는 가정하에 만들어진 표현방법을 분석표현이라고 함
  • PMI(Pointwise Multual Information)
  •  * 분포가설의 대표적인 통계량은 PMI이며, 두 확률변수 사이의 상관성을 계량화하는 단위 * 확률변수가 완전히 독립인 경우에 값이 0이 되며, 독립이라는 말은 단어 x가 나타나는 것이 단어 y가 등장할 확률에 전혀 영향을 주지 않으며, 반대로 단어 y의 등장이 단어 x에 영향을 주지 않는 것을 의미함 * 단어 x가 등장할 때 문맥내에 단어 y와 같이 자주 등장한다면 PMI값이 커짐 * 분포가설을 활용하는 대표적인 모델은 2013년 google의 [Efficient Estimation of Word Representations in Vector Space](https://arxiv.org/abs/1301.3781) 논문에서 발표된 Word2Vec이라는 단어 임베딩 기법

 

 

2-6. 단어가 어떤 순서로 쓰이는가

  • 통계 기반 언어모델
    • 언어모델: 일련의 단어 토큰에 확률을 할당하는 모델
    • 단어의 등장 순서를 중요하게 고려하지 않았던 이전 가설들과 다르게, 언어모델은 단어 시퀀스 정보를 명시적으로 학습함
    • 단어가 n개 주어졌을 때, 언어모델은 n개의 단어가 도잇에 나타날 확률을 반환
    • 문장은 어순을 고려하여, 여러 단어로 이루어진 단어 시퀀스라고도 부르며, n개의 단어로 구성된 단어 시퀀스를 확률적으로 표현
  • 딥러닝 기반 언어모델
    • 통계 기반 언어모델에서는 여전히 등장 빈도라는 통계량을 활용하여 확률을 추산했지만, 딥러닝 기반 언어모델들이 등장하면서 딥러닝 모델들이 입력과 출력 사이의 관계를 유연하게 정의할 수 있게 되고, 그 자체로 확률 모델로 동작할 수 있음
      • MLM(Masked Language Modeling)
        • 문장 중간에 마스크를 씌워서 해당 마스크에 어떤 단어가 올지 예측하는 과정에서 학습을 진행문장 전체를 다 보고, 중간에 있는 단어를 예측하기 때문에 양방향 학습이 가능
        • 대표적으로 BERT 모델이 있음
    • Next Token Prediction
      • 주어진 단어 시퀀스를 가지고 다음 단어로 어떤 단어가 올지 예측하는 과정에서 학습
      • 단어를 순차적으로 입력 받은 뒤, 다음 단어를 맞춰야하기 때문에 단방향 학습을 함
      • 대표적으로 GPT, ELMo 등

3. 텍스트 유사도

  • 두 개의 자연어 텍스트가 얼마나 유사한지를 나타내는 방법
  • 유사도를 정의하거나 판단하는 척도가 주관적이기 때문에, 이를 최대한 정량화하는 방법을 찾는 것이 중요함
  • 자연어처리 분야에서 자주 사용되는 유사도 측정 방법
    • 유클리디안 거리 기반 유사도
    • 맨하탄 거리 기반 유사도
    • 코사인 유사도
    • 자카드 유사도
    • 문자열 간 유사도
 

3-1. 유클리디안 거리 기반 유사도

  • 두 점 사이의 거리를 측정하는 유클리디안 거리를 사용하여, 문서의 유사도를 구하는 방법으로 거리가 가까울수록 유사도가 높다고 판단함
  • 자카드 유사도나 코사인 유사도만큼 유용하게 사용되는 방법은 아니나, 자연어처리 분야뿐만 아니라 다른 분야에서도 범용적으로 사용되는 거리 측정 기법

3-2. 맨하탄 거리 기반 유사도

  • 맨하탄 거리를 사용하여 문서의 유사도를 구하는 방법
  • 유클리드 거리와 유사하나, 각 차원의 차를 제곱해서 사용하는 대신 절대값을 바로 합산함
  • 항상 유클리드 거리보다 크거나 같음
  • 다차원 공간 상에서 두 좌표 간 최단거리를 구하는 방법이 아니다 보니, 특별한 상황이 아니면 잘 사용하지 않음

 

 

    유클리디안 거리 기반과 맨하탄 거리 기반은 두 지점 사이의 거리를 계산하는
    방법으로서 다음과 같은 차이점을 가지고 있습니다:

    1. 계산 방식:
      - 유클리디안 거리: 두 지점 사이의 직선 거리를 계산합니다. 피타고라스의
      정리를 사용하여 계산됩니다.
      - 맨하탄 거리: 두 지점 사이의 가로 및 세로로 이동하는 거리를 계산합니다.
      좌표 상의 거리 차이를 더한 값입니다.

    2. 고려하는 요소:
      - 유클리디안 거리: 실제 도로 네트워크나 도시의 지형을 고려하지 않고,
      공간에서의 직선 거리만을 고려합니다. 지형적인 장애물이나 도로 상황을
      고려하지 않으므로, 실제 이동 경로와는 차이가 있을 수 있습니다.
      - 맨하탄 거리: 도로 네트워크나 도시의 지형을 고려하여 가로 및 세로로
      이동하는 거리를 계산합니다. 도시의 실제 도로망을 반영하므로, 더 현실적인
      이동 거리를 예측할 수 있습니다.

    3. 적용 분야:
      - 유클리디안 거리: 공간 분석, 클러스터링, 이미지 처리 등에서 주로
      사용됩니다. 실제 도로 네트워크를 고려하지 않는 특성 때문에 이동 경로가
      중요하지 않은 경우에 유용합니다.
      - 맨하탄 거리: 배달 서비스, 길 찾기 알고리즘, 교통 최적화 등에 주로
      사용됩니다. 실제 도로 네트워크를 고려해야 하는 상황에서 이동 경로를
      예측하고 최적화하는 데에 유용합니다.

    4. 계산 복잡성:
      - 유클리디안 거리: 직선 거리를 계산하는 방식이기 때문에 계산이 비교적
      간단하고 빠릅니다.
      - 맨하탄 거리: 가로 및 세로 이동 거리를 계산하는 방식이기 때문에 계산이
      상대적으로 복잡할 수 있습니다.

    따라서, 유클리디안 거리는 공간적인 관점에서의 거리를 간단하게 계산하는 데에
    유리하며, 맨하탄 거리는 도로 네트워크나 실제 이동 경로를 고려하여 이동
    거리를 예측하는 데에 더 유용합니다. 배달업체들은 보통 맨하탄 거리를
    사용하여 실제 도로 상황을 고려한 효율적인 배달 경로를 계획하고 최적화합니다.

 

 

3-3. 코사인 유사도

  • 코사인 유사도는 두 개의 벡터값에서 코사인 각도를 이용하여 구할 수 있는 두 벡터의 유사도를 의미
  • 두 벡터의 방향이 완전히 동일한 경우에는 1의 값을 가지며, 90도의 각을 이루면 0, 180도로 반대의 방향을 가지면 -1의 값을 가짐
  • -1 이상 1 이하의 값을 가지며 값이 1에 가까울수록 유사하다는 것을 의미
  • 두 벡터가 가리키는 방향이 얼마나 유사한가를 의미하기 때문에, 자연어 내 유사도 계산에 더 적합함

3-4. 자카드 유사도

  • 두 문장을 각각 단어의 집합으로 만든 뒤 두 집합을 통해 유사도를 측정하는 방식
  • 수치화된 벡터 없이 단어집합 만으로 계산할 수 있음
  • 두 집합의 교집합인 공통된 단어의 개수를 두 집합의 합집합, 전체 단어의 개수로 나누는 것
  • 전체 합집합 중 공통의 단어의 개수에 따라 0과 1 사이의 값을 가지며, 1에 가까울수록 유사도가 높음

4. 유사도 측정 실습


  • sen_1, sen_2 : 의미가 유사한 문장 간 유사도 계산(조사 생략)
  • sen_1, sen_3 : 의미가 유사한 문장 간 유사도 계산(순서 변경)
  • sen_2, sen_4 : 문장 내 단어를 임의의 단어로 치환한 문장과 원 문장간 유사도 계산
  • sen_1, sen_5 : 의미는 다르지만 비슷한 주제를 가지는 문장간 유사도 계산
  • sen_1, sen_6 : 의미가 서로 다른 문장간 유사도 계산

 

 

 

 

 

 

    해당 코드는 다음과 같은 단계로 나누어져 있습니다:

    1. 라이브러리 임포트:
      - `newspaper``kss` 라이브러리를 임포트합니다. 이 라이브러리들은 각각
      웹에서 기사를 가져오고, 텍스트를 문장 단위로 분리하는 기능을 제공합니다.

    2. 기사 URL 설정:
      - `URL` 변수에 원하는 기사의 URL을 지정합니다. 이 코드에서는 다음 기사를
      예시로 사용하고 있습니다: 'https://v.daum.net/v/20230628095658169'.

    3. 기사 객체 생성:
      - `Article` 클래스를 사용하여 `article` 객체를 생성합니다. 이때, 기사
      URL과 언어('ko'는 한국어)를 인자로 전달합니다.

    4. 기사 내용 추출:
      - `article` 객체의 `text` 속성을 사용하여 기사의 텍스트 내용을
      추출합니다. 추출된 텍스트는 개행 문자(`\n`)로 구분된 여러 줄로 이루어진
      문자열입니다.

    5. 문장 분리 함수 정의:
      - `sentence_seperator` 함수를 정의합니다. 이 함수는 주어진 텍스트를 문장
      단위로 분리하는 역할을 합니다.
      - 입력으로 받은 텍스트를 개행 문자(`\n`)로 분리한 후, 각 줄을 순회하면서
      공백 문자를 제거하고 비어있지 않은 경우 `kss.split_sentences()` 함수를
      사용하여 문장을 분리합니다.
      - 분리된 문장들을 `splited_context` 리스트에 추가합니다.
      - 최종적으로 `splited_context` 리스트를 반환합니다.

    6. 문장 분리 및 출력:
      - `sentence_seperator` 함수를 사용하여 `news_context`를 문장 단위로
      분리한 결과를 `splited_context` 변수에 저장합니다.
      - 반복문을 사용하여 `splited_context`의 각 문장에 대해 인덱스와 내용을
      출력합니다.

    이렇게 코드가 작동하며, 결과로는 주어진 기사의 본문을 문장 단위로 분리한
    내용이 출력됩니다.

 

 

 

 

    주어진 코드는 Bag of Words (BoW) 기반의 문서-단어 행렬을 생성하기 위해 사용됩니다.

    1. `CountVectorizer`를 사용하여 BoW 표현을 만들기 위한 객체
    `bow_vectorizer`를 초기화합니다.
    2. `bow_vectorizer.fit(augmented_training_documents)`를 호출하여 훈련
    데이터에 대해 단어 사전을 생성합니다. 이를 통해 단어들이 고유한 인덱스로
    매핑되는 `word_idxes` 사전이 생성됩니다.

    `word_idxes`는 단어와 해당 단어의 인덱스 사이의 매핑을 나타내는 사전입니다.
    사전의 키는 단어이고, 값은 해당 단어의 인덱스입니다. 예를 들어, '오늘'은
    인덱스 56에 매핑되고, '점심에'는 인덱스 69에 매핑되는 식으로 각 단어들이
    인덱스와 매핑되어 있습니다.

    이 사전은 각 단어에 대한 고유한 인덱스를 제공합니다. 이 인덱스는 BoW 행렬의
    열 인덱스로 사용되며, 해당 단어가 문장에서 등장하는 빈도를 표현하는 데
    사용될 수 있습니다.