본문 바로가기
머신러닝/NLP(자연어처리, Natural language processing)

자연어 처리 - 육아휴직관련법안 분석

by 미생22 2024. 5. 28.
728x90

konlpy는 대한민국 법령을 가지고있습니다.

 

그 중에서 우리는 1809890.txt인 육아휴직 관련법안을 가져와 분석해보도록 하겠습니다.

 

import nltk
from konlpy.corpus import kobill #konlpy는 대한민국 법령을 가지고있습니다.

files_ko = kobill.fileids()
doc_ko = kobill.open('1809890.txt').read()

 

doc_ko를 프린트해보면 대충 이렇게 생겼습니다.

 

 

만6세 이하에서 만8세 이하로 연령을 올려 이에 해당하는 어린이가 있다면 육아휴직을 쓸 수 있다는 법안입니다.

명사를 뽑아보겠습니다.

 

from konlpy.tag import Okt
t = Okt()
tokens_ko = t.nouns(doc_ko) #명사를 뽑아보겠습니다.
tokens_ko

 

Okt()를 가져와서 nouns()를 통해 명사를 뽑아봅니다.

 

nltk의 Test()라는 기능을 통해 명사를 분석한 단어집합(tokens_ko)를 nltk.Test()로 잡습니다. 그러면 몇가지 기능을 사용할 수 있습니다.

 

ko = nltk.Text(tokens_ko, name='육아휴직법')
ko

 

name= 으로 문서의 이름을 정해줄 수 있습니다.

이렇게하면 ko를 프린트 했을 때, <Text: 육아휴직법> 이라는 말만 나올 수 있습니다.

 

name을 명시하지 않으면

ko = nltk.Text(tokens_ko)
ko

<Text: 지방공무원법 일부 개정 법률 안 정의화 의원 대표...>라고 해서 전문이 나오게 됩니다 ㅎㅎ

 

ko의 tokens 즉 모든 단어들이 몇개인지 확인해보겠습니다.

 

len(ko.tokens)

735

 

ko.tokens

nltk.Text()로 넣은 아이들이 여기 들어있습니다.

 

 

735개 중에서 중복을 제외하고 유일한 단어들이 몇개인지 파악하기 위해서 set을 썼습니다.

len(set(ko.tokens))

250

 

250개의 단어로 이루어져있네요. 그러면 나온 단어들과 빈도수를 살펴보겠습니다. 

여기서 konlpy의 Okt()로 tokens_ko를 만들었고, 우리는 그 tokens_ko를 nltk(영어도 가능함)을 통해 처리하고 있다는 사실을 기억해야합니다. 맨처음 명사를 꺼낼때만 konlpy를 쓴 것입니다!!

 

 ko는 tokens_ko를 nltk.Text()로 처리한 값입니다.

 

ko.vocab()을 쓰면 단어들과 빈도수를 알 수 있습니다.

ko.vocab()

FreqDist({'육아휴직': 38, '발생': 19, '만': 18, '이하': 18, '비용': 17, '액': 17, '경우': 16, '세': 16, '자녀': 14, '고용': 14, ...})

 

이제 이 빈도수를 그래프로 그려보겠습니다.

plt.figure(figsize=(12,6))
ko.plot(50) #가장많이 발생한 단어 50개만 보여달라는 뜻
plt.show()

 

ko.plot(n)을 하면 가장 자주 발생한 단어 n개를 보여달라는 뜻입니다.

 

여기보니 3위에 '만'이 있네요? 만, 의 이런 단어는 중요하지 않으므로 stop words로 지정해야합니다.

stop_words = [',', '.', '의', '만','안', '자', '에', '번', '호', '을', '이', '다', '로', '가', '를']

 

ko에서 하나씩 가져와서 그 each word가 stop words에 없으면 리스트에 저장하라는 뜻입니다.

 

ko = [each_word for each_word in ko if each_word not in stop_words]
#ko에서 하나씩 가져와서 그 each word가 stop words에 없으면 리스트에 저장하라는 뜻입니다.
ko

 

흠 stopwords.add()는 워드클라우드를 만들때 썼던거고, 여기서는 리스트에 for문과 if문으로 직접 없애주네요...

그리고 나서 다시 그려보면 그래프가 살짝 바뀝니다.

ko가 리스트 형태므로 다시 nltk.Text()에 넣어서 type을 바꿔줍니다.

ko = nltk.Text(ko, name='육아휴직법')

plt.figure(figsize=(12,6))
ko.plot(50) #가장많이 발생한 단어 50개만 보여달라는 뜻
plt.show()

특정 단어의 빈도수를 조사하려면 count()를 씁니다.

 

ko.count('초등학교')

 

dispersion_plot이라고 전체 문서길이에서 어느정도에 이 단어가 나타나는지 그래프로 보여주는 그래프가 있습니다(?)

 

plt.figure(figsize=(12, 6))
ko.dispersion_plot(['육아휴직', '초등학교', '공무원'])
plt.show();

 

이러면 전체 문서길이에서 2:육아휴직, 1:초등학교, 0:공무원 이 어디서 나타나는지 보여줍니다.

concordance라는 함수도 있습니다.

 

ko.concordance('초등학교')

 

이 함수는 초등학교라는 글자의 앞뒤 문맥을 알수 있게 해줍니다. 의미를 파악하기 쉽게 해주죠.

 

collocation이라고 해서 연어라는게 있습니다. 영어에서 왔는데요, 연관 있는 단어, 자주 붙어서 나오는 단어의 조합을 뱉습니다. best friend 같은 경우입니다.

 

ko.collocations()

초등학교 저학년; 근로자 육아휴직; 육아휴직 대상자; 공무원 육아휴직

이런 단어들이 많이 붙어있나봅니다 ㅎㅎㅎ

 

이제 wordcloud 실습을 해보겠습니다.

 

이번에는 ko.vocab().most_common(150)을 data에 담은뒤 wordcloud에서 generate_from_frequencies(dict(data))로 자주 등장하는 단어를 넣어보겠습니다. 저번시간에 워드클라우드는 max_words라는 옵션을 줘서 단어수를 조정했었죠.

 

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)) #자주 등장하는 단어들이 dict(data)에 딕셔너리 형태로 있음

plt.figure(figsize=(12, 8))
plt.imshow(wordcloud)
plt.axis('off')
plt.show()

 

저번엔 margin이라는 업션을 통해 그림과 텍스트 사이의 거리를 조정했다면 이번에는 relative_scaling이라는 옵션을 통해 단어들 사이의 간격을 조정했습니다.

 

 

dict(data)

네, 요런식으로 생겼어요 ㅎㅎ dict형태가 아니라서 dict형태로 바꿔준겁니다.

 

 

728x90