텍스트 분석 작업을 하다 보면 단어의 개수를 세고, 다양한 알고리즘 처리를 위해 각 단어에 가중치를 부여해야 하는 경우가 자주 발생합니다. 이 글에서는 주어진 문장에서 각 단어의 빈도수를 구하는 방법을 소개합니다. 크게 세 가지 접근 방식이 있으며, 하나씩 살펴보겠습니다.
1. Counter 사용하기
collections 모듈의 Counter() 클래스를 활용하면 손쉽게 단어 빈도를 계산할 수 있습니다. 먼저 split() 메서드로 문장을 단어 단위로 나눈 뒤, most_common() 메서드를 적용하면 빈도순으로 정렬된 결과를 얻을 수 있습니다.
예제
from collections import Counter line_text = "Learn and practice and learn to practice" freq = Counter(line_text.split()).most_common() print(freq)
위 코드를 실행하면 아래와 같은 결과가 출력됩니다.
[('and', 2), ('practice', 2), ('Learn', 1), ('learn', 1), ('to', 1)]2. FreqDist() 사용하기
자연어 처리 도구인 NLTK(Natural Language Toolkit)는 FreqDist 함수를 제공합니다. 이 함수는 문자열에 포함된 전체 단어 수뿐만 아니라 고유한 단어의 개수까지 함께 보여줍니다. 여기에 most_common()을 적용하면 각 단어의 빈도를 확인할 수 있습니다.
예제
from nltk import FreqDist text = "Learn and practice and learn to practice" words = text.split() fdist1 = FreqDist(words) print(fdist1) print(fdist1.most_common())
위 코드를 실행하면 아래와 같은 결과가 출력됩니다.
<FreqDist with 5 samples and 7 outcomes>
[('and', 2), ('practice', 2), ('Learn', 1), ('learn', 1), ('to', 1)]3. 딕셔너리(Dictionary) 사용하기
이 방식에서는 문장의 단어들을 딕셔너리에 저장합니다. 그다음 count() 메서드로 각 단어의 빈도를 구하고, zip() 함수로 단어와 빈도 값을 묶습니다. 최종 결과는 딕셔너리 형태로 출력됩니다.
예제
text = "Learn and practice and learn to practice" words = [] words = text.split() wfreq=[words.count(w) for w in words] print(dict(zip(words,wfreq)))
위 코드를 실행하면 아래와 같은 결과가 출력됩니다.
{'Learn': 1, 'and': 2, 'practice': 2, 'learn': 1, 'to': 1}마무리
세 가지 방법 모두 동일한 결과를 제공하지만 상황에 따라 장단점이 있습니다. Counter는 표준 라이브러리만으로 간결하게 처리할 수 있고, FreqDist는 NLTK 기반의 텍스트 분석 파이프라인에서 유용하며, 딕셔너리 방식은 외부 모듈 없이 순수 Python 문법만으로 구현할 수 있다는 점이 특징입니다. 데이터 규모가 클 경우에는 Counter나 FreqDist처럼 최적화된 도구를 사용하는 것이 성능 면에서 유리합니다.