TOP
class="layout-aside-left paging-number">
본문 바로가기
데이터분석 만능열쇠 [파이썬]/<파이썬 데이터 분석>

[파이썬] 자연어 처리(NLP) 시작하기 - 5

by 기록자_Recordian 2024. 5. 12.
728x90
반응형
시작에 앞서
해당 내용은 <파이썬으로 데이터 주무르기> -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다.
보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다.

지난 챕터
 

[파이썬] 자연어 처리(NLP) 시작하기 - 4

시작에 앞서해당 내용은 -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다.보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다.지난 챕터 [파이썬] 자연어 처리(NLP) 시작하기

puppy-foot-it.tistory.com


육아휴직 관련 법안 분석

 

KoNLPy가 내장하고 있는 법률 문서 중 하나를 가지고 기초적인 분석을 해보려 한다.

 

먼저 nltk를 import하고 KoNPLy의 내부 문서 중 육아휴직 관련 법안 제 1809890호를 읽어온다.

import nltk
# konlpy.corpus 패키지에서 kobill 모듈을 가져오기
from konlpy.corpus import kobill
# kobill 말뭉치에서 사용할 수 있는 파일 이름 목록을 검색
files_ko = kobill.fileids()
# 파일 이름이 1809890.txt'인 kobill 코퍼스의 특정 문서를 열고 해당 내용을 doc_ko 변수로 지정
doc_ko = kobill.open('1809890.txt').read()

 

doc_ko 라는 변수로 저장된 법안 제 1809890호를 불러오면,

법안 제 1809890호

 

이 문서를 Okt 분석기(구. Twitter)로 명사 분석

from konlpy.tag import Okt; o = Okt()
tokens_ko = o.nouns(doc_ko)
tokens_ko

okt 분석기를 이용한 명사 분석

 

수집된 단어의 횟수 (len(ko.tokens)와 고유한 횟수 (len(set(ko.tokens)) 확인

# NLTK의 Text 클래스를 사용하여 한국어 텍스트를 처리하는 객체 생성
ko = nltk.Text(tokens_ko, name='대한민국 국회 의안 제 1809890호') 
print(len(ko.tokens)) #텍스트 내의 총 토큰 수를 출력
print(len(set(ko.tokens))) #텍스트 내의 고유한 토큰(단어) 수를 출력
ko.vocab() #텍스트 내의 각 토큰(단어)의 빈도를 담은 사전을 반환(각 단어가 나타난 횟수가 키-값 쌍으로 저장)

단어의 횟수 조회

 

빈도 순으로 plot
plt.figure(figsize=(12,6))
ko.plot(50) #텍스트에서 가장 자주 사용하는 상위 50개의 토큰(단어)을 표시
plt.show()

빈도수 높은 단어 기준 plot
법안 특성 상 '육아휴직' 이라는 단어가 가장 많이 등장

불용어(Stopwards) 처리

 

좀 더 정확한 분석을 위해 의미 없는 단어들을 불용어 처리한다. 그러나 한글은 영어와 달리 불용어를 지정하기 쉽지 않기 때문에, case-by-case로 지정

# 변수 ko가 나타내는 단어 목록에서 중지 단어를 제거.
# ko의 각 단어를 반복하여 stop_words 목록에 존재하는지 확인.
# 중지_words 목록에 단어가 없으면 최종 목록 ko에 포함되어 중지 단어를 효과적으로 필터링
stop_words = ['.', '(', ')', ',', "'", '%', '-', 'X', ').',
              'x', '의', '자', '에', '안', '번', '호', '을',
              '이', '다', '만', '로', '가', '를']
ko = [each_word for each_word in ko if each_word not in stop_words]
ko

불용어 처리

다시 plot 작업

ko = nltk.Text(ko, name='대한민국 국회 의안 제 1809890호') #불용어 처리된 변수를 이용한 plot

plt.figure(figsize=(12,6))
ko.plot(50) #텍스트에서 가장 자주 사용하는 상위 50개의 토큰(단어)을 표시
plt.show()

불용어 작업 이후 빈도 순으로 plot
해당 plot을 토대로 stop_words 변수에 의미 없는 단어들 추가

문서 내 단어수 세기

 

count 명령을 사용하여 어떤 단어가 문서 내에서 몇 번 언급되었는지 확인할 수 있다.

ko.count('초등학교') #ko 변수에서 '초등학교' 단어 세기

 

dispersion 명령으로 원하는 단어의 문서 내 위치를 개략적으로 그 분량과 함께 알 수 있다.

※ dispersion_plot() 함수는 텍스트 말뭉치 내에서 특정 단어의 분포를 보여주는 플롯을 생성

plt.figure(figsize=(12,6))
# 텍스트 말뭉치 내에서 특정 단어의 분포를 보여주는 플롯을 생성
ko.dispersion_plot(['육아휴직', '초등학교', '공무원'])

dispersion 으로 분포 보기

특정 단어의 주변부 단어 확인하기 (feat. concordance 명령)
ko.concordance('초등학교')

concordance 명령

 

연어로 사용된 단어 확인하기 (feat. collocation 명령)
ko.collocations()

그런데 하단의 오류가 뜬다.

collocations 에러

검색해보니, 

NLTK에서 "Resource stopwords not found"라는 LookupError를 해결하려면 NLTK Downloader를 사용하여 stopwords 리소스를 다운로드해야 한다고 한다.

<해결 절차 - Chat GPT>

1. Python 환경이나 스크립트를 엽니다.

2. NLTK 라이브러리 가져오기: import nltk

3. 실행하여 stopwords 리소스 다운로드: nltk.download('stopwords')

4. 다운로드가 완료될 때까지 기다립니다.

5. 다운로드가 완료되면 LookupError를 발생시키지 않고 NLTK 기반 코드에서 stopword를 사용할 수 있습니다.

6. 이 프로세스는 NLTK가 중지 단어와 관련된 텍스트 처리 작업에 필요한 리소스에 액세스할 수 있도록 보장합니다.
다운로드 프로세스 중에 사용 권한 오류가 발생하면 환경에 NLTK 데이터 디렉토리에 액세스하고 쓰기에 필요한 권한이 있는지 확인합니다.

 

nltk 는 import를 이미 했기 때문에, stopwords 리소스만 다운로드 한 뒤에 다시 진행하면 될 것으로 보인다.

(많이 성장한 내자신 칭찬해 ^^)

nltk 다운로드
다행히도 성공!

워드 클라우드 적용

 

워드 클라우드 생성을 위한 코드를 입력

# 가장 빈번하게 등장하는 단어 150개를 추출
data = ko.vocab().most_common(150)


#워드클라우드 객체 생성 (폰트 지정)
wordcloud = WordCloud(font_path = "c:/Windows/Fonts/malgun.ttf",
                      relative_scaling = 0.2, #상대적인 크기 조정값 설정
                      background_color='white', #배경은 흰색
                     ).generate_from_frequencies(dict(data)) #data 변수에서 얻은 단어 빈도 기반으로 워드 클라우드 생성

plt.figure(figsize=(12, 8))
plt.imshow(wordcloud) #객체를 이미지로 표시
plt.axis('off') #그래프의 축을 비활성화
plt.show()

육아휴직 법안 워드클라우드


다음글

[파이썬] 자연어 처리(NLP) 시작하기 - 6

728x90
반응형