[NLP]Bag of Words(BoW)

Date:     Updated:

카테고리:

단어 표현(Word Representation)

1

컴퓨터는 이진화된 값, 즉 0과 1로 구성된 데이터를 이해하지만, 텍스트를 이러한 방식으로 변환하는 것은 자연어 처리(NLP)에서 여러 가지 문제가 있다. 단순히 컴퓨터가 이해하기 위해 만들어진 이진값은 언어적 특성을 전혀 반영하지 않기 때문이다. 자연어 처리의 궁극적인 목표는 컴퓨터가 인간이 만들어낸 고차원적인 언어를 이해하도록 하는 것이다. 이를 위해서는 언어의 특성을 최대한 반영하는 방식으로 자연어를 처리해야 한다.

이 과정에서 중요한 해결책 중 하나가 바로 “단어 표현(Word Representation)”이다. 이는 단어의 언어적 특성을 반영하여 수치화하거나 벡터화하는 방법을 찾는 것을 의미한다. 이러한 표현 방식은 “단어 임베딩(Word Embedding)” 또는 “단어 벡터(Word Vector)”라고도 불린다. 단어 임베딩은 단어를 고차원 벡터 공간에 매핑하여 단어 간의 유사성과 의미적 관계를 유지하면서 컴퓨터가 처리할 수 있는 형태로 변환한다.

예를 들어, 단어 임베딩 기법 중 하나인 Word2Vec은 단어를 벡터로 표현하며, 이 벡터들 간의 유사도를 계산할 수 있도록 한다. 이러한 벡터화 방식은 단어의 의미적 유사성을 유지하면서도 연산이 가능하게 한다. 이를 통해 컴퓨터는 단순히 단어를 기계적으로 처리하는 것이 아니라, 단어 간의 관계와 문맥을 이해할 수 있게 한다.

  • 국소 표현(Local Representation)
    • 원핫 인코딩(One-hot Encoding)
      • Apple = \([0,0,0,0,1,0,0]\)
    • N-gram
    • Bag of Words(BoW)
  • 연속 표현(Continuous Representation)
    • 예측 기반
      • Word2Vec
    • 카운트 기반
      • LSA
      • Glove



BoW의 개념

Bag of Words(BoW)는 단어를 수치화하는 방법 중 하나로, 문서 내 단어의 순서와 의미는 고려하지 않고 오직 출현 빈도(frequency)만 고려하여 단어를 표현하는 방법이다. BoW는 국소 표현방법(Local Representation) 또는 이산 표현방법(Discrete Representation)의 일종으로 카운트 기반의 단어 표현방법(Count-based Word Representation)이다.

BoW는 어떤 단어들이 입력으로 몇 번 등장했는지 파악할 수 있지만, 단어들이 어떤 배열, 어떤 순서로 구성되었는지는 전혀 파악하지 못한다. BoW는 두 가지 절차를 거쳐 생성되게 된다.

  1. 문서(documnet) 내의 단어들의 중복을 제거하고 고유한 인덱스를 부여하여 단어 집합(Vocabulary)을 생성한다.
  2. 단어별 인덱스의 출현 빈도를 저장하여 벡터화한다.



BoW 실습

1. 함수 정의

def bag_of_words(document):
    # 띄어쓰기 기준 토큰화
    doc_tokenized = document.split(' ')
    
    # 단어별 고유의 정수 인덱스를 할당할 단어 집합(Vocabulary)
    vocab = {}
    # 단어별 인덱스에 단어의 출현빈도를 저장할 BoW 벡터
    bow = []
    
    for word in doc_tokenized:
        # 처음 출현한 단어인 경우(=단어 집합에 미존재)
        if word not in vocab.keys():
            # 단어가 등장한 순서를 정수 인덱스로 부여
            vocab[word] = len(vocab)
            # 처음 등장한 단어이므로 BoW에 1 부여
            bow.append(1)
            
        # 출현 이력이 있는 단어의 경우
        else:
            # 해당 단어의 인덱스 찾기
            word_index = vocab.get(word)
            # 등장 횟수 1 증가
            bow[word_index]+=1
            
    return vocab, bow

2. 실행 예제

docs = ["오렌지 먹은지 얼마나 오렌지",
       "바나나 먹으면 나한테 바나나"]
       
for doc in docs:
    vocab, bow = bag_of_words(doc)
    print(f"- 문서: {doc}")
    print(f"- 단어 집합: {vocab}")
    print(f"- BoW 벡터: {bow}")
    print("===================")
- 문서: 오렌지 먹은지 얼마나 오렌지
- 단어 집합: {'오렌지': 0, '먹은지': 1, '얼마나': 2}
- BoW 벡터: [2, 1, 1]
===================
- 문서: 바나나 먹으면 나한테 바나나
- 단어 집합: {'바나나': 0, '먹으면': 1, '나한테': 2}
- BoW 벡터: [2, 1, 1]
===================

Reference

WikiDocs - Bow
[NLP] Bag of Words(BoW) 개념 및 실습

NLP 카테고리 내 다른 글 보러가기

댓글 남기기