Hey Tech

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

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

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

Tony Park (토니) 2022. 3. 23. 00:13
728x90
반응형

📌 Text 빅데이터분석 플랫폼 베타테스트 참가자 모집 중!(네이버페이 4만 원 전원 지급)

 

👋 안녕하세요, 코딩이 필요 없는 AI/빅데이터 분석 All in One 플랫폼 <DATA101> 개발팀입니다.
😊 저희 서비스를 사용해 보시고 경험담을 들려주세요 :)
💸 참여해 주신 "모든" 분들께 네이버페이 4만 원 쿠폰을 지급해 드립니다.

👨‍💻 참여 희망 시 카톡플러스친구 1:1 채팅 or 인스타그램 DM 부탁드립니다 :)

📆 참여기간 : 11/25(월)~11/29(금) 11:00~21:00 중 택1 (1시간 1타임)
👉 참여장소 : 강남역 인근 스터디카페 미팅Room
📍 소요시간 : 총 40분 내외(서비스 체험 및 인터뷰 포함)
✅ 참가조건 : Text 빅데이터 분석 업무 경험자

👉 참가 가능일정 조회하기 : https://url.kr/n8k8gu
- 카톡플친 : http://pf.kakao.com/_SxltHG/chat
- 인스타그램 : https://www.instagram.com/data101.official/


본 포스팅에서는 카운트 기반의 단어 표현 방법인 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' 개념 및 계산방법

👨‍💻 맞춤 서비스

저희 AI/BigData 분석 솔루션 전문 브랜드 <데이터워너원 DATA101>에서는

맞춤형 데이터 수집부터 통계분석, 텍스트마이닝, AI 모델링, 논문작성을 지원해 드립니다 :)

자세한 내용은 아래 링크를 참고해 주세요!

 

https://kmong.com/gig/601647

 

데이터분석, 통계분석, 논문작성 지원해 드립니다. - 크몽

데이터워너원DATA101 전문가의 IT·프로그래밍 서비스를 만나보세요. <p>Python, SPSS, Tableau를 활용해 <strong>...

kmong.com

https://kmong.com/gig/601992

 

텍스트 데이터 분석/텍스트마이닝NLP 도와드립니다. - 크몽

데이터워너원DATA101 전문가의 IT·프로그래밍 서비스를 만나보세요. <p>대기업 AI/빅데이터 연구원 출신으로 구성된 법인 주식회사 유에프5는 Py...

kmong.com

https://kmong.com/gig/582649

 

유튜브 댓글 원하는 만큼 수집해 드립니다/웹 크롤링 - 크몽

데이터워너원DATA101 전문가의 IT·프로그래밍 서비스를 만나보세요. <p><strong style="font-size: 24px;&q...

kmong.com

https://kmong.com/gig/586088

 

모바일 앱 리뷰 크롤링/구글 플레이 스토어 - 크몽

데이터워너원DATA101 전문가의 IT·프로그래밍 서비스를 만나보세요. <p><strong>구글 플레이 스토어 앱 리뷰 1시간 안에 수집해 ...

kmong.com


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

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

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

고맙습니다😊

728x90
반응형