[NLP 5] 단어 빈도수 분석 및 시각화 (collections & wordcloud)

방선생·2025년 1월 11일
0

단어 빈도수 분석

  • 한글 텍스트 데이터 → 한글 형태소 분석기 → 형태소 단위로 토큰화 → 명사(Noun) 추출
  • python collections 패키지 → Counter() 이용 → 빈도수 분석
  • 빈도수 분석 결과 → wordcloud 라이브러리를 이용하여 시각화

python collections 패키지 Counter() 함수

기능 : 문자열, 리스트, 튜플 등 여러 성분 원소를 저장하고 있는 자료형에서 각 성분 원소의 빈도수를 계산해주는 함수

  • 딕셔너리 형태지만 counter의 고유의 자료형 > 활용, 변수 등 모두 동일 하지만 다른 자료형이다
  • collections.Counter()함수 실행의 결과 > 자료형 : Counter > python dict의 성질을 포함
  • len을 변수로 쓰면 len함수가 변수와 충돌해 오류가 남

ex)
#필요한 함수 임폴트
from collections import Counter
#함수 실행의 결과
Counter(["hi", "hey", "hi", "hi", "hello", "hey"])
Counter({'hi': 3, 'hey': 2, 'hello': 1})


이 글의 코드에서 이어서 작성됩니다

text data 불러오기 (대한민국헌법 데이터)

# text data 불러오기
## 파일 경로 설정
file_path = '/content/drive/MyDrive/NLP/constitution.txt'

with open(file_path, 'r') as f: # 파이썬으로 파일 읽어 오기
  text = f.read()

print(text)


#################################################################

# from collections import Counter
import collections

cnt = collections.Counter(text)

print(cnt)
  • 코랩 == 컴퓨터, 드라이브 == 저장장치(외장하드 디스크)
  • Python으로 파일 읽기 : with open(file_path, 'r') as f: text = f.read()
    • 파일을 읽기전용(’r’)으로 오픈하고 f에 저장한다(as f) > f에저장된 파일을 읽어서 text에 문자열로 저장한다.

mecab 형태소 분석기를 통한 빈도수 분석 Code

# mecab 형태소 분석기 > 형태소 분석 > 체언(명사) 추출 > nouns(text) 함수 활용
import mecab #라이브러리 임폴트
mc = mecab.MeCab()

nounss = mc.nouns(text) #체언(명사) 추출

print(f"{nounss}\n{len(nounss)}\n\n{'-'*80}\n")

####################################################################

# 길이가 1보다 큰 체언만 추출
nouns_mecab = []

for n in nounss:
  if len(n) > 1:
    nouns_mecab.append(n)

print(f"{nouns_mecab}\n{len(nouns_mecab)}")


#길이가 1보다 큰 체언의 빈도수 분석
cnt_mecab = collections.Counter(nouns_mecab) #빈도수 분석

print(f"{cnt_mecab}\n{len(cnt_mecab)}")

cntt = cnt_mecab['대통령']
print(cntt)

kiwi 형태소 분석기를 통한 빈도수 분석 Code

# kiwi 형태소 분석기 > 불용어 제거 + 형태소 분석

import kiwipiepy #라이브러리 임폴트

kw2 = kiwipiepy.Kiwi(typos='basic_with_continual') #오타 교정
stop_words2 = kiwipiepy.utils.Stopwords()

morphss = kw.tokenize(text, normalize_coda=True, stopwords=stop_words2) #불용어 제거
print(f"{morphss}\n{len(morphss)}\n\n{'-'*80}\n")

#####################################################################

morhp_kiwi = []

for morph, pos, _, n in morphss: #길이가 1보다 큰 체언(명사) 추출
  if pos.startswith('N') and n > 1:
    morhp_kiwi.append(morph)

print(f"{morhp_kiwi}\n{len(morhp_kiwi)}\n\n{'-'*80}\n")

cnt_kiwi = collections.Counter(morhp_kiwi) #빈도수 분석
print(f"{cnt_kiwi}\n{len(cnt_kiwi)}")

kiwi 분석기와 mecab 분석기 비교 Code

# kiwi분석기와 mecab분석기 비교
print(f"{cnt_kiwi}\n{len(cnt_kiwi)}")

print('-'*80)

print(f"{cnt_mecab}\n{len(cnt_mecab)}")


wordcloud 라이브러리

  • 텍스트에 등장하는 단어들의 빈도수를 기반으로 텍스트 데이터의 주요 단어들을 시각적으로 표현하는데 사용되는 라이브러리

  • 사용 방법
    1) 필요한 라이브러리 / 함수 임폴트
    2) 한글 폰트 설정
    3) WordClod 클래스 함수 객체 생성
    4) wordcloud 이미지 생성
    5) 이미지 저장
    6) 이미지 출력

wordcloud Code 1 (한글 폰트 설치)

!pip install wordcloud #라이브러리 설치

import wordcloud #라이브러리 임폴트

# colab 환경 > 한글 폰트(나눔 글꼴) 설치
!apt-get update -qq
!apt-get install fonts-nanum* -qq
  • 폰트 지정 (font_path) - 코랩기준(usr > share > fonts)

wordcloud Code 2 (객체 생성)

fonts_path = '/usr/share/fonts/truetype/nanum/NanumBarunGothic-YetHangul.ttf'

#함수 호출, 객체 생성
wc = wordcloud.WordCloud(
    font_path=fonts_path,
    width = 1000,
    height = 500,
    max_words = 50,
    background_color = 'white',
    max_font_size = 200,
    random_state = 0
    )
  • width(가로), height(세로) - 픽셀, 화질
  • min_font_size - 빈도 수가 가장 많은 글자의 크기
  • max_words - 화면의 표현되는 글자 종류의 최대 개수
  • background_color - 바탕 색
  • min_font_size - 빈도 수가 가장 많은 글자의 크기
  • random_state - none > 글자의 위치가 계속 바뀜

wordcloud Code 3 (mecab의 빈도수 시각화)

# mecab의 빈도수 시각화
wc.generate_from_frequencies(cnt_mecab) #이미지 생성

file_path2 = '/content/drive/MyDrive/NLP/헌법_mecab.png'
wc.to_file(file_path2)
  • generate_from_frequencies(frequencies[단어, 빈도수,,,,])
    • 빈도수 이미지 생성
  • to_file(경로)
    • 생성된 이미지 저장

wordcloud Code 4 (kiwi의 빈도수 시각화)

# kiwi의 빈도수 시각화
wc.generate_from_frequencies(cnt_kiwi) #이미지 생성

file_path2 = '/content/drive/MyDrive/NLP/헌법_kiwi.png'
wc.to_file(file_path2)








참고자료

pypi wordcloud

wordcloud documentation (v1.8.1)

profile
AI & Robotics

0개의 댓글