무회blog

clustering-test00-군집분류,및 분류예측기-002,한파트흐름 본문

Python

clustering-test00-군집분류,및 분류예측기-002,한파트흐름

최무회 2020. 7. 20. 15:50
clustering-test00-군집분류,및 분류예측기-002
In [1]:
# Word2Vec embedding
# from gensim.models import Word2Vec
from gensim.models.word2vec import Word2Vec
from gensim.models import KeyedVectors
from gensim import models
from collections import defaultdict
from gensim import corpora
from gensim import similarities
from gensim.summarization import summarize

import pandas as pd
import time, timeit, os, sys , re , math

from nltk import sent_tokenize, word_tokenize
from konlpy.tag import Hannanum
from kiwipiepy import Kiwi
kiwi = Kiwi()
kiwi.prepare()
hannanum = Hannanum()
from rank_bm25 import BM25Okapi
from datetime import datetime
In [2]:
# BM25 를 사용하여 코사인 유사도에서 측정된 단어의 문장을 뽑아 낸다. 
start_now = int(time.time())
td = datetime.today().strftime("%Y%m%d")
tdd = datetime.today().strftime("%m%d")
now = datetime.now()
tdnow = now.strftime('%Y%m%d%H%M%S')
In [3]:
class Cleaning_Text:
    def tokenize_kiwi(sent):
        res, score = kiwi.analyze(sent)[0] # 첫번째 결과를 사용
        return [word
                for word, tag, _, _ in res
                if not tag.startswith('E') 
                and not tag.startswith('J') 
                and not tag.startswith('S')] # 조사, 어미, 특수기호는 제거      
    
    
    def token_word(documents): ## param List
        texts = [
            [word for word in document.split() if len(word) > 1]
            for document in documents
        ]
        return texts
    
    def token_sent(text):
        text = sent_tokenize(text)
        if len(text) > 1:
            text = text
        else:
            pass
        text_token = text
        return text_token        
    
    def listToText(inputList):
        returnText = ''
        for i in inputList:
            returnText = returnText + i
        rt2 = Cleaning_Text.text_cleaning(returnText)
        return rt2

    ##  # step_4,   공통 코드 , 텍스트 클리닝 
    def text_cleaning(text): 
    ##################################  gensim 사용을 위한 정규표현식 200624 
        hangul_path9 = '[가-힣]+\.'                  # 한글로 포함되다 . 

        hangul_path0 = '[가-힣]+\.[가-힣]{1}'        # 한글 . + 한글 처리 
        hangul_path1 = '[가-힣]+\.[\d]{1}'           # 한글 . + 숫자 처리 [0-9]
        hangul_path2 = '[가-힣]+\.[a-z]{1}'          # 한글 . + 영어 소문자 
        hangul_path3 = '[가-힣]+\.[A-Z]{1}'          # 한글 . + 영어 대문자 
        hangul_path4 = '[가-힣]+\.[\S]{1}'           # 한글 . + 비공백 [^ \t\n\r\f\v]와 같다.    
        hangul_path5 = '[가-힣]+\.[\s]{1}'           # 한글 . + 공백 [ \t\n\r\f\v]와 같다.
        hangul_path6 = '[가-힣]+\.[\W]{1}'           # 한글 . + 숫자 + 문자가 아닌 것 [^a-zA-Z0-9]와 같다.
        hangul_path7 = '[가-힣]+\.[\w]{1}'           # 한글 . + 숫자 + 문자 [a-zA-Z0-9]와 같다.
        hangul_path8 = '[가-힣]+\.[\b]{1}'           # 한글 . + 단어 경계 (`\w`와 `\W`의 경계)

        reg_path = hangul_path0 + '|' + hangul_path1 + '|'+ hangul_path2 + '|'+ hangul_path3 + '|'+ hangul_path4+ '|'+ hangul_path5
        hangul = re.compile(reg_path)              # 한글 + 모모로 포함되다 . 

        result = hangul.findall(text)                                                   # 정규식에 일치되는 부분을 리스트 형태로 저장, 단어 반환 
        result = list(set(result))    
        for x in result:
            text = text.replace(x, x[:-1] + '\n' + x[-1:])

        ### 줄단위 좌우 공백 지우기 , 
        text = text.replace('\n','_').split('_')
        text = [x.strip() for x in text]
        tts = ''
        for i in text:
            tts = tts + i + '\n'
            text = tts        
        ##################################  gensim 사용을 위한 정규표현식 200624
        text = re.sub('\[.+?\]','', text)         # 대괄호 [] 이내 모든 문자 삭제     

        #이모티콘 제거
        EMOJI = re.compile('[\U00010000-\U0010ffff]', flags=re.UNICODE)
        text= EMOJI.sub(r'', text)
        #이메일 주소 제거
        email =re.compile('([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)')
        text = email.sub('', text) 
        #URL 제거
        url =re.compile('(http|ftp|https)://(?:[-\w.]|(?:%[\da-fA-F]{2}))+')
        text = url.sub('', text) 
        #HTML 제거
        html =re.compile('<[^>]*>')
        text = html.sub('', text) 

        #특수문자를 공백으로 대체(문장을 살리기위헤 마침표는 남겨둠)
        #special =re.compile('[^\w\s]')
        #text = special.sub(' ', text) 
        special= ['*', '{', ',', ':', ']', '$', '+', '[', '#', '(', '%', '&', '}', '`', '‘', '’','·',
                    '=', ';', '>','>', '/', '"', '“', '”', '\\', '?', '~', "'", '<', ')', '^', '!', '_',
                    '|', '@','@','©','ⓒ', '℗','®','①', '-','▶','…','☞','▲','◆','■'] #'.', 빼고
        for chr in special :
            text=text.replace(chr,' ')

            #특수문자 제거 후 생기는 중복된 공백 제거
            while text.find('  ') > 0:
                text = text.replace('  ',' ' ) # 중복된 공백 제거

            #특수문자 제거 후 생기는 중복된 개행 제거
            while text.find('\n\n') > 0:
                text = text.replace('\n\n','\n' ) # 중복된 개행 제거

            #좌우측 공백 삭제
            text = text.strip()
        return text 
    
# 텍스트 정제 함수 : 분석에 불필요한 문자는 전부 제거합니다. 
# 형태소 분석해서 용언(P), 체언(N)만 남김
def hannanum_get_infoText(read_text):
    #resList = list()
    resList=[]
    #GetWordSet = set(['N'])
    GetWordSet = set(['N','P'])
    for read_text_line in read_text:
        res=""
        if len(read_text_line) > 0:
            pos = hannanum.pos(read_text_line,ntags=9)
            for keyword, type in pos:
                # 키워드가 한글자 이상일 경우만
                if len(keyword) > 1 :
                    # 용언(P), 체언(N)만 남김
                    if (type in GetWordSet):
                        if type == 'P': #용언일 경우 '다'를 붙여줌
                            keyword=keyword+'다'
                        resList.append(keyword)  
    return resList    
In [4]:
## 코사인 유사도의 단어로 BM25 방식을 이용하여 유사도 텍스트 문장을 추출한다. 
### from gensimBM25Source 
import math
from six import iteritems
from six.moves import xrange
# BM25 parameters.
PARAM_K1 = 1.5
PARAM_B = 0.75
EPSILON = 0.25

class BM25(object):
    def __init__(self, corpus):
        self.corpus_size = len(corpus)
        self.avgdl = sum(map(lambda x: float(len(x)), corpus)) / self.corpus_size
        self.corpus = corpus
        self.f = []
        self.df = {}
        self.idf = {}
        self.initialize()

    def initialize(self):
        for document in self.corpus:
            frequencies = {}
            for word in document:
                if word not in frequencies:
                    frequencies[word] = 0
                frequencies[word] += 1
            self.f.append(frequencies)

            for word, freq in iteritems(frequencies):
                if word not in self.df:
                    self.df[word] = 0
                self.df[word] += 1

        for word, freq in iteritems(self.df):
            self.idf[word] = math.log(self.corpus_size - freq + 0.5) - math.log(freq + 0.5)

    def get_score(self, document, index, average_idf):
        score = 0
        for word in document:
            if word not in self.f[index]:
                continue
            idf = self.idf[word] if self.idf[word] >= 0 else EPSILON * average_idf
            score += (idf * self.f[index][word] * (PARAM_K1 + 1)
                      / (self.f[index][word] + PARAM_K1 * (1 - PARAM_B + PARAM_B * self.corpus_size / self.avgdl)))
        return score

    def get_scores(self, document, average_idf):
        scores = []
        for index in xrange(self.corpus_size):
            score = self.get_score(document, index, average_idf)
            scores.append(score)
        return scores

###  가중치를 구해준다 .     
def get_bm25_weights(corpus):
    bm25 = BM25(corpus)
    average_idf = sum(map(lambda k: float(bm25.idf[k]), bm25.idf.keys())) / len(bm25.idf.keys())

    weights = []
    for doc in corpus:
        scores = bm25.get_scores(doc, average_idf)
        weights.append(scores)
    return weights    
In [5]:
# %matplotlib inline
import pandas as pd
import matplotlib as mpl
import numpy as np
import re


# 필요한 패키지와 라이브러리를 가져옴
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
mpl.rcParams['axes.unicode_minus'] = False
In [6]:
# df_list = [pd.read_excel('./../test_data/test_Newsdata-100.xlsx', sheet_name = x) for x in range(6)]
# df_list = [df_list[x][['subMenu', 'newsFrom', 'title', 'content', 'yoyag']] for x in range(6)]
# df_list = [df_list[x].head(17) for x in range(6)]
# df_ = pd.concat(df_list, axis=0)
# df_ = df_.head(100)
# df_


# # ct_list = []
# # # ct_list.append(df_['content'].tolist())

# # for i in df_['content'].tolist():
# #     ts = i
# #     Cleaning_Text.text_cleaning(ts)
# #     ct_list.append([ts])
    
# # data = ct_list
# # print(data)
In [7]:
df_list = [pd.read_excel('./../test_data/test_Newsdata-100.xlsx', sheet_name = x) for x in range(6)]
df_list = [df_list[x][['subMenu', 'newsFrom', 'title', 'content', 'yoyag']] for x in range(6)]
df_ = pd.concat(df_list, axis=0)
df = df_[['subMenu','title','content']]
df
df.sample(10)
Out[7]:
subMenu title content
63 경제 휴온스, ‘나노복합점안제’ 3상 완료… 출시 초읽기 온스(243070)의 안구건조증 치료제 ‘나노복합점안제(HU-007)’의 상용화가 ...
90 생활_문화 벤틀리모터스코리아, 3세대 신형 컨티넨탈 GT V8 인도 개시 벤틀리모터스코리아는 다이내믹한 드라이빙 성능과 궁극의 럭셔리를 담은 인테리어, 그리...
91 정치 與, 3차추경 3조 ‘뚝딱’ 증액… “졸속심사” 비판 각 상임위 1∼2시간 만에 “통과” “통과” / 통합당 “심사기한 일주일 늦추면 참...
18 생활_문화 창작자 권리보호 강화, 손쉬운 저작물 이용...저작권법 전부개정 추진 [파이낸셜뉴스] 정부가 ‘추가보상 청구권’, ‘확대된 집중관리’ 및 인공지능 개발,...
18 정치 'NO 재팬 1년'…서경덕 교수 "韓 네티즌, 이성적으로 잘 대응" 서경덕 성신여대 교수가 일본의 수출규제에 대응해 우리나라 네티즌들이 자발적인 불매운...
85 세계 미국 일일 확진자 4만8000명…또 사상 최고(상보) 미국의 코로나19 일일 확진자가 4만8000명을 넘어서 사상최고를 기록했다고 미국의...
80 IT_과학 “24시간이후 사라지는 콘텐츠”..트위터, 한국서 ‘플릿’ 시범 운영 터 ‘플릿’ 이미지‘트위터’ 플릿 한국 테스트 공지‘리트윗’과 ‘마음에 들어요’ 숫...
41 정치 "이래라저래라 한 적 없다" 김종인, 원 구성 결렬…與 '비토설' 반박 1대 국회 원 구성을 위한 여야 합의가 최종 무산된 가운데 여당 일부 인사들은 원구...
21 IT_과학 KT "스마트폰 1분 주문, 1시간대 배송"...언택트 온라인 채널 혁신 KT가 언택트 시대를 맞이해 스마트폰 온라인 구매 채널 혁신에 나섰다. 온라인에서...
64 생활_문화 해피콜, 11번가와 업무 제휴 협약 체결 해피콜은 온라인 오픈마켓 11번가와 매출 활성화 사업의 공동 추진을 위한 ‘업무 제...
In [8]:
print("在 subMenu 列中总共有 %d 个空值." % df['subMenu'].isnull().sum())
print("在 content 列中总共有 %d 个空值." % df['content'].isnull().sum())
df[df.isnull().values==True]
df = df[pd.notnull(df['content'])]
df
在 subMenu 列中总共有 0 个空值.
在 content 列中总共有 0 个空值.
Out[8]:
subMenu title content
0 정치 "일본, 한국·중국·대만 입국규제 완화 교섭 검토" (도쿄=연합뉴스) 이세원 특파원 = 일본 정부는 신종 코로나바이러스 감염증(코로나1...
1 정치 남한 기대 수명 83세 세계 9위, 북한은 얼마일까 북한의 평균 기대수명이 남한 보다 11년 짧은 것으로 나타났다. 합계출산율은 1.9...
2 정치 하태경 "윤석열, 박근혜도 감옥에 넣었는데…秋, 윤석열 선대본부장같다" 하태경 미래통합당 의원은 1일 "추미애 법무부 장관이 윤석열 검찰총장을 때리면서 키...
3 정치 北 선전매체 "반민족분열광신자" vs 진중권 "왜 나한테 ZR?" 북한 매체가 "셰익스피어의 오셀로에 나오는 이아고 같은 음모꾼이자 반민족분열광신자"...
4 정치 6ㆍ25 70주년 애국가 ‘아무리 봐도 북한 애국가’ 논란 달 6ㆍ25 전쟁 70주년 추념식 애국가가 북한의 애국가 전주와 비슷해 논란이다. ...
... ... ... ...
95 IT_과학 AI스피커 2차 대전...신제품 들고 나온 구글 vs 토종업계 [서울경제] 지난 2018년말 구글이 사람의 음성명령을 알아듣는 인공지능(AI) 스...
96 IT_과학 '겜잘알' 도종환 문체위원장 되자 게임업계 "규제 완화 기대" 게임 산업을 담당하는 국회 상임위원회인 문화체육관광위원회 위원장으로 더불어민주당 도...
97 IT_과학 휴대전화 카카오톡으로 개통…ICT 규제 샌드박스 9건 처리 으로 이동통신 대리점을 거치지 않고 카카오톡에서도 휴대전화를 개통할 수 있게 된다....
98 IT_과학 FCC "화웨이·ZTE, 미국 국가안보 위협" 연방통신위원회(FCC)가 화웨이와 ZTE에 대한 제재를 공식화했다. 테크크런치에 ...
99 IT_과학 [디지털세 현실화-하] 정부 대응 ‘투트랙’ 필요…합의 도출 여부 관건 전 세계 각국이 신종 코로나 바이러스(코로나19)로 부족해진 세수 확보를 위해 디지...

600 rows × 3 columns

In [9]:
#  接下来我们统计一下各个类别的数据量
d = {'subMenu':df['subMenu'].value_counts().index, 'count': df['subMenu'].value_counts()}
df_cat = pd.DataFrame(data=d).reset_index(drop=True)
df_cat
Out[9]:
subMenu count
0 사회 100
1 경제 100
2 IT_과학 100
3 정치 100
4 세계 100
5 생활_문화 100
In [10]:
# df_cat.plot(x='subMenu', y='count', kind='bar', legend=False,  figsize=(6, 6))
df_cat.plot(x='subMenu', y='count', kind='bar', legend=False,  figsize=(8, 5))
plt.title("CountClassifier")
plt.ylabel('count', fontsize=18)
plt.xlabel('title', fontsize=18)
Out[10]:
Text(0.5, 0, 'title')
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 49324 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 54924 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 44221 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 51228 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 44284 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 54617 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 51221 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 52824 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 49464 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 44228 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 49373 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 54876 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 47928 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 54868 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 49324 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 54924 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 44221 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 51228 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 44284 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 54617 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 51221 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 52824 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 49464 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 44228 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 49373 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 54876 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 47928 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 54868 missing from current font.
  font.set_text(s, 0, flags=flags)
In [11]:
# 接下来我们要将 subMenu 类转换成id,这样便于以后的分类模型的训练。
df['subMenu_id'] = df['subMenu'].factorize()[0]

cat_id_df = df[['subMenu', 'subMenu_id']].drop_duplicates().sort_values('subMenu_id').reset_index(drop=True)
cat_to_id = dict(cat_id_df.values)
id_to_cat = dict(cat_id_df[['subMenu_id', 'subMenu']].values)

cat_id_df.values
id_to_cat
df.sample(10)
Out[11]:
subMenu title content subMenu_id
83 사회 부산시 형제복지원 사건 진상규명 추진위원회 출범 [서울경제] 부산시는 ‘한국판 홀로코스트’로 불리는 형제복지원 사건과 관련해 그간 ... 2
74 IT_과학 '인보사 사기 의혹' 이웅열 전 코오롱 회장 구속영장 기각 절염 유전자치료제 인보사케이주(인보사) 관련 의혹을 받고 있는 이웅열 전 코오롱그룹... 5
85 경제 NH證 "현대모비스, 5년 뒤 전동화 매출 비중 7.4%→31.4% 전망" NH투자증권은 1일 현대모비스(012330)에 대해 전동화 사업 확대가 본격화 돼 ... 1
72 생활_문화 제주 대체로 맑은 날씨…낮 최고 27도 수요일인 1일 제주는 대체로 맑은 날씨가 예상된다. 제주지방기상청은 이날 제주지역 ... 3
87 IT_과학 ‘제7회 ICT 스마트 디바이스 전국 공모전’ 개최 통신기획평가원(원장 석제범)과 대구테크노파크 모바일융합센터(센터장 최석권)는 포스트... 5
19 세계 美, 코로나19 확진 또 최고치... 재확산 단계 돌입 파우치 "하루 감염 10만명 이를 수도" 경제활동 재개 중단 州 16곳으로 늘어미국... 4
25 사회 수원 100번째 코로나 확진자 발생… 관악구 확진자 접촉 수원에서 신종 코로나바이러스 감염증(코로나19) 100번째 확진자가 발생했다. 수... 2
74 정치 北, 출장 미용 서비스 활발?…"일반 파마는 북한 돈 만 원가량" 미용실이 없는 북한의 시골 마을에는 '출장 미용' 서비스가 이루어지고 있다는 내용의... 0
42 생활_문화 대상 정원e샵, 여름 캠핑 시즌 맞이 '홈캠핑 기획전' 상은 여름철 캠핑의 계절을 맞아 통합 온라인 쇼핑몰 정원e샵에서 오는 14일까지 '... 3
68 IT_과학 지구온난화로 바뀐 기후... 장마를 우기로? [파이낸셜뉴스] 본격적인 여름을 알리는 장마가 시작됐다. 한랭습윤한 오호츠크해... 5
In [12]:
cat_id_df
Out[12]:
subMenu subMenu_id
0 정치 0
1 경제 1
2 사회 2
3 생활_문화 3
4 세계 4
5 IT_과학 5
In [13]:
df['clean_content'] = df['content'].apply(Cleaning_Text.text_cleaning )
df = df[['subMenu_id','subMenu','title','content','clean_content']]
df.sample(15)
Out[13]:
subMenu_id subMenu title content clean_content
47 2 사회 동북아연합 사무국, 김경호 전 주러시아 공사 ‘홍보대사’ 위촉 김경호(사진) 전 주러시아 한국대사관 공사가 동북아시아지역자치단체연합(NEAR) 사... 김경호 사진 전 주러시아 한국대사관 공사가 동북아시아지역자치단체연합 NEAR 사무국...
64 5 IT_과학 삼성전자, 고용량 4비트 SSD '870 QVO' 글로벌 출시 삼성전자는 업계 최대 용량의 소비자용 4비트(QLC, Quadruple Level ... 삼성전자는 업계 최대 용량의 소비자용 4비트 QLC Quadruple Level C...
53 3 생활_문화 [오늘의 날씨]전국 흐리고 곳곳 비…낮에는 후텁지근 수요일인 오늘은 전국이 흐리고 곳곳에 산발적으로 비가 오겠다. 1일 기상청은 서울과... 수요일인 오늘은 전국이 흐리고 곳곳에 산발적으로 비가 오겠다.\n1일 기상청은 서울...
45 1 경제 한국농업경제학회 학술대회, '공익적 가치 확산:도시농업' 한국농업경제학회가 2일부터 이틀 간 서울대 호암교수회관에서 '공익적 가치 확산의 새... 한국농업경제학회가 2일부터 이틀 간 서울대 호암교수회관에서 공익적 가치 확산의 새 ...
85 0 정치 새얼굴 정무위, 그런데 만만치 않다…살벌한 분위기 왜? [the300]]앞으로 4년간 대한민국 금융·경제 분야를 책임질 제21대 국회 정무... 앞으로 4년간 대한민국 금융 경제 분야를 책임질 제21대 국회 정무위원회에 진용이 ...
32 4 세계 'NO 재팬 1년'…서경덕 교수 "韓 네티즌, 이성적으로 잘 대응" 서경덕 성신여대 교수가 일본의 수출규제에 대응해 우리나라 네티즌들이 자발적인 불매운... 서경덕 성신여대 교수가 일본의 수출규제에 대응해 우리나라 네티즌들이 자발적인 불매운...
91 0 정치 與, 3차추경 3조 ‘뚝딱’ 증액… “졸속심사” 비판 각 상임위 1∼2시간 만에 “통과” “통과” / 통합당 “심사기한 일주일 늦추면 참... 각 상임위 1∼2시간 만에 통과 통과 통합당 심사기한 일주일 늦추면 참여 정세균 국...
84 3 생활_문화 [신간] 머리카락의 기쁨과 슬픔 / 오늘도 쾌변 정신건강의학과 의사인 저자가 탈모증을 겪으면서 개인의 사회 심리적 변화를 '픽션'으... 정신건강의학과 의사인 저자가 탈모증을 겪으면서 개인의 사회 심리적 변화를 픽션 으로...
53 4 세계 미 안보보좌관 "북한, 도발 말고 협상 나서야…문 열려있어" 로버트 오브라이언 미국 백악관 국가안보보좌관은 현지시간으로 오늘(30일) 북미 비핵... 로버트 오브라이언 미국 백악관 국가안보보좌관은 현지시간으로 오늘 30일 북미 비핵화...
87 2 사회 '불타는 청춘' 윤기원 "강경헌에 고백했다 바로 거절…미안합니다" '불타는 청춘'에 윤기원이 새 친구로 등장했다. 지난달 30일 오후 방송된 SBS... 불타는 청춘 에 윤기원이 새 친구로 등장했다.\n지난달 30일 오후 방송된 SBS ...
54 5 IT_과학 SK텔레콤, 한국서비스품질지수 21년 연속 1위 K텔레콤은 한국표준협회가 주관하는 2020년 한국서비스품질지수(KS-SQI) 조사에... K텔레콤은 한국표준협회가 주관하는 2020년 한국서비스품질지수 KS SQI 조사에서...
98 0 정치 EU, ILO 협약 조속 비준 요청...文 "그린 뉴딜 파트너 기대" [서울경제] 유럽연합(EU) 정상들이 30일 문재인 대통령에게 국제노동기구(ILO)... 유럽연합 EU 정상들이 30일 문재인 대통령에게 국제노동기구 ILO 핵심협약의 조속...
95 4 세계 중국발 신종 돼지독감 바이러스…변종으로 인간 전염 가능성 지녀 중국에서 유행중인 변종 돼지 인플루엔자 바이러스가 사람에게 전염될 수 있다는 주장이... 중국에서 유행중인 변종 돼지 인플루엔자 바이러스가 사람에게 전염될 수 있다는 주장이...
42 1 경제 [종합] 2세 경영시대 닻올린 DB그룹…김남호 회장 '뉴DB' 드라이브 앞으로 DB를 어떠한 환경 변화도 헤쳐 나갈 수 있는 '지속성장하는 기업’으로 만들... 앞으로 DB를 어떠한 환경 변화도 헤쳐 나갈 수 있는 지속성장하는 기업 으로 만들기...
47 0 정치 차명진 탓에 욕 먹은 민경욱…"의원은 불법도 돼? 한심하다" 난 4·15 총선에서 낙선한 민경욱 전 미래통합당 의원이 서울 여의도 국회의사당에서... 난 4 15 총선에서 낙선한 민경욱 전 미래통합당 의원이 서울 여의도 국회의사당에서...
In [14]:
# 分词 ,, 문장을 토큰화 ,
# df['cut_content'] = df['clean_content'].apply(word_tokenize)

df['cut_content'] = df['clean_content'].apply(lambda x: " ".join(w for w in word_tokenize(x)))
df.head()
D:\appd\lib\site-packages\ipykernel_launcher.py:4: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  after removing the cwd from sys.path.
Out[14]:
subMenu_id subMenu title content clean_content cut_content
0 0 정치 "일본, 한국·중국·대만 입국규제 완화 교섭 검토" (도쿄=연합뉴스) 이세원 특파원 = 일본 정부는 신종 코로나바이러스 감염증(코로나1... 도쿄 연합뉴스 이세원 특파원 일본 정부는 신종 코로나바이러스 감염증 코로나19 확산... 도쿄 연합뉴스 이세원 특파원 일본 정부는 신종 코로나바이러스 감염증 코로나19 확산...
1 0 정치 남한 기대 수명 83세 세계 9위, 북한은 얼마일까 북한의 평균 기대수명이 남한 보다 11년 짧은 것으로 나타났다. 합계출산율은 1.9... 북한의 평균 기대수명이 남한 보다 11년 짧은 것으로 나타났다.\n합계출산율은 1.... 북한의 평균 기대수명이 남한 보다 11년 짧은 것으로 나타났다 . 합계출산율은 1....
2 0 정치 하태경 "윤석열, 박근혜도 감옥에 넣었는데…秋, 윤석열 선대본부장같다" 하태경 미래통합당 의원은 1일 "추미애 법무부 장관이 윤석열 검찰총장을 때리면서 키... 하태경 미래통합당 의원은 1일 추미애 법무부 장관이 윤석열 검찰총장을 때리면서 키워... 하태경 미래통합당 의원은 1일 추미애 법무부 장관이 윤석열 검찰총장을 때리면서 키워...
3 0 정치 北 선전매체 "반민족분열광신자" vs 진중권 "왜 나한테 ZR?" 북한 매체가 "셰익스피어의 오셀로에 나오는 이아고 같은 음모꾼이자 반민족분열광신자"... 북한 매체가 셰익스피어의 오셀로에 나오는 이아고 같은 음모꾼이자 반민족분열광신자 라... 북한 매체가 셰익스피어의 오셀로에 나오는 이아고 같은 음모꾼이자 반민족분열광신자 라...
4 0 정치 6ㆍ25 70주년 애국가 ‘아무리 봐도 북한 애국가’ 논란 달 6ㆍ25 전쟁 70주년 추념식 애국가가 북한의 애국가 전주와 비슷해 논란이다. ... 달 6ㆍ25 전쟁 70주년 추념식 애국가가 북한의 애국가 전주와 비슷해 논란이다.\... 달 6ㆍ25 전쟁 70주년 추념식 애국가가 북한의 애국가 전주와 비슷해 논란이다 ....
In [15]:
# %pip install wordcloud
cat_id_df
cat_id_df.subMenu.values
df['cut_content'] 
cat_id_df.subMenu.values
df['subMenu']
Out[15]:
0        정치 
1        정치 
2        정치 
3        정치 
4        정치 
       ...  
95    IT_과학 
96    IT_과학 
97    IT_과학 
98    IT_과학 
99    IT_과학 
Name: subMenu, Length: 600, dtype: object
In [16]:
# # 토큰화 된 단어들을 기준으로 단어의 분류가 된 워드클라우드를 생성 
# # 가장 많이 나오는 top 100 개의 단어를 출력해보기 , 
# from collections import Counter
# from wordcloud import WordCloud

# def generate_wordcloud(tup):
#     wordcloud = WordCloud(background_color='white',
#                           font_path='simhei.ttf',
#                           max_words=50, max_font_size=40,
#                           random_state=42
#                          ).generate(str(tup))
#     return wordcloud
 
# cat_desc = dict()
# for cat in cat_id_df.subMenu.values: 
#     text = df.loc[df['subMenu']==cat, 'cut_content']
    
#     text = (' '.join(map(str,text))).split(' ')
#     cat_desc[cat]=text
    
# fig,axes = plt.subplots(5, 2, figsize=(30, 38))
# k=0
# for i in range(5):
#     for j in range(2):
#         cat = id_to_cat[k]
#         most100=Counter(cat_desc[cat]).most_common(100)
#         ax = axes[i, j]
#         ax.imshow(generate_wordcloud(most100), interpolation="bilinear")
#         ax.axis('off')
#         ax.set_title("{} Top 100".format(cat), fontsize=30)
#         k+=1

# print('폰트 조절 필요')
In [17]:
# 这里我们使用了参数ngram_range=(1,2)
# ,这表示我们除了抽取评论中的每个词语外
# ,还要抽取每个词相邻的词并组成一个“词语对”,如: 词1,词2,词3,词4,(词1,词2),(词2,词3),(词3,词4)。
# 这样就扩展了我们特征集的数量,有了丰富的特征集才有可能提高我们分类文本的准确度。
# 参数norm='l2',是一种数据标准划处理的方式,可以将数据限制在一点的范围内比如说(-1,1)

from sklearn.feature_extraction.text import TfidfVectorizer
 
tfidf = TfidfVectorizer(norm='l2', ngram_range=(1, 2))
cut_content = df.cut_content.tolist()
# print(cut_content[0], end=',')

features = tfidf.fit_transform(cut_content)
labels = df.subMenu_id
print(features.shape)
print('-(문장중, 토픽개수)----------------------------')
print(features)
(600, 137883)
-(문장중, 토픽개수)----------------------------
  (0, 86018)	0.04576700579210731
  (0, 26022)	0.04576700579210731
  (0, 71853)	0.04450871756514488
  (0, 22248)	0.04450871756514488
  (0, 45661)	0.04576700579210731
  (0, 90141)	0.04576700579210731
  (0, 93909)	0.04576700579210731
  (0, 133214)	0.04576700579210731
  (0, 87114)	0.04450871756514488
  (0, 97545)	0.04450871756514488
  (0, 42745)	0.04576700579210731
  (0, 84728)	0.04576700579210731
  (0, 89083)	0.04450871756514488
  (0, 63352)	0.04450871756514488
  (0, 57441)	0.04576700579210731
  (0, 49290)	0.04576700579210731
  (0, 54652)	0.04576700579210731
  (0, 16691)	0.04576700579210731
  (0, 131091)	0.04450871756514488
  (0, 119138)	0.04576700579210731
  (0, 37464)	0.04576700579210731
  (0, 134344)	0.04576700579210731
  (0, 85984)	0.04576700579210731
  (0, 25995)	0.04245730925007276
  (0, 42619)	0.04576700579210731
  :	:
  (599, 85996)	0.023822549395639544
  (599, 88950)	0.017599034446367817
  (599, 134342)	0.022724567279104657
  (599, 57927)	0.030292337145767356
  (599, 16790)	0.025358695047442415
  (599, 22362)	0.03661306402626143
  (599, 98032)	0.030637718738441056
  (599, 38946)	0.021042319055345426
  (599, 55143)	0.016431688395761805
  (599, 130504)	0.017765887917129266
  (599, 12973)	0.023239156384340383
  (599, 87084)	0.01620759016025286
  (599, 42690)	0.012033001037133092
  (599, 88747)	0.019568908046175983
  (599, 85993)	0.022724567279104657
  (599, 130004)	0.03138600211003427
  (599, 43308)	0.009937766516373554
  (599, 16644)	0.019696236539849515
  (599, 54964)	0.018261016153930755
  (599, 38632)	0.04758317308083994
  (599, 130172)	0.021847845491035314
  (599, 111492)	0.03119395228079621
  (599, 121805)	0.009400122171674281
  (599, 74940)	0.011709226438618988
  (599, 105728)	0.03333581160118876
In [18]:
# 卡方检验的方法来找出每个分类中关联度最大的两个词语和两个词语对
# 卡方检验是一种统计学的工具,用来检验数据的拟合度和关联度。
# 在这里我们使用sklearn中的chi2方法。
# 我们可以看到经过卡方(chi2)检验后,找出了每个分类中关联度最强的两个词和两个词语对。这些词和词语对能很好的反映出分类的主题。
from sklearn.feature_selection import chi2
import numpy as np

cat_to_id.items()

N = 2  
for cat, cat_id in sorted(cat_to_id.items()):
    features_chi2 = chi2(features, labels == cat_id)
    indices = np.argsort(features_chi2[0])
    feature_names = np.array(tfidf.get_feature_names())[indices]
    print(feature_names)
    unigrams = [v for v in feature_names if len(v.split(' ')) == 1]
    bigrams = [v for v in feature_names if len(v.split(' ')) == 2]
    print("# '{}':".format(cat))
    print("  . Most correlated unigrams:\n       . {}".format('\n       . '.join(unigrams[-N:])))  # 마지막 2번째 2개 
    print("  . Most correlated bigrams:\n       . {}".format('\n       . '.join(bigrams[-N:])))
['약속했다' '선도해' '절차도' ... '870' '월정액' '지상파']
# 'IT_과학 ':
  . Most correlated unigrams:
       . 월정액
       . 지상파
  . Most correlated bigrams:
       . 870 qvo
       . 지상파 3사
['합리적인' '것이기' '것이기 때문에' ... '전자영수증' '갤러리아' '그룹']
# '경제 ':
  . Most correlated unigrams:
       . 갤러리아
       . 그룹
  . Most correlated bigrams:
       . 김준기 회장의
       . 자체 개발한
['보고' '지방의회' '논의했다' ... '50대' 'a씨는' '지하철']
# '사회 ':
  . Most correlated unigrams:
       . a씨는
       . 지하철
  . Most correlated bigrams:
       . 50대 여성
       . 마스크 착용을
['지방의회' '없지' '처음이다' ... '웰니스' '18' '강원']
# '생활_문화 ':
  . Most correlated unigrams:
       . 18
       . 강원
  . Most correlated bigrams:
       . 리미티드 에디션
       . 유의해야 한다
['제한' '예를 들어' 'ceo' ... '현지시간' '트럼프' '홍콩']
# '세계 ':
  . Most correlated unigrams:
       . 트럼프
       . 홍콩
  . Most correlated bigrams:
       . 트럼프 대통령은
       . 30일 현지시간
['mbc' '개편을' '되기' ... '국회' '탈북민' '의원은']
# '정치 ':
  . Most correlated unigrams:
       . 탈북민
       . 의원은
  . Most correlated bigrams:
       . 노동당 기관지
       . 탈북민 수가
In [19]:
## 학습을 시킨다 . 
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB
 
X_train, X_test, y_train, y_test = train_test_split(df['cut_content'], df['subMenu_id'], random_state = 0)
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(X_train)
 
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
 
clf = MultinomialNB().fit(X_train_tfidf, y_train)
In [20]:
## 학습이 끝나고 나서 이를 계기로 content 내용의 유형을 예측하게 한다 . 
## 이를 위해 먼저 예측할 함수를 정의한다 . 

# df['cut_content'] = df['clean_content'].apply(lambda x: " ".join(w for w in word_tokenize(x)))

def myPredict(text):
    format_sec=" ".join(w for w in word_tokenize(text))
    print(format_sec)
    pred_cat_id=clf.predict(count_vect.transform([format_sec]))
    predic = id_to_cat[pred_cat_id[0]]
    print('예측결과 : {}'.format(predic))

myPredict('''1달러 배럴당 분기 약 660억원의 영업이익 증감이 가능하다''')

myPredict('신한금융투자는 1일 S Oil 010959 에 대해 2분기에 흑자전환할 것이라며 하반기 턴어라운드의 전초전이라고 밝혔다.')

myPredict('''
바라트바이오텍은 자국 내에서 얻은 바이러스 변종이 백신을 빨리 개발하는 데 도움이 되었다 며 세계적으로 존재하는 코로나19 바이러스 변종 간 차이를 여전히 연구하고 있다 고 밝혔다.
''')

myPredict('''
NEAR는 경북 포항에 있는 사무국에서 김옥채 사무총장을 비롯한 대내외 관계자 등 20여 명이 참석한 가운데 김 전 주러시아 한국대사관 공사의 홍보대사 위촉식을 개최했다고 1일 밝혔다.
''')

myPredict('대학교 등록금은 어쩌거 저쩌구')
1달러 배럴당 분기 약 660억원의 영업이익 증감이 가능하다
예측결과 : 경제 
신한금융투자는 1일 S Oil 010959 에 대해 2분기에 흑자전환할 것이라며 하반기 턴어라운드의 전초전이라고 밝혔다 .
예측결과 : 경제 
바라트바이오텍은 자국 내에서 얻은 바이러스 변종이 백신을 빨리 개발하는 데 도움이 되었다 며 세계적으로 존재하는 코로나19 바이러스 변종 간 차이를 여전히 연구하고 있다 고 밝혔다 .
예측결과 : 세계 
NEAR는 경북 포항에 있는 사무국에서 김옥채 사무총장을 비롯한 대내외 관계자 등 20여 명이 참석한 가운데 김 전 주러시아 한국대사관 공사의 홍보대사 위촉식을 개최했다고 1일 밝혔다 .
예측결과 : 경제 
대학교 등록금은 어쩌거 저쩌구
예측결과 : 사회 
In [21]:
## 接下来我们尝试不同的机器学习模型,并评估它们的准确率,我们将使用如下四种模型:
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import MultinomialNB
from sklearn.svm import LinearSVC
 
from sklearn.model_selection import cross_val_score
 
models = [
    RandomForestClassifier(n_estimators=200, max_depth=3, random_state=0),
    LinearSVC(),
    MultinomialNB(),
    LogisticRegression(random_state=0),
]
CV = 5
cv_df = pd.DataFrame(index=range(CV * len(models)))
entries = []
for model in models:
    model_name = model.__class__.__name__
    accuracies = cross_val_score(model, features, labels, scoring='accuracy', cv=CV)
    for fold_idx, accuracy in enumerate(accuracies):
        entries.append((model_name, fold_idx, accuracy))
cv_df = pd.DataFrame(entries, columns=['model_name', 'fold_idx', 'accuracy'])
In [22]:
import seaborn as sns
 
sns.boxplot(x='model_name', y='accuracy', data=cv_df)
sns.stripplot(x='model_name', y='accuracy', data=cv_df, 
              size=8, jitter=True, edgecolor="gray", linewidth=2)
plt.show()
In [23]:
## 상기 내용중 linearSVC 의 정확도가 가장 높은것으로 판단됨 
cv_df.groupby('model_name').accuracy.mean()
Out[23]:
model_name
LinearSVC                 0.606667
LogisticRegression        0.606667
MultinomialNB             0.593333
RandomForestClassifier    0.551667
Name: accuracy, dtype: float64
In [30]:
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
 
#训练模型
model = LinearSVC()
X_train, X_test, y_train, y_test, indices_train, indices_test = train_test_split(features, labels, df.index, 
                                                                                 test_size=0.33, stratify=labels, random_state=0)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
 
 
 
#生成混淆矩阵
conf_mat = confusion_matrix(y_test, y_pred)
fig, ax = plt.subplots(figsize=(10,8))
sns.heatmap(conf_mat, annot=True, fmt='d',xticklabels=cat_id_df.subMenu.values, yticklabels=cat_id_df.subMenu.values)
plt.ylabel('shijiJIEGUO',fontsize=18)
plt.xlabel('yuceJIEGUO',fontsize=18)
plt.show()
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 51221 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 52824 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 44221 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 51228 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 49324 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 54924 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 49373 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 54876 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 47928 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 54868 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 49464 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 44228 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 44284 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 54617 missing from current font.
  font.set_text(s, 0.0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 51221 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 52824 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 44221 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 51228 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 49324 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 54924 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 49373 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 54876 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 47928 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 54868 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 49464 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 44228 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 44284 missing from current font.
  font.set_text(s, 0, flags=flags)
D:\appd\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 54617 missing from current font.
  font.set_text(s, 0, flags=flags)
In [31]:
from sklearn.metrics import classification_report
 
print('accuracy %s' % accuracy_score(y_pred, y_test))
print(classification_report(y_test, y_pred,target_names=cat_id_df['subMenu'].values))
accuracy 0.5656565656565656
              precision    recall  f1-score   support

         정치        0.70      0.79      0.74        33
         경제        0.47      0.42      0.44        33
         사회        0.50      0.39      0.44        33
      생활_문화        0.52      0.42      0.47        33
         세계        0.57      0.82      0.68        33
      IT_과학        0.58      0.55      0.56        33

    accuracy                           0.57       198
   macro avg       0.56      0.57      0.56       198
weighted avg       0.56      0.57      0.56       198

In [36]:
from IPython.display import display
 
for predicted in cat_id_df.subMenu_id:
    for actual in cat_id_df.subMenu_id:
        if predicted != actual and conf_mat[actual, predicted] >= 6:
            print("{} 예측하면 {} : {} 개.".format(id_to_cat[actual], id_to_cat[predicted], conf_mat[actual, predicted]))
            display(df.loc[indices_test[(y_test == actual) & (y_pred == predicted)]][['subMenu', 'content']])
            print('')
사회  예측하면 정치  : 6 개.
subMenu content
3 정치 북한 매체가 "셰익스피어의 오셀로에 나오는 이아고 같은 음모꾼이자 반민족분열광신자"...
3 경제 아모레퍼시픽이 11번가와 전략적 비즈니스 파트너십(JBP)을 맺고 디지털 커머스 확...
3 사회 민주노총이 오늘(1일) 오전 긴급 중앙집행위원회를 소집하고 노사정 대타협에 대한 의...
3 생활_문화 한국지엠(GM)이 정부의 개별소비세 감면 혜택 축소에 따른 차액분을 구매 고객에 지...
3 세계 최근 중국에서 발견된 신종 돼지 인플루엔자 변종의 인간에 대한 전염성이 높은 것으로...
3 IT_과학 거대 블랙홀 내부에서 소형 블랙홀들 충돌하면서 빛 발생 저 멀리 검은 원반 주위로 ...
32 정치 "공정한 세상 만들기 위해 국회의원 월급 최저임금으로 지급해달라. 솔선수범하는 의...
32 경제 아자동차가 '대한민국 동행세일'에 참가해 최대 10% 할인 혜택을 제공한다. 기아차...
32 사회 전교조 충남지부는 1일 "교원평가의 무리한 시행은 수업과 방역이라는 두 마리 토끼를...
32 생활_문화 사단법인 문학실험실(대표 이인성)은 제6회 김현문학패 수상자로 김숨 소설가(46)와...
32 세계 서경덕 성신여대 교수가 일본의 수출규제에 대응해 우리나라 네티즌들이 자발적인 불매운...
32 IT_과학 성전자가 낸드플래시와 솔리드스테이트드라이브(SSD) 주도권을 강화한다. 삼성전...
28 정치 골관절염 유전자치료제 인보사케이주(인보사)를 둘러싼 의혹으로 검찰 수사를 받아온 6...
28 경제 B그룹 창업주인 김준기 전 회장의 장남인 김남호 DB금융연구소 부사장이 1일 그룹 ...
28 사회 중권 전 동양대학교 교수가 "윤석열 검찰총장 때문에 신종 코로나바이러스 감염증(코로...
28 생활_문화 미국 항공우주국(NASA)이 인증한 우주의 냄새를 담은 '오드 스페이스'(Eau d...
28 세계 도널드 트럼프 미국 대통령이 1일(현지 시각) 코로나 사태와 관련해 중국에 대한 분...
28 IT_과학 위치 기반 가까운 대리점으로 주문 전송·KT가 언택트 시대에 발맞춰 배달앱 음식 주...
10 정치 태 미래통합당 의원은 1일 김현미 국토교통부 장관을 겨냥해 “이 정부의 무능함의 극...
10 경제 대한주택건설협회(회장 박재홍)와 주택도시보증공사(사장 이재광)는 지난달 30일 오후...
10 사회 두관 더불어민주당 의원의 연봉을 국회 보좌관 수준으로 낮춰달라는 청와대 국민청원이 ...
10 생활_문화 보레(Chevrolet)가 7월 코로나19 장기화로 인한 어려움 극복에 동참하고자 ...
10 세계 로버트 오브라이언 미국 백악관 국가안보보좌관은 30일(현지 시각) "북한이 도발을 ...
10 IT_과학 캐릭터 결혼하고 자식도 낳아 기를 수 있는 기능 추가2007년 미국서 3일 만에 3...
54 정치
54 경제 렉서스코리아는 오는 19일까지 프리미엄 하이브리드 SUV에 대한 온라인 시승 이벤트...
54 사회 임 3년차를 맞은 이철우 경북지사의 발걸음이 첫날부터 분주하다. 1일 도에 따...
54 생활_문화 용자동차는 티볼리 출시 5년을 맞아 독보적인 상품성을 갖춘 리미티드 에디션을 선보인...
54 세계 미국에서 18개월 아이가 개 사육장에 방치됐다가 신고를 받고 출동한 경찰에 의해 구...
54 IT_과학 K텔레콤은 한국표준협회가 주관하는 2020년 한국서비스품질지수(KS-SQI) 조사에...
76 정치 국내 입국 탈북민 수가 올해 2분기 사상 최저를 기록했다. 신종 코로나바이러...
76 경제 답답한 도심을 떠나 수도권 인근의 전원주택과 타운하우스를 찾는 이들이 늘고 있다. ...
76 사회 언유착 의혹' 수사를 두고 서울중앙지검 수사팀과 대검찰청 지휘부의 갈등이 고조되고 ...
76 생활_문화 쌍용차가 소형 스포츠유틸리티차량(SUV) 티볼리 출시 5년을 맞아 한정판 모델을 선...
76 세계 미국의 뉴욕 주와 뉴저지 주 그리고 코네티컷 주는 캘리포니아 주 등 8개 주에서 온...
76 IT_과학 다중접속역할수행게임(MMORPG)이 강세를 보였던 국내 모바일 게임 시장에 카트라이...
사회  예측하면 경제  : 6 개.
subMenu content
35 정치 장 의원 "이제 우리는 어떡해야 하나. 강경투쟁? 복귀? 보이콧?" 장제원 ...
35 경제 한국전력은 광주광역시, 전라남도, 나주시와 협업해 올해 1월부터 6월까지 에너지 인...
35 사회 경남 거창군은 가조면 수월리 우두산에 조성중인 거창항노화힐링랜드 조성사업이 공정률 ...
35 생활_문화 자동차 2020 팰리세이드 캘리그래피를 타고 지난달 30일 경기도 분당내곡간 고속화...
35 세계 국 민주당 대선 후보인 조 바이든 전 미국 부통령이 도널드 트럼프 미국 대통령이 신...
35 IT_과학 신규 채널 중 90%가 개별·중소 PP(LG헬로비전이 케이블TV 서비스인 헬로tv의...
9 정치 YTN라디오(FM 94.5) [노영희의 출발 새아침]□ 방송일시 : 2020년 7월...
9 경제 아워홈은 자체 개발한 '용기를 대체하는 가정간편식(HMR) 식품 파우치'가 세계포장...
9 사회 유한양행은 1일자로 기구 조직개편과 임원 인사발령을 실시, 업무총괄에 조욱제 부사장...
9 생활_문화 화체육관광부(장관 박양우)와 한국관광공사(사장 안영배)는 K방역을 실천해 온 국민들...
9 세계 정부는 '코로나19' 확산을 막겠다며 실시 중인 한국에 대한 입국 규제를 완화하는...
9 IT_과학 성SDI가 창립 50주년을 맞았다. 새로운 50년은 초격차 기술 회사 도약을 추진...
82 정치 尹 총장, 이낙연(민주당 의원)·이재명(경기지사) 이어 차기 대권주자 3위 등극 /...
82 경제 갤러리아 백화점 전자영수증. (사진=갤러리아백화점)[이데일리 이윤화 기자] 갤러리...
82 사회 국내 자동심장충격기(AED) 시장 매출 1위인 나눔테크가 지난 30일 광주과학기술원...
82 생활_문화 [따끈따끈 새책] 기록이 '직업병'인 두 청년이 대신 전하는 사막의 낭만과 현실]'...
82 세계 "미국이 잘못된 방향으로 가고 있다. 이대로 가면 하루에 감염자가 10만명이 나와...
82 IT_과학 부산시와 부산산업과학혁신원은 2일 오후 시청에서 2021년도 부산 혁신사업 투자 방...
86 정치 김태년 “국민들 위해 할 일 산적” / “국회 문 열려” 통합당 복귀 압박 / 이달...
86 경제 1번가와 아모레퍼시픽이 이커머스 시장 뷰티 1위 선점을 위한 공동마케팅을 추진한다고...
86 사회 경남 사천시 송도근 시장은 1일 시정 6주년을 맞아 출입기자단과 간담회를 갖고 "세...
86 생활_문화 (서울=연합뉴스) "나랑 온라인에서 술 한잔하고 싶어 남은 거지? 한잔할래?" ...
86 세계 중국ㆍ홍콩 정부 향한 증오 선동. .. 최고 10년형국가안전보장위 설치. .. 중국...
86 IT_과학 중국에서 유행중인 변종 돼지 인플루엔자 바이러스가 사람에게 전염될 수 있다는 주장이...
29 정치 청와대가 김연철 전 통일부장관의 후임으로 이인영 더불어민주당 의원에 대한 검증 작업...
29 경제 코로나19 확진자가 거듭 발생한 쿠팡이 전국 로켓배송 센터에 '초고강도 거리두기'를...
29 사회 국내 자산가들의 자산관리 방법 중 하나로 해외 영주권 취득이 떠오른 이후 각국의 투...
29 생활_문화 뮤지컬 배우 이서영. 제공|판타지오[스포츠서울 김효원기자]뮤지컬 배우 이서영이 ‘...
29 세계 [헤럴드경제=뉴스24팀] 이탈리아의 신종 코로나바이러스 감염증(코로나19) 최초 확...
29 IT_과학 LG유플러스가 5년, 7년, 10년 이상 모바일 장기 이용고객 혜택을 확대한다. L...
61 정치 신종 코로나바이러스 감염증(코로나19)으로 중국을 거쳐 국내로 들어오는 탈북루트가 ...
61 경제 성제약이 건강기능식품 브랜드 '피팅랩'(Fitting Lab)을 공식 론칭하고, 기...
61 사회 한국남부발전(사장 신정식)이 코로나19로 달라진 경영환경에 대비해 혁신성장위원회를 ...
61 생활_문화 매트위에 편하게 선 후 무릎을 가슴까지 가져와준다. 허리를 곧게 펴 주면서 호흡한다...
61 세계 브라질의 신종 코로나바이러스 감염증(코로나19) 사망자 수가 6만명에 근접했다. 로...
61 IT_과학 K브로드밴드는 한국표준협회가 주관하는 2020년 한국서비스품질지수(KS-SQI, K...
경제  예측하면 IT_과학  : 6 개.
subMenu content
58 정치 국내 입국 탈북민 수가 올해 2분기 사상 최저를 기록했다. 신종 코로나바이러스 감염...
58 경제 하이저는 7월 한 달간 하이엔드 이어폰 ‘IE500PRO’와 무선 마이크 시스템 ‘...
58 사회 한화투자증권은 1일 메지온(140410)에 대해 유데나필(Udenafil)의 미국 ...
58 생활_문화 수요일인 1일은 전국이 대체로 흐리고 서울과 경기, 강원영서 지역에 아침까지, 강원...
58 세계 네덜란드 전자·의료장비 업체 필립스와 프랑스의 화장품 기업 로레알이 국내 벤처·스타...
58 IT_과학 해 4월 3일 세계 최초로 상용화된 5G의 품질 논란이 여전하지만, 통신사 중에서는...
50 정치 중권 전 동양대 교수가 지난달 30일 홍준표 무소속 의원이 흉악범죄를 저지르고 사형...
50 경제 성전자(005930) 라이프스타일 TV가 최근 서울 시내 ‘핫 플레이스’ 곳곳에 전...
50 사회 대전시는 교통약자의 이동편의와 운행의 안정성을 확보하기 위해 특별교통수단 사랑콜 특...
50 생활_문화 마이뉴스의 모토는 '모든 시민은 기자다'입니다. 시민 개인의 일상을 소재로 한 '...
50 세계 중국 정부가 홍콩 국가보안법(홍콩보안법)을 지난달 30일 오후 11시(현지시간) 발...
50 IT_과학 [파이낸셜뉴스] 금융당국이 가상자산 기업의 자금세탁방지(AML) 의무를 골자로 한 ...
36 정치 조 교수 "나는 비판하면서 남으로부터 비판받지 않겠다는 것은 매우 오만한 생각" ...
36 경제 라인투자연계(P2P) 금융 기업 에잇퍼센트(8퍼센트)가 신규 서비스 ‘예치금 금고’...
36 사회 [서울경제] 부산시와 부산산업과학혁신원(BISTEP)은 2일 오후 3시 시청 대회의...
36 생활_문화 신종 코로나바이러스 감염증(코로나19) 봉쇄조치의 일환으로 문을 닫았던 영국의 수많...
36 세계 계보건기구(WHO) 미국지역본부를 겸하고 있는 범미보건기구(PAHO)는 중남미의 신...
36 IT_과학 페이스북은 2018년 입체(3D) 사진 기능을 도입했지만 듀얼 카메라가 있는 일부 ...
59 정치 “자식을 먹잇감으로 줄 생각 추호도 없다” 더불어민주당 김두관 의원. 연합뉴...
59 경제 이크로텍이 월 최대 1억장 규모의 나노 마스크 생산 시설을 구축한다. 마이크로텍은 ...
59 사회 밤사이 광주에서 신종 코로나바이러스 감염증(코로나19) 확진자가 추가로 7명이 발생...
59 생활_문화 부산시 낙동강관리본부는 부산현대미술관, 을숙도 문화회관, 한국수자원공사 부산권 지사...
59 세계 주에서는 과연 어떤 냄새가 날까. 우주비행사들은 우주에서만 맡을 수 있는 이 독특...
59 IT_과학 구경북과학기술원(DGIST)이 지식재산 창출·활용의 선순환 체계 구축을 통한 발명문...
88 정치 [the300]]국회 원 구성이 사실상 마무리되면서 ‘상임위 중 상임위’로 꼽히는 ...
88 경제 베이코리아가 운영하는 G마켓과 옥션이 오는 7일까지1년 중 최대규모의 패션뷰티 할인...
88 사회 산공항을 기반으로 하는 하이에어가 울산-제주 노선 신규 취항 기념으로 특가 항공권 ...
88 생활_문화 ━ [더,오래] 송미옥의 살다보면(147) 동호회 모임을 가니 한 지인...
88 세계 "우리는 바이러스를 완전히 통제하지 못하고 있습니다. 상황이 반전되지 않는다면 확...
88 IT_과학 ‘포스트 코로나’ 대비해 디지털 리터러시 높이는 온라인 교육 확대할 것 신종 ...
0 정치 (도쿄=연합뉴스) 이세원 특파원 = 일본 정부는 신종 코로나바이러스 감염증(코로나1...
0 경제 삼성전자의 라이프스타일 TV가 최근 서울 시내 핫 플레이스에서 모습을 드러내고 있다...
0 사회 행을 강제추행으로 처벌할 수 있도록 한 형법 조항이 과잉금지 원칙에 반하지 않는다는...
0 생활_문화 는 누군가 자신의 등을 밟고 지나가기를 기다리는 존재다. 또한 모든 것을 이어주는...
0 세계 중국에서 30일 하루 동안 3명의 신종 코로나바이러스 감염증(코로나19) 신규 확진...
0 IT_과학 LG유플러스가 5년 이상 휴대폰을 이용한 장기 가입자를 대상으로 감사 선물과 제휴사...

Comments