본문 바로가기
Data Projects/mini 데이터 분석 프로젝트

[데이터 분석 스터디] 02 영어 단어 모음으로 시작하는 텍스트 파일 분석

by 천뿌니 2022. 1. 29.
728x90

엘리스에서 제공하는 파이썬 실전 데이터 분석 강의 중

두 번째 주제인 영어 단어 모음으로 시작하는 텍스트 파일 분석 리뷰 하겠습니다.


1. 주제

  • 두 번째 프로젝트에서는 영어 단어와 그 빈도수를 정리한 British National Corpus 단어 모음을 분석하고 시각화해봅니다.
    • corpus.txt를 이용해 가장 많이 사용된 영어 단어 분석
    • matplotlib을 이용해 단어 별 사용 빈도를 보여주는 막대그래프 작성
    분석 후《이상한 나라의 엘리스》동화책에 등장하는 단어 수와 BNC 데이터를 비교해보겠습니다.
    • 가장 많이 등장하는 단어의 분포
    • 불용어를 제외하고 가장 많이 사용된 단어

 

2. 필자가 해야 하는 것

  1. import_corpus(filename) 함수 구현
  2. create_corpus(filenames) 함수 구현
  3. filter_by_prefix(corpus, prefix) 함수 구현
  4. most_frequent_words(corpus, number) 함수 구현

 

3. import_corpus(filename) 세부 구현 사항

- 목적 :  코퍼스 파일을 읽어 리스트로 변환하는 함수

  • 단어와 빈도수 데이터가 담긴 파일 한 개를 불러온 후, (단어, 빈도수) 꼴의 튜플로 구성된 리스트를 반환합니다.
def import_corpus(filename):
    # 튜플을 저장할 리스트를 생성합니다.
    corpus = []
    
    with open(filename) as file: # 파일 한개 처리
        for line in file:
            split = line.strip().split(',') # 줄바꿈 제거(strip)과 ,를 기준으로 split
            word = split[0] # 단어 저장
            freq = split[1] # 빈도수 저장
            newtuple = (word,int(freq)) # 빈도수는 나중에 최고 빈도수를 찾기 위해서 
            # sort를 하는데 문자열로 되어있으면 sort가 잘 되지 않아서 int형으로 바꿔준다.
            corpus.append(newtuple)
        # 텍스트 파일의 각 줄을 (단어, 빈도수) 꼴로 corpus에 저장한다.
            
    return corpus

- 실행 예시

import_corpus(filename)

- 결과

실행 예시 결과

- filename이라는 파일에서 (단어, 빈도수) 형태의 튜플로 이뤄진 리스트를 반환받는다.

 

 

4. create_corpus(filenames) 세부 구현 사항

- 목적 :  텍스트 파일 여러 개를 한 번에 불러온 후, (단어, 빈도수) 꼴의 튜플로 구성된 리스트를 반환합니다.
즉, 텍스트 파일을 읽어 들여 튜플 꼴의 리스트 형태로 만드는 함수입니다.

def create_corpus(filenames):
    # 단어를 저장할 리스트를 생성한다.
    words = []
    
    # 여러 파일에 등장하는 모든 단어를 모두 words에 저장한다.
    for filename in filenames:
        with open(filename) as file:
            content = file.read()
            # 문장부호를 포함한 모든 특수기호를 제거한다.
            for symbol in punctuation:
                content = content.replace(symbol,"") # 특수기호 삭제
            words = words + content.split() # 특수문자가 지워진 content에 공백을 기준으로 split 하면 단어들이 출력
    
    # words 리스트의 데이터를 corpus 형태로 변환합니다. 카운터 함수 부가 설명 필요
    corpus = Counter(words)
    return list(corpus.items())

- 실행 예시

create_corpus(filenames)

- words 결과

- corpus 결과

- words의 결과를 보면 여러 파일에 들어가 있는 단어들을 모두 존재하는 리스트로 반환된다.

- corpus의 경우 Counter함수를 통해 단어:단어의 빈도수 형태로 딕셔너리로 반환된다.

- Counter 함수

from collections import Counter

Counter('hello world') # Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

 

 

5. filter_by_prefix(corpus, prefix) 세부 구현 사항

- 목적 :  (단어, 빈도수) 꼴의 튜플들을 담고 있는 리스트의 형태로 주어지는 corpus의 데이터 중 특정 문자열 prefix로 시작하는 단어 데이터만 추린 리스트를 반환합니다.

def filter_by_prefix(corpus, prefix):
    return [n for n in corpus if n[0].startswith(prefix)] # 리스트 컴프리헨션을 사용한 연산이다.
    # n[0]는 문자열을 나타내고 startswith 함수를 통해 문자열에 prefix로 시작하는 문자열과 빈도수만 반환하는 함수이다.

- 실행 예시

filter_by_prefix(corpus, "qu")

- 결과(if prefix = "qu")

- 리스트 컴프리헨션과 startswith를 사용하면 쉽게 조건문에 해당하는 항목들을 출력할 수 있다.

 

6. most_frequent_words(corpus, number) 세부 구현 사항

- 목적 :  corpus의 데이터 중 가장 빈도가 높은 number개의 데이터만 추립니다.

def most_frequent_words(corpus, number):
    corpus = sorted(corpus, key = lambda x : x[1], reverse=True) # corpus[1](-> 빈도수)를 기준으로 내림차순 정렬 후 
    # 인덱스 슬라이싱을 이용해 number만큼 반환한다.
    return corpus[:number]

- 실행 예시

most_frequent_words(corpus, 3)

- 결과(if number = 3)

- sorted 함수(lambda의 활용)와 리스트 슬라이싱을 이용하면 가장 높은 빈도순으로 출력할 수 있다.

 

7. 결과

 

 

 

※ 엘리스가 제공한 학습 자료, 콘텐츠의 저작권은 엘리스에 있습니다.
※ COPYRIGHT 2016-2022. ELICE ALL RIGHTS RESERVED.

댓글