계속지나가기
코딩스뮤
계속지나가기
전체 방문자
오늘
어제
  • 코딩스뮤:)
    • Algorithm
      • 백준 문제풀이
      • 프로그래머스 문제풀이
      • 알고리즘 이론
      • 자료구조
      • SW Expert Academy
    • 인공지능(AI)
      • LLMs
      • 자연어처리(NLP)
      • 컴퓨터비전(CV)
      • 딥러닝(DL)
      • 머신러닝(ML)
      • 인공지능기초수학
      • 선형대수학
    • 컴퓨터 세팅
    • Computer Science
      • 유닉스프로그래밍
      • 프로그래밍언어론
      • 디자인패턴
      • 클린코드
      • SW 영어
      • 리눅스
      • 논리회로
    • Server
      • Docker

블로그 메뉴

  • 홈
  • Who Am I(CV)
  • 태그

공지사항

인기 글

태그

  • networkflow
  • 선형회귀
  • 언어모델
  • 기계학습
  • ComputerVision
  • 머신러닝
  • 비용함수
  • f1-score
  • LM
  • NLP
  • 비지도학습
  • 지도학습
  • 디지털이미지처리
  • 네트워크플로우
  • ML
  • 군집화
  • 손실함수
  • SIFT
  • MaximumFlow
  • DigitalImageProcessing
  • 알고리즘
  • 경사하강법
  • DIP
  • 패턴인식
  • 결정경계
  • 에지검출
  • 컴퓨터비전
  • 최대유량
  • 파이썬 클린코드
  • machinelearning

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
계속지나가기

코딩스뮤

인공지능(AI)/자연어처리(NLP)

[NLP] 단어 표현 방법 : Bag-of-Word Model(Bow)

2021. 10. 13. 11:27
반응형

Bag-of-Word(BoW) Model


기계학습 알고리즘(MLA)을 자연어 처리 테스크에 사용할 때,  입력값인 텍스트는 그 자체로는 사용할 수 없다. 이산적인(discrete)한 텍스트 즉, 문자열을 연속적인(continuous) 모델이 연산할 수 있도록 숫자로 바꾸어주는 과정이 필요하다.

 

만약 문서 분류 작업(document classification task)을 수행한다고 했을 때, 각 문서는 예측 알고리즘의 input 값에 해당하며 분류 즉, 클래스 레이블이 output값이다. 알고리즘은 input값을 숫자로 이루어진 벡터들로 받으며, 따라서 문서를 고정된 크기의 벡터로 변환하는 작업이 필요하다

 

기계학습을 위해 텍스트로 이루어진 문서들을 백터화하는 간단하고 효과적인 방법은 Bag-of-Words Model(BoW)이다. BoW는 단어들의 순서는 전혀 고려하지 않고, 단어들의 출현 빈도에만 집중하는 텍스트 데이터의 수치화 표현 방법이다.

 

아래와 같이 두 문장이 있을 때 Bow를 만드는 과정은 다음과 같다.

sentence1 = ["This","is","a","first","document"]
sentence2 = ["And","this","is","a","second","document"]

 

1. 문장안의 각 단어에 고유한 정수 인덱스를 부여한다

cnt = [{"This":0},{"is":1},{"a":2},{"first":3},{"document":4},
      {"And":5},{"second":6}]

2.  각 인덱스의 위치에 단어 토큰의 등장 횟수를 기록한 벡터를 만든다

#index : This/is/a/first/document/And/second
s1_Bow = [1,1,1,1,1,0,0]
s2_Bow = [1,1,1,0,,1,1,1]

 

BoW 패키지: CountVectorizer

- ScikitLearn에서 제공하는 클래스로, 단어의 빈도를 Count하여 Vector로 만드는 CountVectorizer 클래스로 영어에 한해서 손쉽게 BoW를 만들 수 있음

 

- 사용예제

from sklearn.feature_extraction.text import CountVectorizer
sentence = ["This is a first document And this is a second document"]
vector = CountVectorizer()
​
# 문장으로부터 각 단어의 빈도수를 기록
print(vector.fit_transform(corpus).toarray())
​
# 각 단어의 인덱스가 어떻게 부여되었는지를 출력
print(vector.vocabulary_)[[2,2,1,2,1,1]]
{"This":0,"is":1,"first":2,"document":2,"And":4,"second":5}

- 사용예제에서 확인할 수 있듯이 기본적으로 길이가 2이상인 문자에 대해서만 토큰으로 인식한다

 

BoW 단점

- 단지 띄어쓰기만을 기준으로 단어를 자르는 낮은 수준의 토큰화를 진행해 BoW를 만듦.

- 단어 단위로 띄어쓰기가 명확한 영어의 경우 BoW가 괜찮은 방식이나 띄어쓰기 개념이 없는 중국어, 일본어에는 적용하기 힘듦

- 또한 띄어쓰기가 단어 단위로 명확하지 않고, 조사 등의 이유로 한국어 역시 적응하기 힘듦

반응형

'인공지능(AI) > 자연어처리(NLP)' 카테고리의 다른 글

[NLP] 워드투벡터(Word2Vec)  (2) 2021.10.13
[NLP] 단어 표현 방법(Word Representation)  (0) 2021.10.13
[논문리뷰] Transformer(Attention is All you Need) 이해하기  (0) 2021.05.07
[NLP 개념] 언어모델(Language Model)  (0) 2021.05.03
01 자연어처리 소개  (0) 2020.12.17
    '인공지능(AI)/자연어처리(NLP)' 카테고리의 다른 글
    • [NLP] 워드투벡터(Word2Vec)
    • [NLP] 단어 표현 방법(Word Representation)
    • [논문리뷰] Transformer(Attention is All you Need) 이해하기
    • [NLP 개념] 언어모델(Language Model)
    계속지나가기
    계속지나가기
    NLP Engineer

    티스토리툴바