양지수

KNU for company

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 +