Showing
1 changed file
with
257 additions
and
0 deletions
knu/KnuSentiLex/KNUEdit.py
0 → 100644
| 1 | +# KNU 한국어 감성사전 | ||
| 2 | +# 작성자 : 온병원, 박상민, 나철원 | ||
| 3 | +# 소속 : 군산대학교 소프트웨어융합공학과 Data Intelligence Lab | ||
| 4 | +# 홈페이지 : dilab.kunsan.ac.kr | ||
| 5 | +# 작성일 : 2018.05.14 | ||
| 6 | +# 뜻풀이 데이터 출처 : https://github.com/mrchypark/stdkor | ||
| 7 | +# 신조어 데이터 출처 : https://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EC%9D%B8%ED%84%B0%EB%84%B7_%EC%8B%A0%EC%A1%B0%EC%96%B4_%EB%AA%A9%EB%A1%9D | ||
| 8 | +# 이모티콘 데이터 출처: https://ko.wikipedia.org/wiki/%EC%9D%B4%EB%AA%A8%ED%8B%B0%EC%BD%98 | ||
| 9 | +# SentiWordNet_3.0.0_20130122 데이터 출처 : http://sentiwordnet.isti.cnr.it/ | ||
| 10 | +# SenticNet-5.0 데이터 출처 : http://sentic.net/ | ||
| 11 | +# 감정단어사전0603 데이터 출처 : http://datascience.khu.ac.kr/board/bbs/board.php?bo_table=05_01&wr_id=91 | ||
| 12 | +# 김은영, “국어 감정동사 연구”, 2004.02, 학위논문(박사) - 전남대학교 국어국문학과 대학원 | ||
| 13 | + | ||
| 14 | +#-*-coding:utf-8-*- | ||
| 15 | +import collections | ||
| 16 | +import json | ||
| 17 | + | ||
| 18 | +import warnings | ||
| 19 | +warnings.simplefilter(("ignore")) | ||
| 20 | +import openpyxl | ||
| 21 | +import pandas as pd | ||
| 22 | +import re | ||
| 23 | +from datetime import datetime | ||
| 24 | + | ||
| 25 | +############종목 감성 판단 ex)hmm뉴스키워드.xlsx 파일 넣는 과정 | ||
| 26 | +class KnuSL(): | ||
| 27 | + | ||
| 28 | + def data_list(wordname): | ||
| 29 | + with open('KnuSentiLex/data/SentiWord_info.json', encoding='utf-8-sig', mode='r') as f: | ||
| 30 | + data = json.load(f) | ||
| 31 | + result = [0,0] | ||
| 32 | + | ||
| 33 | + for i in range(0, len(data)): | ||
| 34 | + if data[i]['word'] == wordname: | ||
| 35 | + result.pop() | ||
| 36 | + result.pop() | ||
| 37 | + result.append(data[i]['word_root']) | ||
| 38 | + result.append(int(data[i]['polarity'])) | ||
| 39 | + | ||
| 40 | + r_word = result[0] #어근 | ||
| 41 | + s_word = result[1] #극성 | ||
| 42 | + | ||
| 43 | + return s_word | ||
| 44 | + | ||
| 45 | +if __name__ == "__main__": | ||
| 46 | + | ||
| 47 | + ksl = KnuSL | ||
| 48 | + | ||
| 49 | + print("\nKNU 한국어 감성사전입니다~ :)") | ||
| 50 | + print("사전에 단어가 없는 경우 결과가 None으로 나타납니다!!!") | ||
| 51 | + print("종료하시려면 #을 입력해주세요!!!") | ||
| 52 | + print("-2:매우 부정, -1:부정, 0:중립 or Unkwon, 1:긍정, 2:매우 긍정") | ||
| 53 | + print("\n") | ||
| 54 | +######### | ||
| 55 | +Newsfilefolder = input("종목폴더입력: ") | ||
| 56 | +Newsfilename=input("파일이름입력:") | ||
| 57 | +Newsfilepos = "C:/Users/yangj/PycharmProjects/pythonProject1/뉴스키워드/"+Newsfilefolder+"/" + Newsfilename + ".xlsx" | ||
| 58 | +Newsfile = openpyxl.load_workbook(Newsfilepos)#파일이름입력 | ||
| 59 | +ws=Newsfile.active | ||
| 60 | +data=[] | ||
| 61 | +date=[] | ||
| 62 | +i=0 | ||
| 63 | +for row in ws.rows: | ||
| 64 | + data.append([]) | ||
| 65 | + date.append(row[1].value) | ||
| 66 | + for cell in row: | ||
| 67 | + if cell.value != None: | ||
| 68 | + data[i].append(cell.value) | ||
| 69 | + i += 1 | ||
| 70 | +del data[0] #첫번째 의미없는 열 삭제 | ||
| 71 | +del date[0] | ||
| 72 | +for i in range(len(data)): | ||
| 73 | + del data[i][0] #각 열의 첫번째 행 삭제 | ||
| 74 | +for i in range(len(data)): | ||
| 75 | + del data[i][0] #각 열의 날짜 행 삭제 | ||
| 76 | + | ||
| 77 | +KNUdata=[] | ||
| 78 | +Tdata=[] | ||
| 79 | + | ||
| 80 | +for x in range(len(data)): | ||
| 81 | + KNUdata.append([]) | ||
| 82 | + Tdata.append([]) | ||
| 83 | + for y in range(len(data[x])): | ||
| 84 | + KNUdata[x].append(ksl.data_list(data[x][y])) | ||
| 85 | + Tdata[x].append([data[x][y], KNUdata[x][y]]) | ||
| 86 | + | ||
| 87 | +result = { '날짜':date, '단어, 극성':Tdata } | ||
| 88 | + | ||
| 89 | +df = pd.DataFrame(result) | ||
| 90 | +#print(df) | ||
| 91 | +list_df=df.values.tolist() #dataframe list로 변경 | ||
| 92 | +#print(list_df) | ||
| 93 | +#print(list_df[0][0]) 날짜 2021.01.01. | ||
| 94 | + | ||
| 95 | +new_date = [] # 날짜 중복 삭제 | ||
| 96 | +for v in date: | ||
| 97 | + if v not in new_date: | ||
| 98 | + new_date.append(v) | ||
| 99 | +#print(new_date) | ||
| 100 | + | ||
| 101 | +Setlist =[]# 날짜별 키워드 넣기 | ||
| 102 | +for v in range(len(new_date)): | ||
| 103 | + Setlist.append([]) | ||
| 104 | + Setlist[v].append(new_date[v]) | ||
| 105 | + for i in range(len(list_df)): | ||
| 106 | + for j in range(len(list_df[i][1])): | ||
| 107 | + if new_date[v] == list_df[i][0]: | ||
| 108 | + Setlist[v].append(list_df[i][1][j]) | ||
| 109 | +print(Setlist) | ||
| 110 | +print(Setlist[0][0]) #2021.01.01 | ||
| 111 | +print(type(Setlist[0][0])) | ||
| 112 | +print(Setlist[0][0].split('-')) | ||
| 113 | +print(Setlist[0][1][1]) #극성 0 | ||
| 114 | +print(type(Setlist[0][1][1])) #극성 모든 타입 int | ||
| 115 | + | ||
| 116 | +#print(list_df[0][1][0]) 키워드와 극성 ['HMM…"체질개선해', 'X'] | ||
| 117 | +#print(list_df[0][1][0][1]) 극성 x | ||
| 118 | +#print(list_df[0][0].split('.')[:3]) ['2021', '01', '01'] | ||
| 119 | +#df.to_excel(Newsfilename+' KNU.xlsx',sheet_name='sheet1') | ||
| 120 | + | ||
| 121 | +Stockfilefolder = input("종목시세폴더입력: ") | ||
| 122 | +Stockfilename=input("시세파일이름입력:") | ||
| 123 | +fileStock = "C:/Users/yangj/PycharmProjects/pythonProject1/종목별시세/"+Stockfilefolder+"/" + Stockfilename + ".xlsx" | ||
| 124 | +Stockfile = openpyxl.load_workbook(fileStock)#파일이름입력 | ||
| 125 | +stock_ws=Stockfile.active | ||
| 126 | +Stock_data=[] #list 타입 | ||
| 127 | +i=0 | ||
| 128 | +for row in stock_ws.rows: | ||
| 129 | + Stock_data.append([]) | ||
| 130 | + for cell in row: | ||
| 131 | + if cell.value != None: | ||
| 132 | + Stock_data[i].append(cell.value) | ||
| 133 | + i += 1 | ||
| 134 | +del Stock_data[0] | ||
| 135 | +for i in range(len(Stock_data)): | ||
| 136 | + del Stock_data[i][2] # 대비 삭제 | ||
| 137 | +for i in range(len(Stock_data)): | ||
| 138 | + del Stock_data[i][7] #거래대금 삭제 | ||
| 139 | +for i in range(len(Stock_data)): | ||
| 140 | + del Stock_data[i][7] #시가 총액 삭제 | ||
| 141 | +for i in range(len(Stock_data)): | ||
| 142 | + del Stock_data[i][7] #상장주식 수 삭제 / 결과:'일자', '종가', '등락률', '시가', '고가', '저가', '거래량' | ||
| 143 | +#print(Stock_data) | ||
| 144 | + | ||
| 145 | +def Calpercentage(a,b): #시초가 대비 고점/저점 비율 | ||
| 146 | + return abs(a-b)/a*100 | ||
| 147 | +####아래로 수정 필요 (미완성)#### | ||
| 148 | + | ||
| 149 | +i=0 | ||
| 150 | +for k in range(len(Setlist)): | ||
| 151 | + if( Stock_data[i][0].split('/') == Setlist[k][0].split('-')): # 날짜 비교 날짜가 같다면 | ||
| 152 | + if Calpercentage(Stock_data[i][3],Stock_data[i][4]) > 2 : #당일 시가 대비 고가가 2퍼 높을때 | ||
| 153 | + for j in range(1,len(Setlist[k])): | ||
| 154 | + if Setlist[k][j][1] == 0: | ||
| 155 | + Setlist[k][j][1] = 1 | ||
| 156 | + else: | ||
| 157 | + Setlist[0][j][1] += 1 | ||
| 158 | + elif Calpercentage(Stock_data[i][3],Stock_data[i][5]) < -2 : #당일 시가 대비 저가가 2퍼 낮을 때 | ||
| 159 | + for j in range(1,len(Setlist[k])): | ||
| 160 | + if Setlist[k][j][1] == 0: | ||
| 161 | + Setlist[k][j][1] = -1 | ||
| 162 | + else: | ||
| 163 | + Setlist[0][j][1] -= 1 | ||
| 164 | + else: | ||
| 165 | + if Stock_data[i+1][2] > 0: # 다음날 주가 등락률이 양수면 | ||
| 166 | + for j in range(1,len(Setlist[k])): #어제뉴스는 호재 취급 | ||
| 167 | + if Setlist[k][j][1] == 0: | ||
| 168 | + Setlist[k][j][1] = 1 | ||
| 169 | + else: | ||
| 170 | + Setlist[k][j][1] += 1 | ||
| 171 | + elif Stock_data[i+1][2] < 0: | ||
| 172 | + for j in range(1,len(Setlist[k])): # 음수면 어제 뉴스는 악재 취급 | ||
| 173 | + if Setlist[k][j][1] == 0: | ||
| 174 | + Setlist[k][j][1] = -1 | ||
| 175 | + else: | ||
| 176 | + Setlist[k][j][1] -= 1 | ||
| 177 | + i+=1 | ||
| 178 | + else: | ||
| 179 | + if Calpercentage(Stock_data[i][3], Stock_data[i][4]) > 2: # 당일 시가 대비 고가가 2퍼 높을때 | ||
| 180 | + for j in range(1, len(Setlist[k])): | ||
| 181 | + if Setlist[k][j][1] == 0: | ||
| 182 | + Setlist[k][j][1] = 1 | ||
| 183 | + else: | ||
| 184 | + Setlist[k][j][1] += 1 | ||
| 185 | + elif Calpercentage(Stock_data[i][3], Stock_data[i][5]) < -2: # 당일 시가 대비 저가가 2퍼 낮을 때 | ||
| 186 | + for j in range(1, len(Setlist[k])): | ||
| 187 | + if Setlist[k][j][1] == 0: | ||
| 188 | + Setlist[k][j][1] = -1 | ||
| 189 | + else: | ||
| 190 | + Setlist[k][j][1] -= 1 | ||
| 191 | + else: | ||
| 192 | + if Stock_data[i + 1][2] > 0: # 다음날 주가 등락률이 양수면 | ||
| 193 | + for j in range(1, len(Setlist[k])): # 어제뉴스는 호재 취급 | ||
| 194 | + if Setlist[k][j][1] == 0: | ||
| 195 | + Setlist[k][j][1] = 1 | ||
| 196 | + else: | ||
| 197 | + Setlist[k][j][1] += 1 | ||
| 198 | + elif Stock_data[i + 1][2] < 0: | ||
| 199 | + for j in range(1, len(Setlist[k])): # 음수면 어제 뉴스는 악재 취급 | ||
| 200 | + if Setlist[k][j][1] == 0: | ||
| 201 | + Setlist[k][j][1] = -1 | ||
| 202 | + else: | ||
| 203 | + Setlist[k][j][1] -= 1 | ||
| 204 | + i+=1 #<이거 삭제서 hmm한번 더 돌려보기 | ||
| 205 | + | ||
| 206 | +print(Setlist) | ||
| 207 | + | ||
| 208 | +#df_Setlist = pd.DataFrame(Setlist) | ||
| 209 | +#df_Setlist.to_excel(Stockfilename+' KNU_New.xlsx',sheet_name='sheet1') | ||
| 210 | + | ||
| 211 | +Setlist_w = [] | ||
| 212 | +for i in range(len(Setlist)): | ||
| 213 | + Setlist_w.append([]) | ||
| 214 | + for j in range(1, len(Setlist[i])): | ||
| 215 | + Setlist_w[i].append(Setlist[i][j][0]) # 극성 제외 단어만 추출 | ||
| 216 | + | ||
| 217 | +counter = {} | ||
| 218 | +for i in range(len(Setlist_w)): | ||
| 219 | + counter[i] = collections.Counter(Setlist_w[i]) # 누적치 | ||
| 220 | + | ||
| 221 | +for i in range(len(Setlist_w)): | ||
| 222 | + Setlist_w[i] = list(zip(counter[i].keys(), counter[i].values())) # 튜플 리스트화 [(값, 값)] | ||
| 223 | + | ||
| 224 | +Plist = [] | ||
| 225 | +for i in range(len(Setlist_w)): | ||
| 226 | + Plist.append([]) | ||
| 227 | + for j in range(len(Setlist_w[i])): | ||
| 228 | + Plist[i].append(list(Setlist_w[i][j])) # 튜플 -> 리스트화 [[값, 값]] | ||
| 229 | + | ||
| 230 | +for i in range(len(Plist)): | ||
| 231 | + for j in range(len(Plist[i])): | ||
| 232 | + Plist[i][j][1] = 0 # 극성 0으로 초기화 | ||
| 233 | + | ||
| 234 | +for i in range(len(Setlist)): | ||
| 235 | + for j in range(1, len(Setlist[i])): | ||
| 236 | + for h in range(len(Plist[i])): | ||
| 237 | + if Setlist[i][j][0] == Plist[i][h][0]: | ||
| 238 | + Plist[i][h][1] += Setlist[i][j][1] #누적치 | ||
| 239 | +vert_p=[] #수직 중복 삭제 | ||
| 240 | +for i in range(len(Plist)): | ||
| 241 | + for j in range(len(Plist[i])): | ||
| 242 | + vert_p.append(Plist[i][j]) #단어만 넣기 | ||
| 243 | +#print(vert_p) | ||
| 244 | +vert_p.sort(key=lambda x:x[0]) #단어 기준으로 정렬 | ||
| 245 | +for i in range(len(vert_p)-2): #단어 비교해서 같으면 누적 다르면 값 바꾸기 | ||
| 246 | + for j in range(i+1,len(vert_p)): | ||
| 247 | + if vert_p[i][0] == vert_p[j][0]: | ||
| 248 | + vert_p[i][1]+=vert_p[j][1] | ||
| 249 | + vert_p[j]=['0',0] | ||
| 250 | +print(vert_p) | ||
| 251 | +vert_p=[i for i in vert_p if not '0' in i] #'0'들어간 열 제거 | ||
| 252 | +df_ver= pd.DataFrame(vert_p) | ||
| 253 | +df_ver.to_excel(Stockfilename+' KNU_New_Vdic2.xlsx',sheet_name='sheet1') | ||
| 254 | + | ||
| 255 | +####키워드파일 월별로 돌려서 그 나온 결과 파일들을 합쳐서 Merge_dictionay.py에 넣어서 사전 만들기 #### | ||
| 256 | + | ||
| 257 | + |
-
Please register or login to post a comment