Recent Posts
Recent Comments
Archives
반응형
250x250
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Today
Yesterday

Total
05-02 06:06
관리 메뉴

Hey Tech

[NLP] Bag of Words(BoW) 개념 및 실습 본문

AI & 빅데이터/자연어처리(NLP)

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

Tony Park 2022. 3. 23. 00:13
728x90
반응형

본 포스팅에서는 카운트 기반의 단어 표현 방법인 Bag of Words(BoW) 개념과 생성 방법을 알아봅니다.

📚 목차

1.  BoW 개념
2.  BoW 특징
3.  BoW 생성 절차
4.  BoW 생성 실습

1.  BoW 개념

그림 1. 단어 표현방법 분류

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

2.  BoW 특징

BoW는 어떤 단어들이 몇 회 나왔는지는 파악할 수 있지만, 단어들이 어떤 순서로 구성되었는지는 파악할 수 없다는 특징이 있습니다. Bag of Words는 말 그대로 '단어들의 가방'입니다. 단어를 하나의 공(ball)이라고 생각하고, 문서 내 모든 단어들을 가방에 넣고 흔들어 섞는 과정을 상상해 보세요. 가방에서 단어를 하나씩 꺼내 나열하여 문장을 만들어 보면 문장의 의미를 파악하기 어렵겠죠. 단어의 순서가 뒤죽박죽 되었으니 말이죠.

3.  BoW 생성 절차

BoW는 2가지 절차로 생성됩니다.

 

(1) 문서 내 단어별로 고유의 정수 인덱스를 할당하여 단어 집합(Vocabulary) 생성

(2) 단어별 인덱스에 단어의 출현 빈도를 저장한 BoW 벡터 생성

4.  BoW 생성 실습

파이썬을 활용하여 단어 집합과 BoW 벡터를 생성해 봅니다. 

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

위 함수는 문서 데이터가 주어졌을 때, 단어 집합과 BoW 벡터를 생성하여 리턴합니다. BoW 벡터 생성 실습을 위한 자료이므로 복잡한 전처리 과정은 생략했습니다. 토큰화 역시 단순히 띄어쓰기를 기준으로 진행하였습니다.

docs = ["오렌지 먹은지 얼마나 오렌지",
       "바나나 먹으면 나한테 바나나",
       ]

위와 같이 문서 데이터 2개를 활용하여 문서별로 생성된 단어 집합과 BoW을 확인해 봅니다.

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]
===================

위와 같이 단어 집합에는 단어마다 고유의 정수 인덱스가 부여된 것을 확인하실 수 있습니다. BoW 벡터는 단어 집합 내 단어 인덱스에 해당하는 단어별로 문서에서 출현한 횟수를 잘 저장한 것을 확인하실 수 있습니다.

📚 참고할 만한 포스팅

1.  [NLP] Bag of Words(BoW) 개념 및 실습
2.  [NLP] 문서 단어 행렬(DTM) 개념 이해
3.  [NLP] TF-IDF 개념 및 계산 방법
4.  [NLP] Word Embedding의 이해: (1) 희소표현 및 밀집표현
5.  [NLP] 언어모델(Language Model)의 개념 및 특징
6.  [NLP] N-gram 언어 모델의 개념, 종류, 한계점
7.  [NLP] 언어모델의 평가지표 'Perplexity' 개념 및 계산방법

오늘은 카운트 기반의 단어 표현방법 중 하나인 BOW의 개념과 생성 방법에 대해 알아봤습니다.

포스팅 내용에 오류가 있거나 보완할 점이 있다면 아래에 👇👇👇 댓글 남겨주시면 감사드리겠습니다 :)

그럼 오늘도 즐겁고 건강한 하루 보내시길 바랍니다.

고맙습니다😊

728x90
반응형
Comments