인공지능 AI/머신러닝 Machine Learning

sklearn text.CountVectorizer에서 ngram_range 의미를 파악할 수 있는 예제

Tap to restart 2021. 2. 5. 11:00
반응형

ngram_range란 무엇일까?

ngram_range
tuple (min_n, max_n), default=(1, 1)

The lower and upper boundary of the range of n-values for different word n-grams or char n-grams to be extracted. All values of n such such that min_n <= n <= max_n will be used. For example an ngram_range of (1, 1) means only unigrams, (1, 2) means unigrams and bigrams, and (2, 2) means only bigrams. Only applies if analyzer is not callable.

(출처: sklearn.feature_extraction.text.CountVectorizer)

(1, 1) → min_n <= n <= max_n → 1 <= n <= 1

(1, 2) → min_n <= n <= max_n → 1 <= n <= 2

(2, 2) → min_n <= n <= max_n → 2 <= n <= 2

 

실제로 어떻게 되는지는 테스트를 해봐야 알 수 있다.

(1, 1)

fruit_list = ['사과 딸기', '딸기 바나나', '수박', '수박 수박']

cv = CountVectorizer(min_df=0, ngram_range=(1, 1)) 
fruit_vector = cv.fit_transform(fruit_list)
print(fruit_vector.shape)
print(fruit_vector.toarray())

실행 결과

(4, 4)
[[1 0 1 0]
 [1 1 0 0]
 [0 0 0 1]
 [0 0 0 2]]

4행 4열이다.

아래처럼 행렬이 만들어진 것이다.

  딸기 바나나 사과 수박
사과 딸기 1 0 1 0
딸기 바나나 1 1 0 0
수박 0 0 0 1
수박 수박 0 0 0 2

 

(1, 1)

fruit_list = ['사과 딸기', '딸기 바나나', '수박', '수박 수박', '귤']

cv = CountVectorizer(min_df=0, ngram_range=(1, 1)) 
fruit_vector = cv.fit_transform(fruit_list)
print(fruit_vector.shape)
print(fruit_vector.toarray())

실행 결과

(5, 4)
[[1 0 1 0]
 [1 1 0 0]
 [0 0 0 1]
 [0 0 0 2]
 [0 0 0 0]]

5행 4열이다.

아래처럼 행렬이 만들어진 것이다.

한글자 과일 '귤'은 카운트가 안 되고 열에도 빠져 있다. 왜 그런지는 알 수 없다.

 

  딸기 바나나 사과 수박
사과 딸기 1 0 1 0
딸기 바나나 1 1 0 0
수박 0 0 0 1
수박 수박 0 0 0 2
0 0 0 0

 

위 결과를 통해 확인할 수 있는 것은 한글자 단어가 꽤 많은 한국어의 경우, 한글자 단어들이 누락될 수 있는 위험성이 있다는 것이다.

 

(1, 2)

fruit_list = ['사과 딸기', '딸기 바나나', '수박', '수박 수박']

cv = CountVectorizer(min_df=0, ngram_range=(1, 2)) 
fruit_vector = cv.fit_transform(fruit_list)
print(fruit_vector.shape)
print(fruit_vector.toarray())

실행 결과

(4, 7)
[[1 0 0 1 1 0 0]
 [1 1 1 0 0 0 0]
 [0 0 0 0 0 1 0]
 [0 0 0 0 0 2 1]]

이 행렬의 의미는 무엇일까?

행은 입력값이다. 열은 ngram한 값들로 볼 수 있다.

  딸기 딸기 바나나 바나나 사과 사과 딸기 수박 수박 수박
사과 딸기 1 0 0 1 1 0 0
딸기 바나나 1 1 1 0 0 0 0
수박 0 0 0 0 0 1 0
수박 수박 0 0 0 0 0 2 1

ㄱㄴㄷ순으로 열의 값이 생성되고, 1~2개로 값이 생성된다.

입력값이 '사과 딸기' 이므로, 굳이 리스트에 '딸기 사과'가 없다면 자동으로 만들지는 않는 것을 유추할 수 있다.

 

(2, 2)

fruit_list = ['사과 딸기', '딸기 바나나', '수박', '수박 수박']

cv = CountVectorizer(min_df=0, ngram_range=(2, 2)) 
fruit_vector = cv.fit_transform(fruit_list)
print(fruit_vector.shape)
print(fruit_vector.toarray())

실행 결과

(4, 3)
[[0 1 0]
 [1 0 0]
 [0 0 0]
 [0 0 1]]
  딸기 바나나 사과 딸기 수박 수박
사과 딸기 0 1 0
딸기 바나나 1 0 0
수박 0 0 0
수박 수박 0 0 1

 

반응형