티스토리 뷰

요새 네이버 edwith의 파이썬 강의를 듣고 있다. 미시간 대학의 찰스 세브란스 교수님이 무료로 제공하고 있는 MOOC 강좌인데 edwith에서 한글 번역을 추가해서 진도율 100% 수강하고 퀴즈를 만점 받으면 수료증도 주는 형태로 제공하고 있다.

 

모두를 위한 프로그래밍 : 파이썬 바로가기

 

지금은 두번째 강좌인 자료구조를 공부중인데 string을 추출하고 복작복작해서 데이터 분석에 필요한 기본을 배우는 과정이다. 예제를 복습하다가 문득 "가사에 가장 많이 나오는 단어를 알아내는 코드를 짜보자" 싶어서 만들어 보았다.

 

영어가 분석하기 편해서 마이클 잭슨의 빌리진 가사를 이용했다.


전체 코드

fhand = open('lyrics.txt')
lyrics = ''

for line in fhand:
    if line == '' :
        continue
    line = line.replace('(', '').replace(')', '')
    lyrics = lyrics + line
    
lyrics = lyrics.split() 

counts = dict()
for word in lyrics:
   counts[word] = counts.get(word,0) + 1

counts_val_reverse = sorted(counts.items(), 
    reverse=True, 
    key=lambda item: item[1])

for key, value in counts_val_reverse:
    print(key, ":", value)

 

결과 : 가장 많이 쓰인 단어 상위 10위

the : 34
my : 23
is : 19
not : 18
I : 13
She : 12
am : 12
Billie : 12
Jean : 11
lover : 10

'the'가 1위를 차지했다. 제목인 'Billie Jean'이 의외로 8, 9위에 머물렀다. 다른 가사인가 책을 분석했다는 뉴스를 본 기억이 있는데 그때도 the가 압도적으로 많더라. 이건 다른 가사를 분석해봐도 비슷하지 않을까 싶다.


 

코드 자세히 보기

전체코드를 부분별로 나누면 아래처럼 3단계로 분류된다.

 

1. 가사 가져와서 단어별로 자르기

fhand = open('lyrics.txt')
lyrics = ''

for line in fhand:
    if line == '' :
        continue
    line = line.replace('(', '').replace(')', '')
    lyrics = lyrics + line

lyrics = lyrics.split()

txt 파일이 담긴 가사를 불러온다.

구글에 있는 빌리진 가사에는 코러스가 괄호 ( )에 들어가 있어서 replace로 괄호를 모두 제거했다. 공백으로 출력되는 빈 문장은 if line == '': continue로 처리해서 포함시키지 않았다. 단어를 낱개로 자를 때는 split을 사용한다. split을 사용하면 단어가 List에 담겨서 반환된다.

# Result example
# Original Phrase => She was more like a beauty queen from a movie scene
['She', 'was', 'more', 'like', 'a', 'beauty', 'queen', 'from', 'a', 'movie', 'scene']

 

 

 

2. 단어별 등장 빈도수 세기

counts = dict()
for word in lyrics:
   counts[word] = counts.get(word,0) + 1

딕셔너리를 생성하고 이 안에 빈도수를 센 데이터를 담는다. get 함수를 쓰면 단어별로 key를 생성하고 빈도수를 카운팅해서 value에 반환한다.

# Result example
{'She': 12, 'was': 3, 'more': 1, 'like': 2, 'a': 8, 'beauty': 1}

 

 

 

3. 가장 많이 나온 순서대로 정렬하기 (내림차순 정렬)

counts_val_reverse = sorted(counts.items(), 
    reverse=True, 
    key=lambda item: item[1])

for key, value in counts_val_reverse:
    print(key, ":", value)

이건 강의에서 아직 안 배운 내용이라 구글링의 도움을 받았다. sorted로 소팅한 다음 내림차순으로 재정렬한다.

 

 

문서마다 양식이 다르니 1번 코드처럼 괄호나 문장부호를 잘 필터링하면 다른 문서도 분석이 가능할 것 같다.

댓글
최근에 올라온 글
최근에 달린 댓글