Advertisement
  1. Code
  2. Python

파이썬을 이용해 파일에서 단어 빈도 계산하기

Scroll to top
Read Time: 3 min

() translation by (you can also view the original English article)

어떤 문서의 초점이 어디에 있는지 신속하게 파악하는 방법이 궁금했던 적은 없나요? 문서의 주요 주제는 무엇일까요? 제가 다음과 같은 간단한 요령을 한 가지 알려드리겠습니다. 문서에 언급된 단어들을 나열한 다음 각 단어가 언급된 횟수(빈도)를 확인합니다. 이런 식으로 문서의 주요 내용을 알 수 있습니다. 하지만 이를 수작업으로 하기에는 효과적으로 않으므로 자동화된 프로세스가 필요할 것입니다.

그렇습니다. 자동화된 프로세스를 이용하면 이를 훨씬 쉽게 처리할 수 있습니다. 여기서는 파이썬을 이용해 텍스트 파일에서 각 고유 단어를 나열하고 각 단어의 빈도를 확인하는 방법을 알아보겠습니다.

테스트 파일

이 튜토리얼에서는 test.txt를 테스트 파일로 사용하겠습니다. 이 파일을 다운로드하되 열지는 마십시오! 여기서는 자그마한 게임을 하나 해봅시다. 이 테스트 파일에는 Envato Tuts+의 튜토리얼 중 하나가 담겨 있습니다. 단어의 빈도를 토대로 이 텍스트가 추출된 튜토리얼을 맞춰봅시다.

그럼 게임을 시작하겠습니다!

정규 표현식

이번 게임에서는 패턴을 적용할 것이므로 정규 표현식(regex)을 사용해야 합니다. "정규 표현식"이란 용어를 처음 접한다면 다음과 같은 위키피디아의 멋진 정의를 읽어봅시다.

주로 문자열과의 패턴 매칭 또는 문자열 매칭(즉, "찾기 및 바꾸기" 같은 연산)에 사용되는 검색 패턴을 정의한 문자 시퀀스 이 개념은 1950년대 미국의 수학자인 스티븐 클레이니(Stephen Kleene)가 정규 언어에 대한 설명을 공식화하면서 만들어졌고 자주 사용되는 유닉스 텍스트 처리 유틸리티인 ed, 에디터, grep, 필터에 도입됐다.

이 튜토리얼을 계속 진행하기에 앞서 정규 표현식에 대해 더 알고 싶다면 다른 튜토리얼인 파이썬의 정규 표현식을 보고 되돌아와 이 튜토리얼을 계속 진행하자.

프로그램 구축

이 게임을 만드는 과정을 단계별로 진행해 보겠습니다. 가장 먼저 해야 할 일은 텍스트 파일을 문자열 변수에 저장하는 것입니다.

1
document_text = open('test.txt', 'r')
2
text_string = document_text.read()

이제 정규 표현식을 손쉽게 적용할 수 있도록 다음과 같이 lower() 함수를 사용해 문서 내의 모든 문자를 소문자로 바꿉니다.

1
text_string = document_text.read().lower()

글자의 수가 [3-15] 범위에 해당하는 모든 단어를 반환하는 정규 표현식을 작성해 보겠습니다. 3에서 시작하면 if, of, in 등의 빈도 계산과 관련이 없는 단어를 걸러내는 데 도움이 되며, 15보다 긴 단어는 올바른 단어가 아닐 수도 있습니다. 이러한 패턴의 정규 표현식은 다음과 같습니다.

1
\b[a-z]{3,15}\b

\b단어 경계와 관련이 있습니다. 단어 경계에 대한 자세한 내용은 이 튜토리얼을 참고합니다.

위의 정규 표현식은 다음과 같이 작성할 수 있습니다.

1
match_pattern = re.search(r'\b[a-z]{3,15}\b', text_string)

여기서는 문서에서 여러 단어를 살펴보고 싶기 때문에 findall 함수를 사용하면 됩니다.

stringpattern에 해당하는 중첩되지 않는 모든 매칭 항목을 문자열 리스트로 반환합니다. string은 왼쪽에서 오른쪽으로 스캔되고 매칭 항목은 발견된 순서대로 반환됩니다. 하나 이상의 그룹이 패턴에 존재하면 그룹 리스트를 반환합니다. 패턴에 두 개 이상의 그룹이 있는 경우 튜플 리스트가 됩니다. 빈 매칭 항목은 그것이 다른 매칭이 시작되는 부분을 건드리지 않는 경우 결과에 포함됩니다.

이제 문서에서 각 단어의 빈도를 찾아보겠습니다. 여기서는 키-값(key-value) 쌍이 필요하므로 여기서 사용하기에 적합한 개념은 파이썬 딕셔너리입니다(여기서 key단어이고 value는 단어가 문서에 나타난 빈도를 나타냅니다.

빈 딕셔너리인 frequency = {}을 선언했다고 가정하면 위의 단락을 코드로 나타내면 다음과 같을 것입니다.

1
for word in match_pattern:
2
    count = frequency.get(word,0)
3
    frequency[word] = count + 1

이제 다음과 같은 방법으로 키를 볼 수 있습니다.

1
frequency_list = frequency.keys()

마지막으로 단어와 빈도(텍스트 파일에서 나타난 횟수)를 구하기 위해 다음과 같이 할 수 있습니다.

1
for words in frequency_list:
2
    print words, frequency[words]

다음 절에서는 전체 프로그램을 살펴보고 어떤 결과가 나오는지 확인해 보겠습니다.

모두 한데 모으기

지금까지 프로그램을 단계별로 설명했으므로 이제 전체 프로그램이 어떻게 구성돼 있는지 살펴보겠습니다.

1
import re
2
import string
3
frequency = {}
4
document_text = open('test.txt', 'r')
5
text_string = document_text.read().lower()
6
match_pattern = re.findall(r'\b[a-z]{3,15}\b', text_string)
7
8
for word in match_pattern:
9
    count = frequency.get(word,0)
10
    frequency[word] = count + 1
11
    
12
frequency_list = frequency.keys()
13
14
for words in frequency_list:
15
    print words, frequency[words]

프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

Mac OS X terminalMac OS X terminalMac OS X terminal

게임으로 되돌아 갑시다. 단어 빈도를 살펴봤을 때 테스트 파일(제가 쓴 다른 파이썬 튜토리얼의 내용이 포함된)의 주제가 무엇이라고 생각하시나요?

(힌트: 빈도가 가장 높은 단어를 확인해 보세요).

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.