빅데이터/빅데이터 with python

[빅데이터 python] 웹 검색 엔진 만들기 - 6. 수집 결과를 워드 클라우드로 나타내기

언제나휴일 2020. 11. 18. 10:32
반응형

안녕하세요. 언제나휴일입니다.

앞에서 웹 수집 로봇 및 형태소 분석, 역파일 생성에 관하여 구현하였습니다.

[빅데이터 python] 웹 검색 엔진 만들기 - 1. 웹 검색 엔진 소개

[빅데이터 python] 웹 검색 엔진 만들기 - 2. 형태소 및 Inverse 테이블 정의

[빅데이터 python] 웹 검색 엔진 만들기 - 3. MorphemeSql 클래스 정의

[빅데이터 python] 웹 검색 엔진 만들기 - 4. InverseSql 클래스 정의

[빅데이터 python] 웹 검색 엔진 만들기 - 5. 수집한 웹 페이지 형태소 분석 및 역파일 생성하기

 

이번에는 수집 로봇에 의해 얻어온 결과를 워드 클라우드로 표시하고 테이블로 나타내기로 할게요.

새로운 프로젝트를 생성하고 아에서 작성한(1~4) 파일들은 프로젝트에 포함하세요.

(5에서 작성한 파일은 포함하지 않습니다.)

실행 결과

1. 대화상자 만들기

먼저 대화상자를 만들기로 할게요.

1.1 사용할 라이브러리

대화상자는  QT 라이브러리와 WordCloud라이브러리를 사용하여 만들거예요.

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt
from wordcloud import WordCloud

1.2 위젯 배치

타이틀을 "형태소 분석 구름"으로 설정하고 크기를 1400, 800으로 설정할게요.

class MyDlg(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("형태소 분석 구름")        
        self.resize(1400,800)

워드 클라우드는 이미지로 저장한 후에 화면에 표시할게요. 이를 위해 레이블 위젯을 배치합니다.

        self.lb_img = QLabel(self)
        self.lb_img.move(0,0)
        self.lb_img.resize(800,800)     

형태소와 개수를 나타낼 테이블을 배치합니다.

        self.tb_mo = QTableWidget(self)
        self.tb_mo.move(800,0)
        self.tb_mo.resize(600,800)
        self.tb_mo.setColumnCount(2)
        self.tb_mo.setColumnWidth(0,400) 
        self.tb_mo.setColumnWidth(1,120)         
        self.tb_mo.setHorizontalHeaderLabels(["형태소","개수"]) 

1.3 SetDictionary - 워드 클라우드 및 테이블 설정

입력 인자로 words(딕셔너리 개체)를 받습니다.

    def SetDictionary(self,words):

워드 클라우드를 생성합니다.

이미 형태소와 참조 개수를 분석한 상태라 generate_from_frequencies 메서드를 호출합니다.

워드 클라우드를 이미지로 저장할게요.

        wc = WordCloud(width=800, height=800,font_path = 'C:/Windows/Fonts/malgun.ttf')
        wc.generate_from_frequencies(words)
        wc.to_file("data.png")

QPixmap 개체를 생성하여 이미지를 로딩합니다.

QPixmap 개체를 이미지를 출력하기 위해 배치한 레이블(lb_img)에 설정합니다.

        pixmap = QPixmap()
        pixmap.load("data.png")
        #해상도를 바꾸고자 한다면 다음처럼 작성할 수 있습니다.
        #pm2 = pixmap.scaled(self.lb_img.width(),self.lb_img.height(),Qt.IgnoreAspectRatio);        
        self.lb_img.setPixmap(pixmap)    

테이블에 사전 개체의 내용을 표시하기 전에 정렬을 시키기로 할게요.

정렬 후에 반환한 결과는 (키,값) 형태의 데이터를 보관한 리스트입니다.

        self.tb_mo.setRowCount(len(words))        
        wlist = sorted(words.items(), key = lambda item: item[1], reverse=True)

워드 리스트에 있는 각 항목을 테이블에 표시합니다.

        ri = 0
        for word,cnt in (wlist):
            self.tb_mo.setCellWidget(ri,0,QLabel(word)) 
            self.tb_mo.setCellWidget(ri,1,QLabel(str(cnt)))
            ri = ri + 1

1.4 MyDlg.py 소스 코드

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt
from wordcloud import WordCloud

class MyDlg(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("형태소 분석 구름")        
        self.resize(1400,800)
        self.lb_img = QLabel(self)
        self.lb_img.move(0,0)
        self.lb_img.resize(800,800)     
        self.tb_mo = QTableWidget(self)
        self.tb_mo.move(800,0)
        self.tb_mo.resize(600,800)
        self.tb_mo.setColumnCount(2)
        self.tb_mo.setColumnWidth(0,400) 
        self.tb_mo.setColumnWidth(1,120)         
        self.tb_mo.setHorizontalHeaderLabels(["형태소","개수"]) 
    def SetDictionary(self,words):
        wc = WordCloud(width=800, height=800,font_path = 'C:/Windows/Fonts/malgun.ttf')
        wc.generate_from_frequencies(words)
        wc.to_file("data.png")
        pixmap = QPixmap()
        pixmap.load("data.png")
        #해상도를 바꾸고자 한다면 다음처럼 작성할 수 있습니다.
        #pm2 = pixmap.scaled(self.lb_img.width(),self.lb_img.height(),Qt.IgnoreAspectRatio);        
        self.lb_img.setPixmap(pixmap)
        self.tb_mo.setRowCount(len(words))        
        wlist = sorted(words.items(), key = lambda item: item[1], reverse=True)
        ri = 0
        for word,cnt in (wlist):
            self.tb_mo.setCellWidget(ri,0,QLabel(word)) 
            self.tb_mo.setCellWidget(ri,1,QLabel(str(cnt)))
            ri = ri + 1

2. 진입점 파일 코드 작성하기

이제 수집한 결과를 얻어온 후에 MyDlg를 띄워주는 코드를 작성합시다.

2.1 사용할 라이브러리

데이터베이스와 연동하기 위해 작성한 MorphemeSql, WebPageSql, InverseSql을 사용합니다.

MSSQL에 한글과 python의 한글의 호환 문제를 위해 EHHelper를 사용합니다.

대화 상자를 띄우기 위해 sys, PyQT5, MyDlg를 사용합니다.

from MorphemeSql import MorphemeSql
from WebPageSql import WebPageSql
from InverseSql import InverseSql
from EHHelper import EHHelper
import sys
from PyQt5.QtWidgets import QApplication
from MyDlg import MyDlg

2.2 수집한 결과 얻어오기

먼저 사전 개체를 생성합니다.

수집한 모든 형태소 목록을 얻어옵니다.

print("수집한 결과를 얻어오는 중입니다...")
mdic = dict()
moes = MorphemeSql.ListMorpheme()

형태소 목록에 있는 각 형태소마다 역파일 요소를 얻어옵니다.

for mo in moes:
    tmo = EHHelper.MssqlstrToStrKor(mo)
    mid = MorphemeSql.FindMid(tmo)
    invs = InverseSql.FindInv(mid)

역파일 요소에 참조 개수를 합하여 사전 개체에 추가합니다.

    rcnt = 0
    for inv in invs:
        rcnt = rcnt + inv[1]
    mdic[tmo]=rcnt

2.3 대화상자 띄우기

대화상자를 띄울 때 사전 개체를 설정해야 합니다.

app = QApplication(sys.argv)
md = MyDlg()
md.SetDictionary(mdic)
md.show()
sys.exit(app.exec_())

2.4 진입점 파일 전체 코드

from MorphemeSql import MorphemeSql
from WebPageSql import WebPageSql
from InverseSql import InverseSql
from EHHelper import EHHelper
import sys
from PyQt5.QtWidgets import QApplication
from MyDlg import MyDlg

print("수집한 결과를 얻어오는 중입니다...")
mdic = dict()
moes = MorphemeSql.ListMorpheme()
for mo in moes:
    tmo = EHHelper.MssqlstrToStrKor(mo)
    mid = MorphemeSql.FindMid(tmo)
    invs = InverseSql.FindInv(mid)
    rcnt = 0
    for inv in invs:
        rcnt = rcnt + inv[1]
    mdic[tmo]=rcnt

app = QApplication(sys.argv)
md = MyDlg()
md.SetDictionary(mdic)
md.show()
sys.exit(app.exec_())
반응형