본문 바로가기
Python/Python

파이썬 - collections.Counter

by 키모형 2022. 12. 17.

collections.Counter는 리스트나 문자열과 같은 자료형의 요소 중 값이 같은 요소가 몇 개인지를 확인할 때 사용하는 클래스이다.

문제

다음은 김소월의 시 '산유화'이다. 잠시 여유를 갖고 감상해 보자.

산에는 꽃 피네.
꽃이 피네.
갈 봄 여름없이
꽃이 피네.

산에
산에
피는 꽃은
저만치 혼자서 피어있네.

산에서 우는 새여
꽃이 좋아
산에서
사노라네.

산에는 꽃지네
꽃이 지네.
갈 봄 여름 없이
꽃이 지네.

이 시에서 가장 많이 사용한 단어와 그 개수를 구하려면 어떻게 해야 할까?

풀이

이 문제를 해결하려면 이 시를 단어별로 나누고 딕셔너리를 사용하여 각 개수를 0으로 초기화하고 나서 해당 단어가 반복될 때마다 1씩 증가하여 빈도수를 알아내는 방법을 써야 한다.

하지만, 여기서는 더 쉬운 방법으로 이 문제를 풀어 보자.

[파일명: collections_counter_sample.py]

from collections import Counter
import re

data = """
산에는 꽃 피네.
꽃이 피네.
갈 봄 여름없이
꽃이 피네.

산에
산에
피는 꽃은
저만치 혼자서 피어있네.

산에서 우는 새여
꽃이 좋아
산에서
사노라네.

산에는 꽃지네
꽃이 지네.
갈 봄 여름 없이
꽃이 지네.
"""

words = re.findall(r'\w+', data)
counter = Counter(words)
print(counter.most_common(1))

먼저 문장을 단어별로 나누고자 다음처럼 re 모듈을 사용한다.

words = re.findall(r'\w+', data)

정규표현식 \w+는 단어를 의미하므로 re.findall() 함수를 이용하여 이 시의 모든 단어를 리스트(words)로 반환한다. 그런 다음, 다음처럼 이 words를 이용하여 collections.Counter 클래스의 객체 counter를 생성했다.

counter = Counter(words)

생성된 counter 객체를 print(counter)로 출력하면 다음과 같다.

Counter({'꽃이': 5, '피네': 3, '산에는': 2, '갈': 2, '봄': 2, '산에': 2, '산에서': 2, '지네': 2, '꽃': 1, '여름없이': 1, '피는': 1, '꽃은': 1, '저만치': 1, '혼자서': 1, '피어있네': 1, '우는': 1, '새여': 1, '좋아': 1, '사노라네': 1, '꽃지네': 1, '여름': 1, '없이': 1})

단어 빈도수가 큰 것부터 차례대로 출력한다. 하지만, 문제에서 바라는 것은 빈도수가 가장 많은 1개 단어이므로 Counter 객체의 most_common() 함수를 이용하여 다음과 같이 출력한다.

print(counter.most_common(1))

이 코드를 실행한 결과는 다음과 같다.

[('꽃이', 5)]

most_common() 함수는 빈도수가 많은 것부터 인수로 입력한 개수만큼 튜플로 반환한다. 빈도수가 많은 2개 단어를 보고 싶다면 다음과 같이 출력하면 된다.

print(counter.most_common(2))

출력 결과는 다음과 같을 것이다. 직접 실행하고 확인해 보자.

[('꽃이', 5), ('피네', 3)]
반응형