본문 바로가기

Python

Python 네이버 밴드 - 키워드 분석

반응형

안녕하세요. 네이버 밴드에서 추출한 데이터를 통해 키워드 분석을 수행해봤습니다.

 

저도 여러 블로그들을 참조하면서 개발을 수행했습니다. 설명이라기보다 참고하시면 좋을 것 같습니다.

 

 

키워드 분석은 아래와 같은 순서로 로직을 처리했습니다.

 

0. 환경 구축

키워드 분석 라이브러리는 Konlpy, nltk를 사용했고 추가적인 시각화를 위해 wordcloud 라이브러리를 사용했습니다.

 

개발환경 구축은 아래 블로그를 참조하시면 좋을 것 같습니다. 

https://wonhwa.tistory.com/23

 

[python] 자연어처리(NLP)-텍스트 빈도 분석

안녕하세요! 오늘은 konlpy(한국어 형태소 분석기)와 nltk(영어 분석기)를 이용하여 텍스트에 어떤 단어가 많이 나왔는지 알아보도록 하겠습니다. 1. 설치 빈도 분석을 하기 위해서는 konlpy와 nltk를

wonhwa.tistory.com

 

Konlpy, nltk 설치시 JAVA_HOME을 잡아준 후 실행이 되지 않는다면 컴퓨터를 부팅해주세요

 

그리고 wordcloud라이브러리를 설치해줍니다.

 

pip install wordcloud

 

1. 데이터 불러오기

저는 데이터를 불러올때 모든 라인을 처리하지 않았습니다. 연도별, 월별 데이터를 구분하여 저장했습니다. 제가 가지고잇는 CSV를 통해 데이터를 생성했습니다. 아래그림은 연도별 데이터 구조를 나타냈습니다.

연도별 데이터 구조

 

csv데이터는 csv.reader을 이용해서 데이터를 구분해서 데이터를 생성한 것을 확인할 수 있습니다.

####텍스트 읽어오기####
# 딕셔너리 리스트 생성
dictData = defaultdict(list)

with open('./write2022-07-09_014016.csv', newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',')
    for row in spamreader:
        if len(row) > 1 :
            #line.append(row[1])
            if row[1].find("가입했습니다") == -1 and row[1] != "":
                # 전체 데이터 수집
                dictData['ALL'].append([row[1]])

                # 동일 년도별 데이터 구분 ex)2022년 문장 모음
                findIdx = row[0].find("-")
                dictData[row[0][0:findIdx]].append([row[1]])

                # 동일 월별 데이터 구분 ex)2022-07 문장 모음
                findIdx = row[0].find("-", 5)
                dictData[row[0][0:findIdx]].append([row[1]])

print('csv파일 읽기 끝')

 

 

2. 특수문자 제거하기

re라이브러리릉 통해 한글과 영어를 제외한 특수문자를 제거해줍니다. 키워드를 분석하는 것이기 때문에 불필요한 데이터를 제거해줍니다.

###특수문자 제거하기###
compile = re.compile("[^ ㄱ-ㅣ가-힣A-Za-z]+")
for datalist in dictData:
    datamaxIdx = len(dictData[datalist])
    for dataIdx in range(0, datamaxIdx) :
        dictData[datalist][dataIdx][0] = compile.sub("",dictData[datalist][dataIdx][0])
        #line[i] = a

print('특수문자 제거하기 끝')

 

3. 문장분석

최종 분석 키워드를 추출한 dictionary list를 다시 생성 후 처리된 데이터를 가지고옵니다.  okt.nouns를 사용하면 문장의 키워드를 추출해 줍니다. 저는 특정 산업에 대해 분석을 했기때문에 처리가 잘되지 않는 것들이 있었습니다. 필요하신 경우 여기서 예외 처리로 추가해주면 될것 같습니다.

 

###문장분석###
##한국어##
okt = Okt()
final_result = defaultdict(list)
for datalist in dictData:
    datamaxIdx = len(dictData[datalist])
    
    final_result[datalist].append([])
    for dataIdx in range(0, datamaxIdx) :
        result = []

        result = okt.nouns(dataLine)

        for dataResult in result:
            final_result[datalist][0].append(dataResult)
        

print('문장분석 끝')

 

4. 불용어 제거하기

문장 분석을 통해 추출된 키워드에서 사용하지 않을 데이터를 제외하는 처리를 수행합니다. 문장 분석 자체가 모든 키워드를 추출했기 때문에 사용하지 않을 데이터를 없애주는 처리를 수행합니다.

 

###불용어 제거하기###
stopwords = ['이', '있', '하', '것', '들', '그', '되', '수', '이', '보', '않', '없', '나', '사람', '주', '아니', 
             '등', '같', '우리', '때', '년', '가', '한', '지', '대하', '오', '말', '일', '그렇', '위하', '및', '시', '건', '월', '돈', '광고', '투데이', 
             '출처', '제품', '뉴스', '후', '위', '중', '더', '회', '감']
for final_resultTmp in final_result:
    clean_words = [] 
        

    for token in final_result[final_resultTmp][0] :
        if token not in stopwords: #불용어 제거
            clean_words.append(token)

    final_result[final_resultTmp][0] = clean_words


print('불용어 제거하기 끝')

 

5. 텍스트에서 많이 나온 단어 시각화

문장 분석과 불용어를 제거한 데이터를 시각화해줍니다. 저는 두 가지 방식으로 시각화를 수행했고 데이터의 개수를 알기위해 csv로 저장하고 WordCloud를 통해 데이터를 표현해줬습니다.

 

WordCloud는 아래와 같은 그림으로 데이터가 추출됩니다. 아래 그림은 샘플 예시 데이터입니다.(생각보다 데이터만 입력하면 쉽게 멋지게 표현되네요!!!)

 

 

여기서는 판다스 라이브러리를 통해 많이 사용하는 데이터를 추출했습니다. 저는 head는 30개를 추출햇습니다. head는 가장많이사용한 30개를 의미합니다.

korean = pd.Series(final_result[finalResultTmp][0]).value_counts().head(30)

 

아래는 텍스트에서 많이사용한 데이터를 시각화하는 소스코드입니다.

###텍스트에서 많이 나온 단어###

#많이 사용한 단어 csv저장
f = open("Keword_{0}.csv".format(datetime.now().strftime('%Y-%m-%d_%H%M%S')),'w', newline='')
wr = csv.writer(f)



###텍스트에서 많이 나온 단어###
for finalResultTmp in final_result:
    korean = pd.Series(final_result[finalResultTmp][0]).value_counts().head(30)
    
    print("{0} Top 30".format(finalResultTmp))
    print(korean)
    print("\n")

    wr.writerow([finalResultTmp,korean])

    dtKorean = korean.to_frame()


    c = Counter(final_result[finalResultTmp][0])

    wc = WordCloud(font_path='malgun', width=400, height=400, scale=2.0, max_font_size=150, background_color='white')
    gen = wc.generate_from_frequencies(c)
    plt.figure()
    plt.imshow(gen)
    wc.to_file('{0}.png'.format(finalResultTmp))



f.close()

 

 


전체 소스코드

 

import csv

import re
import nltk
import csv
from nltk.corpus import stopwords
from konlpy.tag import Okt

from collections import defaultdict
from collections import Counter
import pandas as pd


from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

from datetime import datetime 
import time
from nltk.corpus import stopwords


####텍스트 읽어오기####
##한국어 텍스트##
# 딕셔너리 리스트 생성
dictData = defaultdict(list)

with open('./write2022-07-09_014016.csv', newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',')
    for row in spamreader:
        if len(row) > 1 :
            #line.append(row[1])
            if row[1].find("가입했습니다") == -1 and row[1] != "":
                # 전체 데이터 수집
                dictData['ALL'].append([row[1]])

                # 동일 년도별 데이터 구분 ex)2022년 문장 모음
                findIdx = row[0].find("-")
                dictData[row[0][0:findIdx]].append([row[1]])

                # 동일 월별 데이터 구분 ex)2022-07 문장 모음
                findIdx = row[0].find("-", 5)
                dictData[row[0][0:findIdx]].append([row[1]])

print('csv파일 읽기 끝')


###특수문자 제거하기###
compile = re.compile("[^ ㄱ-ㅣ가-힣A-Za-z]+")
for datalist in dictData:
    datamaxIdx = len(dictData[datalist])
    for dataIdx in range(0, datamaxIdx) :
        dictData[datalist][dataIdx][0] = compile.sub("",dictData[datalist][dataIdx][0])
        #line[i] = a

print('특수문자 제거하기 끝')


###문장분석###
##한국어##
okt = Okt()
final_result = defaultdict(list)
for datalist in dictData:
    datamaxIdx = len(dictData[datalist])
    
    final_result[datalist].append([])
    for dataIdx in range(0, datamaxIdx) :
        result = []

        dataLine = dictData[datalist][dataIdx][0].lower()

        result = okt.nouns(dataLine)

        for dataResult in result:
            final_result[datalist][0].append(dataResult)
        

print('문장분석 끝')



###불용어 제거하기###
stopwords = ['이', '있', '하', '것', '들', '그', '되', '수', '이', '보', '않', '없', '나', '사람', '주', '아니', 
             '등', '같', '우리', '때', '년', '가', '한', '지', '대하', '오', '말', '일', '그렇', '위하', '및', '시', '건', '월', '돈', '광고', '투데이', 
             '출처', '제품', '뉴스', '후', '위', '중', '더', '회', '감']
for final_resultTmp in final_result:
    clean_words = [] 
        

    for token in final_result[final_resultTmp][0] :
        if token not in stopwords: #불용어 제거
            clean_words.append(token)

    final_result[final_resultTmp][0] = clean_words


print('불용어 제거하기 끝')



###텍스트에서 많이 나온 단어###

#많이 사용한 단어 csv저장
f = open("Keword_{0}.csv".format(datetime.now().strftime('%Y-%m-%d_%H%M%S')),'w', newline='')
wr = csv.writer(f)



###텍스트에서 많이 나온 단어###
for finalResultTmp in final_result:
    korean = pd.Series(final_result[finalResultTmp][0]).value_counts().head(30)
    
    print("{0} Top 30".format(finalResultTmp))
    print(korean)
    print("\n")

    wr.writerow([finalResultTmp,korean])

    dtKorean = korean.to_frame()


    c = Counter(final_result[finalResultTmp][0])

    wc = WordCloud(font_path='malgun', width=400, height=400, scale=2.0, max_font_size=150, background_color='white')
    gen = wc.generate_from_frequencies(c)
    plt.figure()
    plt.imshow(gen)
    wc.to_file('{0}.png'.format(finalResultTmp))



f.close()


print('끝')

 

 


참고

https://wonhwa.tistory.com/23

 

[python] 자연어처리(NLP)-텍스트 빈도 분석

안녕하세요! 오늘은 konlpy(한국어 형태소 분석기)와 nltk(영어 분석기)를 이용하여 텍스트에 어떤 단어가 많이 나왔는지 알아보도록 하겠습니다. 1. 설치 빈도 분석을 하기 위해서는 konlpy와 nltk를

wonhwa.tistory.com

 

반응형