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 |
반응형