이번에 살펴볼 내용은 가장 많은 예제로 등장하는 것들 중 하나인 Word Count(단어 세기)에 관한 것입니다. 이 예제를 통해 정말 Powerful한 Python의 기능들을 확인하실 수 있을거고, 이 예제 하나로 제 예제들 중 처음으로 등장하는 Dictionary(Hash map이라고도 합니다.)구조에 대해서도 익숙해지실 수 있을겁니다 :)
먼저 우리가 사용할 텍스트는 햄릿(Hamlet)이라는 셰익스피어 원작 소설입니다. 일단 python에서 어떻게 txt파일을 읽어들이는지 확인해 보죠.
f = open('hamlet.txt', 'r')
파이썬에서는 open(파일경로, 읽기/쓰기 모드)
이라는 형태로 파일을 읽어오게 됩니다. 위에서는 hamlet.txt라는 파일을 읽기모드(‘r’)로 f
라는 변수에 불러온다는 얘기입니다.
다음으로 살펴볼 것은 데이터 구조인 Dictionary가 count하기에 용이하게 변경된 Counter라는 자료구조에 대해 살펴보겠습니다.
from collections import Counter
wordDict = Counter()
Counter라는 데이터 구조를 사용하기 위해서는 반드시 import를 해줘야 하는데, collections라는 범주 내에 있는 것이기 때문에 저런 식으로 포함시키는 것입니다.
wordDict = Counter()
를 통해서 비어있는 Counter를 wordDict라는 변수에 할당합니다.
sentences = f.readlines()
파일의 내용을 읽어오는 함수들도 다양한데요, 일단은 readlines()
라는 함수를 살펴보겠습니다. 이 함수는 한줄 한줄을 string의 형태로 list로 저장해서 넘겨주는 함수입니다. 궁금하시면 직접 출력해 보시면 될 것 같습니다. 우리가 원하는 것은 단어들이지 문장이 아니기 때문에 아래와 같은 작업을 통해 Counter에 담아줍니다.
for sentence in sentences: #한 문장씩
for word in sentence.split(): #한 문장에 들어있는 한 단어씩
wordDict[word] += 1 #Counter에 count를 1씩 증가시킨다.
여기서 살펴볼 함수는 string.split()
이라는 함수인데요, string형태의 데이터 구조에 기본적으로 내장된 함수입니다. 이를 통해 whitespaces(공백, 줄바꿈 등)를 모두 제거하고 그들에 의해 나눠진 단어들만 list형태로 리턴해주게 됩니다. .split()
함수는 굉장히 다양하게 활용될 수 있으므로 필히 숙지하시기 바랍니다 :) 꼭 whitespaces가 아니더라도 탭이나 괄호, 특정 문자들을 기준으로 쪼갤수도 있으니 궁금하시면 다양하게 시험해 보세요 :)
위의 간단한 코드들로 이미 우리는 각 단어마다 몇번씩 등장했는지의 데이터를 Counter의 구조로 가지고 있습니다. 이제 결과를 확인해 봐야겠죠? 가장 많이 등장하는 10개의 단어들만 살펴보겠습니다.
for word, freq in wordDict.most_common(10):
print word, freq
Counter구조에 내장된 most_common(개수)
이라는 함수를 이용하여 단어와 출현 횟수를 프린트합니다.
the 929
and 680
of 625
to 608
I 523
a 453
my 444
in 382
you 361
Ham. 358
‘the’가 929번으로 가장 많이 나왔네요. 굉장히 손쉽죠?? 앞으로는 이 기법들을 조금 더 발전시켜서 더 다양하고 재밌는 예제들을 다뤄보겠습니다 ^^