250x250
Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Websocket
- java
- RESFUL
- mysql
- (깃)git bash
- 이력서
- 토픽추출
- db
- jsp 파일 설정
- 幼稚园杀手(유치원킬러)
- Python
- r
- 게시판 만들기
- Topics
- 과학백과사전
- spring MVC(모델2)방식
- 자바
- 코사인 유사도
- Gmarket
- test
- pytorch
- 파이썬
- 지마켓
- tomoto
- 방식으로 텍스트
- oracle
- lda
- 네이버뉴스
- word2vec
- 크롤링
Archives
- Today
- Total
무회blog
python: # python 200623-yoyag_test_008-005 본문
In [1]:
# 200623-yoyag_test_008-005
import pandas as pd
import time, timeit, os, sys , re
from gensim.summarization import summarize
from collections import Counter
import collections
from nltk.tokenize import sent_tokenize,word_tokenize
#############################################
from datetime import datetime
import numpy as np
import nltk.stem, nltk.corpus, nltk.tokenize
from newspaper import Article
#############################################
import tomotopy as tp
#############################################
from gensim import corpora
from gensim import models
from konlpy.utils import pprint
from kiwipiepy import Kiwi
from konlpy.tag import Hannanum
hannanum = Hannanum()
kiwi = Kiwi()
kiwi.prepare()
#############################################
from string import punctuation
from heapq import nlargest
In [2]:
def resultReturn(text):
hangul = re.compile('[가-힣]+\.') # 한글로 포함되다 .
result = hangul.findall(text) # 정규식에 일치되는 부분을 리스트 형태로 저장, 단어 반환
result = list(set(result))
for x in result:
# text = text.replace(x, x + ' \n')
text = text.replace(x, x + ' ')
return text
In [3]:
def text_cleaning(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,' ')
################################## gensim 사용을 위한 정규표현식 200624
hangul = re.compile('[가-힣]+\.') # 한글 + .(점)
result = hangul.findall(text) # 정규식에 일치되는 부분을 리스트 형태로 저장
result = list(set(result)) # 중복제거후 list 로 반환
for x in result:
text = text.replace(x, x + ' ')
text = re.sub('\[.+?\]','', text) # 대괄호 [] 이내 모든 문자 삭제
################################## gensim 사용을 위한 정규표현식 200624
#특수문자 제거 후 생기는 중복된 공백 제거
while text.find(' ') > 0:
text = text.replace(' ',' ' ) # 중복된 공백 제거
#특수문자 제거 후 생기는 중복된 개행 제거
while text.find('\n\n') > 0:
text = text.replace('\n\n','\n' ) # 중복된 개행 제거
# .텍스트 -> ".텍스트" -> ". 텍스트"
#좌우측 공백 삭제
text = text.strip()
# 좌측 공백 삭제
# text.lstrip()
# 우측 공백 삭제
#text.rstrip()
return text
In [4]:
def textSummerFunc():
# punctuation는 [, ], ? 등 기호 리스트 이다.
STOPWORDS = list(punctuation)
#문장에 나타나는 단어의 빈도 중 최소, 최대등 의미없는 단어를 제거하기 위한 변수
MIN_WORD_PROP, MAX_WORD_PROP = 0.1, 0.9
def compute_word_frequencies(word_sentences):
words = [word for sentence in word_sentences
for word in sentence
if word not in STOPWORDS]
counter = Counter(words)
limit = float(max(counter.values()))
word_frequencies = {word: freq/limit
for word,freq in counter.items()}
# Drop words if too common or too uncommon
word_frequencies = {word: freq
for word,freq in word_frequencies.items()
if freq > MIN_WORD_PROP
and freq < MAX_WORD_PROP}
return word_frequencies
def sentence_score(word_sentence, word_frequencies):
return sum([ word_frequencies.get(word,0)
for word in word_sentence])
def summarize(text:str, num_sentences=3):
"""
Summarize the text, by return the most relevant sentences
:text the text to summarize
:num_sentences the number of sentences to return
"""
# Make the text lowercase
text = text.lower()
# Break text into sentences
sentences = sent_tokenize(text)
# Break sentences into words
word_sentences = [word_tokenize(sentence)
for sentence in sentences]
# Compute the word frequencies
word_frequencies = compute_word_frequencies(word_sentences)
# Calculate the scores for each of the sentences
scores = [sentence_score(word_sentence, word_frequencies)
for word_sentence in word_sentences]
sentence_scores = list(zip(sentences, scores))
# Rank the sentences
top_sentence_scores = nlargest(num_sentences,
sentence_scores,
key=lambda t: t[1])
# Return the top sentences
return [t[0] for t in top_sentence_scores]
#분류 대상 파일을 읽어온다
ReadDataPd = df2.copy()
ReadDataPd=ReadDataPd.assign(summarize_word='')
counter=0
# for w in ReadDataPd['내용']:
for w in ReadDataPd['content']:
#클린징
ReadDoc_CleanText= text_cleaning(w)
#print("\nReadDoc_CleanText=",ReadDoc_CleanText[:100])
# n줄로 요약 생성
sum_res=summarize(ReadDoc_CleanText, num_sentences=3)
ReadDataPd.at[counter,'summarize_word']=sum_res
counter=counter+1
# path_to = creatFolder_in + td + '_'+ subMenu.strip() + '_' + test_bindo +'_'+ str(most_cnt) + '_textSummerFunc'+'.xlsx'
# ReadDataPd.to_excel(path_to)
return ReadDataPd
# textSummerFunc()
In [5]:
def gensim_wordSummarize(tts,tts1):
aa = []
bb = []
cc = []
li_tts = []
liwd_cnt = []
tts_cnt = 0
for i in range(len(tts)):
tts_cnt = i
len(tts[tts_cnt])
## summary_yoyag 요약 내용을 처리한다 .
ttss = ''
for i in tts[tts_cnt]:
ttss = ttss + i
## yoyag 요약 내용을 처리한다 .
ttss1 = ''
for i in tts1[tts_cnt]:
ttss1 = ttss1 + i
liwd = word_tokenize(ttss) ##### gensim 단어 토큰화
liwd = [x for x in liwd if len(x) > 2]
liwd1 = word_tokenize(ttss1) ##### naver 단어 토큰화
liwd1 = [x for x in liwd1 if len(x) > 2]
a = Counter(liwd) # a.most_common # 빈도수(frequency)가 높은 순으로 상위
b = Counter(liwd1)
c = a & b # 교집합
c = c.most_common(most_cnt) # 교집합 빈도수
if len(liwd) == 0 :
biyur = 0
else:
biyur = round(len(c)/len(liwd),2)*100
biyur = int(biyur)
biyur = str(biyur) + '%' # 네이버요약 기준 , gensim 단어 매칭 비율
## a | b # 합집합에 대한 내용
aa.append(a.most_common(3)) # 상위 몇개 빼기
bb.append(b.most_common(3))
liwd_cnt.append(biyur)
cc.append(len(c)) # 교집합 빈도수
li_tts.append(c)
# df2['요약_단어빈도교집합'] = li_tts
df2['요약단어_교집합'] = li_tts
df2['naver_단어빈도'] = aa
df2['gensim_단어빈도'] = bb
df2['단어_빈도수'] = cc
df2['빈도_비율'] = liwd_cnt
df3 = df2.copy()
df3['단어매칭율'] = pd.to_numeric(df3['빈도_비율'].str.replace('%',''))
# df3['단어매칭율'] = str(df3['단어매칭율'].mean()) + '%' # pd.options.display.float_format = '{:.2f}'.format
df3['단어매칭율'] = str(round(df3['단어매칭율'].mean(),2)) + '%'
for i in range(len(df3['요약단어_교집합'])):
if len(df3['요약단어_교집합'][i]) == 0 :
df3['요약단어_교집합'][i] = '무'
else:
pass
################################################################################################
# df3['yoyag'] = df3['yoyag'].str.replace('[가-힣]+\.{1}','.+\n', regex = True)
li_text = df3['yoyag'].tolist()
li_text2 = [resultReturn(text) for text in li_text]
df3['yoyag'] = li_text2
################################################################################################
df3 = df3[['subMenu','title','yoyag','summary_yoyag','naver_단어빈도','gensim_단어빈도','요약단어_교집합','빈도_비율','단어_빈도수','단어매칭율']]
# df3 = df3[['subMenu','title','yoyag','summary_yoyag','단어매칭율']]
# df3 = df3.sort_values(by=['단어_빈도수'], axis = 0, ascending = False) ## ascending 정렬 교집합
# df3 = df3.sort_values(by=['빈도_비율'], axis = 0, ascending = False) ## ascending 정렬 빈도율
path_to = creatFolder_in + td + '_'+ subMenu.strip() + '_' + test_bindo +'_'+ str(most_cnt)+'_gensim_wordSummarize' +'.xlsx'
df3.to_excel(path_to)
path=creatFolder_in
path=os.path.realpath(path)
os.startfile(path)
return df3
In [6]:
def summary_wordSummarize(tts,tts1):
aa = []
bb = []
cc = []
li_tts = []
liwd_cnt = []
tts_cnt = 0
for i in range(len(tts)):
tts_cnt = i
len(tts[tts_cnt])
ttss = ''
for i in tts[tts_cnt]:
ttss = ttss + i
ttss1 = ''
for i in tts1[tts_cnt]:
ttss1 = ttss1 + i
liwd = word_tokenize(ttss) ##### gensim 단어 토큰화
liwd = [x for x in liwd if len(x) > 2]
liwd1 = word_tokenize(ttss1) ##### naver 단어 토큰화
liwd1 = [x for x in liwd1 if len(x) > 2]
a = Counter(liwd) # a.most_common # 빈도수(frequency)가 높은 순으로 상위
b = Counter(liwd1)
c = a & b # 교집합
c = c.most_common(most_cnt) # 교집합 빈도수
if len(liwd) == 0 :
biyur = 0
else:
biyur = round(len(c)/len(liwd),2)*100
biyur = int(biyur)
biyur = str(biyur) + '%' # 네이버요약 기준 , gensim 단어 매칭 비율
## a | b # 합집합에 대한 내용
aa.append(a.most_common(3)) # 상위 몇개 빼기
bb.append(b.most_common(3))
liwd_cnt.append(biyur)
cc.append(len(c)) # 교집합 빈도수
li_tts.append(c)
# df2['요약_단어빈도교집합'] = li_tts
txdf['요약단어_교집합'] = li_tts
txdf['naver_단어빈도'] = aa
txdf['txdf_단어빈도'] = bb
txdf['단어_빈도수'] = cc
txdf['빈도_비율'] = liwd_cnt
df3 = txdf.copy()
df3['단어매칭율'] = pd.to_numeric(df3['빈도_비율'].str.replace('%',''))
df3['단어매칭율'] = str(df3['단어매칭율'].mean()) + '%'
df3 = df3[['subMenu','title','yoyag','naver_단어빈도','summarize_word','txdf_단어빈도','요약단어_교집합','빈도_비율','단어_빈도수','단어매칭율']]
for i in range(len(df3['요약단어_교집합'])):
if len(df3['요약단어_교집합'][i]) == 0 :
df3['요약단어_교집합'][i] = '무'
else:
pass
# df3 = df3.sort_values(by=['단어_빈도수'], axis = 0, ascending = False) ## ascending 정렬 교집합
# df3 = df3.sort_values(by=['빈도_비율'], axis = 0, ascending = False) ## ascending 정렬 빈도율
path_to = creatFolder_in + td + '_'+ subMenu.strip() + '_' + test_bindo +'_'+ str(most_cnt)+'_summary_wordSummarize' +'.xlsx'
df3.to_excel(path_to)
path=creatFolder_in
path=os.path.realpath(path)
os.startfile(path)
return df3
In [7]:
# 최종 쓰기경로찾기
path = './yoyag_test/'
checkFolder = os.path.isdir(path)
creatFolder_in = path
if checkFolder == True:
pass
else:
os.mkdir(creatFolder_in)
############ 폴더 생성 및 체크
tdd = datetime.today().strftime("%m%d")
checkFolder = os.path.isdir('./yoyag_test/'+'20'+tdd + '/')
creatFolder_in = './yoyag_test/'+'20'+tdd + '/'
if checkFolder == True:
pass
else:
os.mkdir(creatFolder_in)
# 최종 읽기경로찾기 읽기 경로
td = datetime.today().strftime("%Y%m%d") # 오늘 일자
path_dir = './news002/quanbu/'
path_list = os.listdir(path_dir)
path = path_dir + path_list[0]
In [8]:
subMenu = '' # 타겟 메뉴
sheet_cnt = 0 # 0 - 5 , 통합, 정치, 경제, 사회, 생활, 세계, it
most_cnt = 20 # 상위 교집합의 갯수 기준 테스트
test_bindo = '빈도_비율' # 빈도_비율, # 단어_빈도수 ,(교집합 테스트)
# test_bindo = '단어_빈도수' # 빈도_비율, # 단어_빈도수 ,(교집합 테스트)
# test_ratio = 0.5 # 30% 의 비율로 요약 요청
test_wordCnt = 40 # 단어수 20개로 지정 , St_wordCnt 대체로 큰 의미 없음, 파일명 지정 가능
df = pd.read_excel(path, sheet_name=sheet_cnt)
print(path)
df1 = df.copy()
df2 = df1[['subMenu','title','content','yoyag']]
##################################################################################################
li_summary = []
chk = 0
pd.set_option('mode.chained_assignment', None) # <==== 경고를 끈다
# ################################################### test001 요약단어_교집합 , gensim_단어요약 VS naver_단어요약
cnt_li = df2['content'].tolist()
subMenu = df2['subMenu'][0]
print(subMenu)
for i in cnt_li:
chk = chk + 1
output = text_cleaning(i)
# TotalWord = 단어수 세서 넣고
TotalWord = word_tokenize(output)
TotalWord_cnt = len(TotalWord)
# print(TotalWord_cnt)
# TotalLine = 스플릿 해서 넣고 # text_cleaning
TotalLine = output.replace('. ','. _').split('_') # 한글 + .(점) 기준 줄바꿈처리, 줄바꿈기준 짜르기
TotalLine_cnt = len(TotalLine)
# print(TotalLine_cnt)
# print(TotalLine)
# 문장당 단어수 = (TotalWord/TotalLine) * 3.2
St_wordCnt = (TotalWord_cnt/TotalLine_cnt) * 3.2
St_wordCnt = int(St_wordCnt)
# output = summarize(output1,ratio=St_wordCnt) ## test_ratio
output = summarize(output,word_count = St_wordCnt) ## 정제된 데이터(content)로 문장을 요약한다.
li_summary.append(output)
df2['summary_yoyag'] = pd.Series(li_summary)
df2
tts = df2['summary_yoyag'].tolist()
tts1 = df2['yoyag'].tolist()
####################################################################### test002 요약단어_교집합 , summary_단어요약 VS naver_단어요약
txdf = textSummerFunc() # summarrize 함수를 사용
tts0 = txdf['summarize_word'].tolist()
tts01 = txdf['yoyag'].tolist()
subMenu = txdf['subMenu'][0]
#######################################################################
# summary_wordSummarize(tts0,tts01)
gensim_wordSummarize(tts,tts1)
Out[8]:
In [9]:
# import re
# text = """
# [서울=뉴시스]김태년 민주당 원내대표는 24일 오전 국회에서 열린 소재·부품·장비 산업 현안점검회의에서 "법원이 전범기업에 대한 국내자산 매각 절차를 감행하면서 일본이 두 자릿수 추가 보복조치를 예고한 상태"라면서 "지금부터 가능한 시나리오를 검토하고 가능한 방안을 미리 만들어야 한다.가가가'소부장 전략 2'를 추진하겠다"고 말했다.그는 그간의 일본수출규제 대응 성과와 관련해선 "불화수소 등 수출 규제 품목에 대해선 수입 다변화를 이뤄냈고 소부장 산업정책을 체계적으로 마련해왔다"고 평가했다.aaa그러면서 "'포스트 코로나 대응을 위해서도 더욱 속도감있게 정책을 추진해야한다"면서 "바이오, 미래차 등 신산업이 발전하려면 소부장이 뒷받침돼야 한다. '한국판 뉴딜'을 위해서라도 필수적"이라고 강조했다.AAA조정식 민주당 정책위의장은 "20년 만에 전면 개정된 소부장 특별법을 차질없이 시행했고 올해 2조6000억원의 예산을 투입하고 있다"면서 "올해부터 소부장 정책이 본격 추진되는 만큼 민주당은 소부장 경쟁력 강화를 적극 진행하겠다"고 말했다"이어 "산업통상자원부는 특정국가 의존도 완화를 위한 기술자립, 첨단산업화를 해주시고 과학기술정보통신부는 소부장 연구개발(R&D) 고도화 대책을 마련해주시길 바란다"면서 "중소벤처기업부는 인력양성과 일본의 추가 보복조치시 중소기업의 피해를 최소화하기 위한 대책을 빈틈없이 마련해주시길 바란다"고 당부했다.123
# """
# # def resultReturn(text):
# # hangul = re.compile('[가-힣]+\.') # 한글로 포함되다 .
# # result = hangul.findall(text) # 정규식에 일치되는 부분을 리스트 형태로 저장, 단어 반환
# # result = list(set(result))
# # text2 = text
# # for x in result:
# # text2 = text2.replace(x, x + ' \n')
# # return text2
# # resultReturn()
# # string = 'text [text] text (text) text'
# # regex = re.compile('\(.+?\)') # 괄호 () 이내 모든 문자 삭제
# # regex = re.compile('\[.+?\]') # 대괄호 [] 이내 모든 문자 삭제
# # output = regex.sub('', string)
# text = re.sub('\[.+?\]','', text) # 대괄호 [] 이내 모든 문자 삭제
# print(text)
'Python' 카테고리의 다른 글
python: 200629-gensim_bm25-Copy1, BM25Okapi (0) | 2020.06.30 |
---|---|
200625-yoyag_test_008-006.002, 젠심 요약본뉴스 (0) | 2020.06.25 |
파이썬 정규표현식 관련, 범위지정 삭제, 수정 (0) | 2020.06.24 |
200623-파이썬_004.009_headless_결측치제거(성공) (0) | 2020.06.24 |
200623-yoyag_test_008-002, 요약테스트 (0) | 2020.06.24 |
Comments