SH

final

Showing 59 changed files with 1415 additions and 0 deletions
1 +# **뉴스 키워드 노출 빈도수에 따른 기업 주가 영향 분석**
2 +---------------------------------------------------
3 +----------------------------------------------------
4 +
5 +
6 +## **지도교수님**
7 +* 한치근 교수님
8 +
9 +## **팀원**
10 +* 2017104003 컴퓨터공학과 양지수
11 +* 2017104039 컴퓨터공학과 한서흔
12 +
13 +---
14 +
15 +## **개발일정**
16 +* 2021.03.09~2021.03.22 데이터 수집
17 +* 2021.03.23~2021.04.19 자연어 처리,중간보고서 작성
18 +* 2021.04.20~2021.05.04 감성사전 분석 및 특화 사전 제작
19 +* 2021.05.05~ 중심성 분석 및 최종 결과 제작
1 +<component name="InspectionProjectProfileManager">
2 + <settings>
3 + <option name="USE_PROJECT_PROFILE" value="false" />
4 + <version value="1.0" />
5 + </settings>
6 +</component>
...\ No newline at end of file ...\ No newline at end of file
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<module type="PYTHON_MODULE" version="4">
3 + <component name="NewModuleRootManager">
4 + <content url="file://$MODULE_DIR$" />
5 + <orderEntry type="inheritedJdk" />
6 + <orderEntry type="sourceFolder" forTests="false" />
7 + </component>
8 +</module>
...\ No newline at end of file ...\ No newline at end of file
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<project version="4">
3 + <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7" project-jdk-type="Python SDK" />
4 +</project>
...\ No newline at end of file ...\ No newline at end of file
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<project version="4">
3 + <component name="ProjectModuleManager">
4 + <modules>
5 + <module fileurl="file://$PROJECT_DIR$/.idea/knu.iml" filepath="$PROJECT_DIR$/.idea/knu.iml" />
6 + </modules>
7 + </component>
8 +</project>
...\ No newline at end of file ...\ No newline at end of file
1 +<?xml version="1.0" encoding="UTF-8"?>
2 +<project version="4">
3 + <component name="VcsDirectoryMappings">
4 + <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
5 + <mapping directory="$PROJECT_DIR$/KnuSentiLex" vcs="Git" />
6 + </component>
7 +</project>
...\ No newline at end of file ...\ No newline at end of file
This diff is collapsed. Click to expand it.
1 +import warnings
2 +
3 +warnings.simplefilter(("ignore"))
4 +import openpyxl
5 +import pandas as pd
6 +
7 +#######Gephi에 사용할 edge파일 만들기 전에 필요한 자료 만드는 과정
8 +####6개월치 키워드 합친 키워드 파일 넣기
9 +
10 +Stockfilename = input("키워드파일이름입력:")
11 +fileStock = "C:/Users/yangj/PycharmProjects/pythonProject1/" + Stockfilename + ".xlsx"
12 +Stockfile = openpyxl.load_workbook(fileStock) # 파일이름입력
13 +stock_ws = Stockfile.active
14 +Stock_data = [] # list 타입
15 +date=[]
16 +i = 0
17 +for row in stock_ws.rows:
18 + Stock_data.append([])
19 + date.append(row[1].value)
20 + for cell in row:
21 + if cell.value != None:
22 + Stock_data[i].append(cell.value)
23 + i += 1
24 +del Stock_data[0] #첫번째 의미없는 열 삭제
25 +del date[0]
26 +for i in range(len(Stock_data)):
27 + del Stock_data[i][0] #각 열의 첫번째 행 삭제
28 +for i in range(len(Stock_data)):
29 + del Stock_data[i][0] #각 열의 날짜 행 삭제
30 +
31 +
32 +Tdata=[]
33 +
34 +for x in range(len(Stock_data)):
35 + Tdata.append([])
36 + for y in range(len(Stock_data[x])):
37 + if str.isalnum(Stock_data[x][y]) == True:
38 + Tdata[x].append(Stock_data[x][y])
39 +
40 +result = { '날짜':date, '단어':Tdata }
41 +
42 +df = pd.DataFrame(result)
43 +#print(df)
44 +list_df=df.values.tolist() #dataframe list로 변경
45 +print(list_df)
46 +#print(list_df[0][0]) 날짜 2021.01.01.
47 +
48 +new_date = [] # 날짜 중복 삭제
49 +for v in date:
50 + if v not in new_date:
51 + new_date.append(v)
52 +#print(new_date)
53 +
54 +Setlist =[]# 날짜별 키워드 넣기
55 +for v in range(len(new_date)):
56 + Setlist.append([])
57 + Setlist[v].append(new_date[v])
58 + for i in range(len(list_df)):
59 + for j in range(len(list_df[i][1])):
60 + if new_date[v] == list_df[i][0] :
61 + Setlist[v].append(list_df[i][1][j])
62 +print(Setlist)
63 +df_ver= pd.DataFrame(Setlist)
64 +df_ver.to_excel(Stockfilename+' 날짜뉴스모으고특수삭제.xlsx',sheet_name='sheet1')
65 +SourceTarget=[]
66 +for i in range(len(list_df)):
67 + SourceTarget.append([])
68 + for j in range(len(list_df[i][1])-1):
69 + SourceTarget.append([list_df[i][0],list_df[i][1][j],list_df[i][1][j+1],1])
70 +print(SourceTarget)
71 +SourceTarget = [v for v in SourceTarget if v]
72 +df_SourTar = pd.DataFrame(SourceTarget)
73 +#df_SourTar.to_excel(Stockfilename+'Edge3.xlsx',sheet_name='sheet1')
...\ No newline at end of file ...\ No newline at end of file
1 +import warnings
2 +#########5/23일작성중 #########
3 +warnings.simplefilter(("ignore"))
4 +import openpyxl
5 +import pandas as pd
6 +
7 +####### [날짜, 뉴스단어 한개] 구성 만드는 파일 차트 분석 시 count함수 이욜 할 때 참조 자료
8 +# ex)hmm뉴스키워드날짜뉴스모으고특수삭제.xlsx 파일 넣음<- DayNewsMerge.py 중간에 주석처리 된 부분 해제하고 결과 얻기
9 +Stockfilename = input("키워드파일이름입력:")
10 +fileStock = "C:/Users/yangj/PycharmProjects/pythonProject1/샘플/" + Stockfilename + ".xlsx"
11 +Stockfile = openpyxl.load_workbook(fileStock) # 파일이름입력
12 +stock_ws = Stockfile.active
13 +Stock_data = [] # list 타입
14 +date=[]
15 +i = 0
16 +for row in stock_ws.rows:
17 + Stock_data.append([])
18 + date.append(row[1].value)
19 + for cell in row:
20 + if cell.value != None :
21 + Stock_data[i].append(cell.value)
22 + i += 1
23 +del Stock_data[0]
24 +del date[0]
25 +for i in range(len(Stock_data)):
26 + del Stock_data[i][0] #각 열의 첫번째 행 삭제
27 +for i in range(len(Stock_data)):
28 + del Stock_data[i][0] #각 열의 첫번째 행 삭제
29 +print(Stock_data)
30 +print(date)
31 +a=[] #
32 +print(len(date),len(Stock_data))
33 +for j in range(len(Stock_data)):
34 + for k in range(len(Stock_data[j])):
35 + a.append([date[j],Stock_data[j][k]])
36 +print(a)
37 +df_SourTar = pd.DataFrame(a)
38 +df_SourTar.to_excel(Stockfilename+'countif.xlsx',sheet_name='sheet1')
...\ No newline at end of file ...\ No newline at end of file
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('.')[:3]): # 날짜 비교 날짜가 같다면
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[k][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[k][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 +
179 + else:
180 + if Calpercentage(Stock_data[i][3], Stock_data[i][4]) > 2: # 당일 시가 대비 고가가 2퍼 높을때
181 + for j in range(1, len(Setlist[k])):
182 + if Setlist[k][j][1] == 0:
183 + Setlist[k][j][1] = 1
184 + else:
185 + Setlist[k][j][1] += 1
186 + elif Calpercentage(Stock_data[i][3], Stock_data[i][5]) < -2: # 당일 시가 대비 저가가 2퍼 낮을 때
187 + for j in range(1, len(Setlist[k])):
188 + if Setlist[k][j][1] == 0:
189 + Setlist[k][j][1] = -1
190 + else:
191 + Setlist[k][j][1] -= 1
192 + else:
193 + if Stock_data[i + 1][2] > 0: # 다음날 주가 등락률이 양수면
194 + for j in range(1, len(Setlist[k])): # 어제뉴스는 호재 취급
195 + if Setlist[k][j][1] == 0:
196 + Setlist[k][j][1] = 1
197 + else:
198 + Setlist[k][j][1] += 1
199 + elif Stock_data[i + 1][2] < 0:
200 + for j in range(1, len(Setlist[k])): # 음수면 어제 뉴스는 악재 취급
201 + if Setlist[k][j][1] == 0:
202 + Setlist[k][j][1] = -1
203 + else:
204 + Setlist[k][j][1] -= 1
205 +
206 + i += 1
207 + #<이거 삭제서 hmm한번 더 돌려보기
208 +
209 +print(Setlist)
210 +
211 +#df_Setlist = pd.DataFrame(Setlist)
212 +#df_Setlist.to_excel(Stockfilename+' KNU_New.xlsx',sheet_name='sheet1')
213 +
214 +Setlist_w = []
215 +for i in range(len(Setlist)):
216 + Setlist_w.append([])
217 + for j in range(1, len(Setlist[i])):
218 + Setlist_w[i].append(Setlist[i][j][0]) # 극성 제외 단어만 추출
219 +
220 +counter = {}
221 +for i in range(len(Setlist_w)):
222 + counter[i] = collections.Counter(Setlist_w[i]) # 누적치
223 +
224 +for i in range(len(Setlist_w)):
225 + Setlist_w[i] = list(zip(counter[i].keys(), counter[i].values())) # 튜플 리스트화 [(값, 값)]
226 +
227 +Plist = []
228 +for i in range(len(Setlist_w)):
229 + Plist.append([])
230 + for j in range(len(Setlist_w[i])):
231 + Plist[i].append(list(Setlist_w[i][j])) # 튜플 -> 리스트화 [[값, 값]]
232 +
233 +for i in range(len(Plist)):
234 + for j in range(len(Plist[i])):
235 + Plist[i][j][1] = 0 # 극성 0으로 초기화
236 +
237 +for i in range(len(Setlist)):
238 + for j in range(1, len(Setlist[i])):
239 + for h in range(len(Plist[i])):
240 + if Setlist[i][j][0] == Plist[i][h][0]:
241 + Plist[i][h][1] += Setlist[i][j][1] #누적치
242 +vert_p=[] #수직 중복 삭제
243 +for i in range(len(Plist)):
244 + for j in range(len(Plist[i])):
245 + vert_p.append(Plist[i][j]) #단어만 넣기
246 +#print(vert_p)
247 +vert_p.sort(key=lambda x:x[0]) #단어 기준으로 정렬
248 +for i in range(len(vert_p)-2): #단어 비교해서 같으면 누적 다르면 값 바꾸기
249 + for j in range(i+1,len(vert_p)):
250 + if vert_p[i][0] == vert_p[j][0]:
251 + vert_p[i][1]+=vert_p[j][1]
252 + vert_p[j]=['0',0]
253 +print(vert_p)
254 +vert_p=[i for i in vert_p if not '0' in i] #'0'들어간 열 제거
255 +df_ver= pd.DataFrame(vert_p)
256 +df_ver.to_excel(Stockfilename+' KNU_New_Vdic2.xlsx',sheet_name='sheet1')
257 +
258 +####키워드파일 월별로 돌려서 그 나온 결과 파일들을 합쳐서 Merge_dictionay.py에 넣어서 사전 만들기 ####
259 +
260 +
1 +KNU 한국어 감성사전
2 +
3 +
4 +작성자 : 온병원, 박상민, 나철원
5 +작성일 : 2018.05.11
6 +소속 : 군산대학교 소프트웨어융합공학과 Data Intelligence Lab
7 +홈페이지 : http://dilab.kunsan.ac.kr/
8 +
9 +
10 +<> 개요
11 +- 음식, 여행지, 영화, 음악, 자동차, 스마트폰, 강의, 컴퓨터 등 특정 도메인에서 사용되는 긍부정어보다는 인간의 보편적인 기본 감정 표현을 나타내는 긍부정어로 구성된다. 보편적인 긍정 표현으로는 ‘감동받다’, ‘가치 있다’, ‘감사하다’와 보편적인 부정 표현으로는 ‘그저 그렇다’, ‘도저히 ~수 없다’, ‘열 받다’ 등을 둘 수 있다.
12 +- 각 도메인의 감성사전을 빠르게 구축하기 위한 기초 자료로 활용하기 위해 개발되었음
13 +- 본 한국어 감성사전은 다음과 같은 소스로부터 통합되어 개발되었음
14 + (1) 국립국어원 표준국어대사전의 뜻풀이(glosses) 분석을 통한 긍부정 추출(이 방법을 통해 대부분의 긍부정어 추출)
15 + (2) 김은영(2004)의 긍부정어 목록
16 + (3) SentiWordNet 및 SenticNet-5.0에서 주로 사용되는 긍부정어 번역
17 + (4) 최근 온라인에서 많이 사용되는 축약어 및 긍부정 이모티콘 목록
18 +- 총 14,843개의 1-gram, 2-gram, 관용구, 문형, 축약어, 이모티콘 등에 대한 긍정, 중립, 부정 판별 및 정도(degree)값 계산
19 +
20 +
21 +<> 특징
22 +- 표준국어대사전을 구성하는 각 단어의 뜻풀이를 분석하여 긍부정어를 추출하였음
23 +- 1-gram, 2-gram, n-gram(어구, 문형), 축약어, 이모티콘 등의 다양한 종류의 긍부정어 포함
24 +- 영화, 음악, 자동차 등 어떤 도메인에도 사용될 수 있는 보편적인 긍부정어로 구성
25 +
26 +
27 +<> 한국어 감성사전 개발 방법
28 +- 표준국어대사전을 구성하는 형용사, 부사, 동사, 명사의 모든 뜻풀이에 대한 긍정, 중립, 부정으로 분류하기 위해 Bi-LSTM 딥 러닝 모델 사용
29 +- Bi-LSTM 모델은 각 뜻풀이의 확률 값을 계산하여 최종적으로 300,000개에 달하는 뜻풀이를 긍정, 중립, 부정으로 분류하며, 긍정으로 분류된 뜻풀이 그룹에서 top-2500 긍정어 추출하며, 비슷한 방식으로 top-2500 부정어 추출 (상위 2,500개의 뜻풀이만을 대상으로 긍부정어를 찾는 이유는 2,500개 이상 넘어가면 기추출된 긍부정어들이 반복적으로 추출되기 때문)
30 +- 최소 3명의 평가자들이 각 단어의 긍정, 중립, 부정을 판별하고, 이의가 있을 경우 토론을 통해 합의를 이루는 방식 사용 (voting 방식)
31 +- 각 단어의 긍부정 판별은 (1) 매우 부정 (2) 부정 (3) 중립 (4) 긍정 (5) 매우 긍정 등 리커트 척도를 이용하여 평가자들의 합의를 통해 선택
32 +
33 +
34 +<> 긍부정어 통계
35 +-----------------------
36 + 긍부정어 : 단어개수
37 +-----------------------
38 + 1-gram 긍부정어 : 6,223
39 + 2-gram 긍부정어 : 7,861
40 + 긍부정 어구 : 278
41 + 긍부정 문형 : 253
42 + 긍부정 축약어 : 174
43 + 긍부정 이모티콘 : 54
44 +-----------------------
45 + 1-gram 긍부정어 : 6,451
46 + 2-gram 긍부정어 : 8,135
47 + 3-gram 긍부정어 : 226
48 + 4-gram 긍부정어 : 20
49 + 5-gram 긍부정어 : 5
50 + 6-gram 긍부정어 : 3
51 + 7-gram 긍부정어 : 2
52 + 8-gram 긍부정어 : 1
53 +-----------------------
54 + 매우 긍정 : 2,597
55 + 긍 정 : 2,266
56 + 중 립 : 154
57 + 부 정 : 5,029
58 + 매우 부정 : 4,797
59 +
60 +
61 +<> 사용 방법
62 +- knusl.py파일 실행
63 +- 단어 입력을 통해 해당 단어의 행태소 및 극성 정도값 출력
64 +
65 +
66 +<> 참고문헌
67 +[1] 표준국어대사전 뜻풀이, https://github.com/mrchypark/stdkor
68 +[2] 긍부정 축약어, 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
69 +[3] 긍부정 이모티콘, https://ko.wikipedia.org/wiki/%EC%9D%B4%EB%AA%A8%ED%8B%B0%EC%BD%98
70 +[4] SentiWordNet_3.0.0_20130122, http://sentiwordnet.isti.cnr.it/
71 +[5] SenticNet-5.0, http://sentic.net/
72 +[6] 감정단어사전0603, http://datascience.khu.ac.kr/board/bbs/board.php?bo_table=05_01&wr_id=91
73 +[7] 김은영, “국어 감정동사 연구”, 2004.02, 학위논문(박사) - 전남대학교 국어국문학과 대학원
74 +[8] 트위터 형태소 분석기, https://github.com/twitter/twitter-korean-text
...\ No newline at end of file ...\ No newline at end of file
1 +KNU 한국어 감성사전
2 +
3 +
4 +작성자 : 온병원, 박상민, 나철원
5 +작성일 : 2018.05.11
6 +소속 : 군산대학교 소프트웨어융합공학과 Data Intelligence Lab
7 +홈페이지 : http://dilab.kunsan.ac.kr/
8 +
9 +
10 +<> 개요
11 +- 음식, 여행지, 영화, 음악, 자동차, 스마트폰, 강의, 컴퓨터 등 특정 도메인에서 사용되는 긍부정어보다는 인간의 보편적인 기본 감정 표현을 나타내는 긍부정어로 구성된다. 보편적인 긍정 표현으로는 ‘감동받다’, ‘가치 있다’, ‘감사하다’와 보편적인 부정 표현으로는 ‘그저 그렇다’, ‘도저히 ~수 없다’, ‘열 받다’ 등을 둘 수 있다.
12 +- 각 도메인의 감성사전을 빠르게 구축하기 위한 기초 자료로 활용하기 위해 개발되었음
13 +- 본 한국어 감성사전은 다음과 같은 소스로부터 통합되어 개발되었음
14 + (1) 국립국어원 표준국어대사전의 뜻풀이(glosses) 분석을 통한 긍부정 추출(이 방법을 통해 대부분의 긍부정어 추출)
15 + (2) 김은영(2004)의 긍부정어 목록
16 + (3) SentiWordNet 및 SenticNet-5.0에서 주로 사용되는 긍부정어 번역
17 + (4) 최근 온라인에서 많이 사용되는 축약어 및 긍부정 이모티콘 목록
18 +- 총 14,843개의 1-gram, 2-gram, 관용구, 문형, 축약어, 이모티콘 등에 대한 긍정, 중립, 부정 판별 및 정도(degree)값 계산
19 +
20 +
21 +<> 특징
22 +- 표준국어대사전을 구성하는 각 단어의 뜻풀이를 분석하여 긍부정어를 추출하였음
23 +- 1-gram, 2-gram, n-gram(어구, 문형), 축약어, 이모티콘 등의 다양한 종류의 긍부정어 포함
24 +- 영화, 음악, 자동차 등 어떤 도메인에도 사용될 수 있는 보편적인 긍부정어로 구성
25 +
26 +
27 +<> 한국어 감성사전 개발 방법
28 +- 표준국어대사전을 구성하는 형용사, 부사, 동사, 명사의 모든 뜻풀이에 대한 긍정, 중립, 부정으로 분류하기 위해 Bi-LSTM 딥 러닝 모델 사용
29 +- Bi-LSTM 모델은 각 뜻풀이의 확률 값을 계산하여 최종적으로 300,000개에 달하는 뜻풀이를 긍정, 중립, 부정으로 분류하며, 긍정으로 분류된 뜻풀이 그룹에서 top-2500 긍정어 추출하며, 비슷한 방식으로 top-2500 부정어 추출 (상위 2,500개의 뜻풀이만을 대상으로 긍부정어를 찾는 이유는 2,500개 이상 넘어가면 기추출된 긍부정어들이 반복적으로 추출되기 때문)
30 +- 최소 3명의 평가자들이 각 단어의 긍정, 중립, 부정을 판별하고, 이의가 있을 경우 토론을 통해 합의를 이루는 방식 사용 (voting 방식)
31 +- 각 단어의 긍부정 판별은 (1) 매우 부정 (2) 부정 (3) 중립 (4) 긍정 (5) 매우 긍정 등 리커트 척도를 이용하여 평가자들의 합의를 통해 선택
32 +
33 +
34 +<> 긍부정어 통계
35 +---------------------------
36 + 긍부정어 : 단어개수
37 +---------------------------
38 + 1-gram 긍부정어 : 6,223
39 + 2-gram 긍부정어 : 7,861
40 + 긍부정 어구 : 278
41 + 긍부정 문형 : 253
42 + 긍부정 축약어 : 174
43 + 긍부정 이모티콘 : 54
44 +---------------------------
45 + 1-gram 긍부정어 : 6,451
46 + 2-gram 긍부정어 : 8,135
47 + 3-gram 긍부정어 : 226
48 + 4-gram 긍부정어 : 20
49 + 5-gram 긍부정어 : 5
50 + 6-gram 긍부정어 : 3
51 + 7-gram 긍부정어 : 2
52 + 8-gram 긍부정어 : 1
53 +---------------------------
54 + 매우 긍정 : 2,597
55 + 긍 정 : 2,266
56 + 중 립 : 154
57 + 부 정 : 5,029
58 + 매우 부정 : 4,797
59 +
60 +
61 +<> 사용 방법
62 +- knusl.py 파일과 SentiWord_info.json 파일을 동일한 위치에 위치시키고 knusl.py파일 실행
63 +- 단어 입력을 통해 해당 단어의 행태소 및 극성 정도값 출력
64 +
65 +
66 +<> 참고문헌
67 +[1] 표준국어대사전 뜻풀이, https://github.com/mrchypark/stdkor
68 +[2] 긍부정 축약어, 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
69 +[3] 긍부정 이모티콘, https://ko.wikipedia.org/wiki/%EC%9D%B4%EB%AA%A8%ED%8B%B0%EC%BD%98
70 +[4] SentiWordNet_3.0.0_20130122, http://sentiwordnet.isti.cnr.it/
71 +[5] SenticNet-5.0, http://sentic.net/
72 +[6] 감정단어사전0603, http://datascience.khu.ac.kr/board/bbs/board.php?bo_table=05_01&wr_id=91
73 +[7] 김은영, “국어 감정동사 연구”, 2004.02, 학위논문(박사) - 전남대학교 국어국문학과 대학원
74 +[8] 트위터 형태소 분석기, https://github.com/twitter/twitter-korean-text
...\ No newline at end of file ...\ No newline at end of file
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
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 +
15 +#-*-coding:utf-8-*-
16 +
17 +import json
18 +
19 +class KnuSL():
20 +
21 + def data_list(wordname):
22 + with open('data/SentiWord_info.json', encoding='utf-8-sig', mode='r') as f:
23 + data = json.load(f)
24 + result = ['None','None']
25 + for i in range(0, len(data)):
26 + if data[i]['word'] == wordname:
27 + result.pop()
28 + result.pop()
29 + result.append(data[i]['word_root'])
30 + result.append(data[i]['polarity'])
31 +
32 + r_word = result[0]
33 + s_word = result[1]
34 +
35 + print('어근 : ' + r_word)
36 + print('극성 : ' + s_word)
37 +
38 +
39 + return r_word, s_word
40 +
41 +if __name__ == "__main__":
42 +
43 + ksl = KnuSL
44 +
45 + print("\nKNU 한국어 감성사전입니다~ :)")
46 + print("사전에 단어가 없는 경우 결과가 None으로 나타납니다!!!")
47 + print("종료하시려면 #을 입력해주세요!!!")
48 + print("-2:매우 부정, -1:부정, 0:중립 or Unkwon, 1:긍정, 2:매우 긍정")
49 + print("\n")
50 +
51 + while(True):
52 + wordname = input("word : ")
53 + wordname = wordname.strip(" ")
54 + if wordname != "#":
55 + print(ksl.data_list(wordname))
56 + print("\n")
57 +
58 +
59 + elif wordname == "#":
60 + print("\n이용해주셔서 감사합니다~ :)")
61 + break
This diff could not be displayed because it is too large.
1 +출처
2 +
3 +1) 표준국어대사전 뜻풀이
4 +-> https://github.com/mrchypark/stdkor
5 +2) 신조어
6 +-> 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
7 +3) 이모티콘
8 +-> https://ko.wikipedia.org/wiki/%EC%9D%B4%EB%AA%A8%ED%8B%B0%EC%BD%98
9 +4) SentiWordNet_3.0.0_20130122
10 +-> http://sentiwordnet.isti.cnr.it/
11 +5) SenticNet-5.0
12 +-> http://sentic.net/
13 +6) 감정단어사전0603
14 +-> http://datascience.khu.ac.kr/board/bbs/board.php?bo_table=05_01&wr_id=91
15 +7) 김은영, “국어 감정동사 연구”, 2004.02, 학위논문(박사) - 전남대학교 국어국문학과 대학원
16 +
17 +
18 +단어 수 : 154
19 +극성 : 중립 or Unknown
20 +
21 +:p
22 +8-)
23 +B-)
24 +가까스로
25 +가라앉다
26 +가라앉지 않은
27 +가르침을 받아
28 +가리지 않고
29 +감싸고 달래다
30 +강구하다
31 +개회하다
32 +격동시키다
33 +격하다
34 +고부라지거나
35 +고부라지거나 비틀어지며
36 +골똘하게
37 +공격하다
38 +공적의
39 +교관하다
40 +굳은
41 +굳은 상태로
42 +굽히지 않는
43 +권세를 꺾다
44 +긁어
45 +긴절하다
46 +긴절히
47 +뉘우치다
48 +뉘우침
49 +능청스럽게
50 +능청스럽게 굴다
51 +더 필요한
52 +더들다
53 +더듬는
54 +더듬는 모양
55 +덮어 주다
56 +도도하게
57 +도도하게 행동하다
58 +떠들썩하게
59 +뜨겁다
60 +뜻이 강하다
61 +마는 둥
62 +마음대로
63 +마음대로 하다
64 +매우 조심스러움
65 +매우 조심스럽게
66 +머리가
67 +모양
68 +몹시 희다
69 +
70 +미덥지
71 +밀려나지 않고
72 +바닥이 훤하게
73 +바라거나
74 +바라거나 탐내는
75 +바라는
76 +바람이 없고
77 +박복함
78 +발열과
79 +발열이
80 +배우는
81 +배워지고
82 +버릇
83 +버젓하지
84 +벅차다
85 +번드럽게
86 +번드럽다
87 +번지르르하게
88 +번지르르하게 나다
89 +벌을
90 +벌을 주다
91 +벙글거리며
92 +보고 싶거나
93 +부르르
94 +부르르하다
95 +분발하여
96 +분발하여 일어날
97 +붓거나 부풀었던 것이 줄어들어 본래의 모습대로 되다
98 +사고가
99 +사정을 살피다
100 +삼연히
101 +
102 +성을
103 +성이
104 +성하고
105 +성하고 쇠함을
106 +소동을
107 +수고가
108 +수고가 되는
109 +수더분하거나
110 +수더분하게
111 +수줍다
112 +수줍음만
113 +수줍음만 타는
114 +순종하는 모양
115 +시간이 더
116 +쓰러뜨리다
117 +앙큼하다
118 +억척스럽고
119 +역사적인
120 +예사롭게
121 +오점
122 +우스운 말이나
123 +울리는 힘이
124 +웃기는 우스운
125 +웃기려고
126 +웃기려고 일부러
127 +원하다
128 +윽윽거리다
129 +윽윽대다
130 +윽윽하다
131 +익살 소설
132 +익살궂다
133 +익살극
134 +익살맞다
135 +익살배기
136 +익살스럽게
137 +익살스럽게 꾸민
138 +익살스럽게 대답함
139 +익살스럽다
140 +익살스레
141 +익살을
142 +익살을 많이
143 +익살을 부리는
144 +익살쟁이
145 +일부러 우스운
146 +자기에게 유리하도록
147 +잘못을 깨치고
148 +절실하게
149 +절실하다
150 +존속하다
151 +종횡무진
152 +좇다
153 +줄 만하다
154 +중간에서 화해하거나
155 +질기다
156 +탈이 없다
157 +탐내는
158 +
159 +필요하고 절실하게
160 +필요하고 절실하다
161 +행동하기가
162 +행동하기가 조심스럽고
163 +행동하는
164 +혹하여 달뜬
165 +혹하여 달뜸
166 +희롱질하다
167 +희희덕거리다
168 +희희덕대다
169 +힁허케
170 +히들거리다
171 +히들히들
172 +히들히들하다
173 +힘쓰다
174 +반신반의하다
This diff is collapsed. Click to expand it.
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 +
15 +#-*-coding:utf-8-*-
16 +
17 +import json
18 +
19 +class KnuSL():
20 +
21 + def data_list(wordname):
22 + with open('../data/SentiWord_info2.json', encoding='utf-8-sig', mode='r') as f:
23 + data = json.load(f)
24 + result = ['None','None']
25 + for i in range(0, len(data)):
26 + if data[i]['word'] == wordname:
27 + result.pop()
28 + result.pop()
29 + result.append(data[i]['word_root'])
30 + result.append(data[i]['polarity'])
31 +
32 + r_word = result[0]
33 + s_word = result[1]
34 +
35 + print('어근 : ' + r_word)
36 + print('극성 : ' + s_word)
37 +
38 +
39 + return r_word, s_word
40 +
41 +if __name__ == "__main__":
42 +
43 + ksl = KnuSL
44 +
45 + print("\nKNU 한국어 감성사전입니다~ :)")
46 + print("사전에 단어가 없는 경우 결과가 None으로 나타납니다!!!")
47 + print("종료하시려면 #을 입력해주세요!!!")
48 + print("-2:매우 부정, -1:부정, 0:중립 or Unkwon, 1:긍정, 2:매우 긍정")
49 + print("\n")
50 +
51 + while(True):
52 + wordname = input("word : ")
53 + wordname = wordname.strip(" ")
54 + if wordname != "#":
55 + print(ksl.data_list(wordname))
56 + print("\n")
57 +
58 +
59 + elif wordname == "#":
60 + print("\n이용해주셔서 감사합니다~ :)")
61 + break
1 +import warnings
2 +
3 +warnings.simplefilter(("ignore"))
4 +import openpyxl
5 +import pandas as pd
6 +
7 +# 000_KNU_New_Vdic2.xlsx 파일 넣기
8 +
9 +Stockfilefolder = input("종목시세폴더입력: ")
10 +Stockfilename = input("시세파일이름입력:")
11 +fileStock = "C:/Users/yangj/PycharmProjects/pythonProject1/뉴스키워드/" + Stockfilefolder + "/" + Stockfilename + ".xlsx"
12 +Stockfile = openpyxl.load_workbook(fileStock) # 파일이름입력
13 +stock_ws = Stockfile.active
14 +Stock_data = [] # list 타입
15 +i = 0
16 +for row in stock_ws.rows:
17 + Stock_data.append([])
18 + for cell in row:
19 + if cell.value != None:
20 + Stock_data[i].append(cell.value)
21 + i += 1
22 +del Stock_data[0]
23 +for i in range(len(Stock_data)):
24 + del Stock_data[i][0]
25 +#print(Stock_data)
26 +
27 +
28 +vert_p = [] # 수직 중복 삭제
29 +for i in range(len(Stock_data)):
30 + vert_p.append([])
31 + for j in range(len(Stock_data[i])):
32 + vert_p[i].append(Stock_data[i][j]) # 단어만 넣기
33 +print(vert_p)
34 +
35 +vert_p.sort(key=lambda x: x[0]) # 단어 기준으로 정렬
36 +for i in range(len(vert_p) - 2): # 단어 비교해서 같으면 누적, 다르면 값 바꾸기
37 + for j in range(i + 1, len(vert_p)):
38 + if vert_p[i][0] == vert_p[j][0] :
39 + vert_p[i][1] += vert_p[j][1]
40 + vert_p[j] = ['0', 0]
41 + if str.isalnum(vert_p[i][0]) == False:
42 + vert_p[i] =['0', 0]
43 +
44 +vert_p = [i for i in vert_p if not '0' in i] # '0'들어간 열 제거
45 +df_ver = pd.DataFrame(vert_p)
46 +df_ver.to_excel(Stockfilename + ' Stock_dictionary2.xlsx', sheet_name='sheet1')
47 +####사전 완성####
This diff could not be displayed because it is too large.
1 +import warnings
2 +warnings.simplefilter(("ignore"))
3 +import konlpy
4 +from konlpy.tag import *
5 +import openpyxl
6 +import pandas as pd
7 +from math import log10
8 +
9 +#형태소분석라이브러리
10 +#okt = Okt()
11 +hannanum = Hannanum()
12 +#filename= input("분석할 파일이름 입력:") #파일명
13 +filefolder = input("종목폴더입력: ")
14 +filename=input("파일이름입력:")
15 +filepos = "C:/Users/yangj/PycharmProjects/pythonProject1/뉴스크롤링/"+filefolder+"/" + filename + ".xlsx"
16 +kfile = openpyxl.load_workbook(filepos)#파일이름입력
17 +sheet=kfile.worksheets[0]#sheet1에 있는 데이터 가죠오기
18 +#print(sheet)
19 +data=[]
20 +for row in sheet.rows: #data에 크롤링한 뉴스 제목들 저장
21 + data.append(
22 + row[1].value
23 + )
24 +#print(data)
25 +#print(type(data[1])) #str
26 +#newData=[]
27 +newData2=[]
28 +#for i in range(len(data)):
29 +# newData.append(okt.nouns(data[i])) #명사만 추출okt
30 +#print(newData)
31 +for i in range(len(data)-1):
32 + newData2.append(hannanum.nouns(data[i+1])) #명사만 추출hannanum가 okt보다 성능좋음
33 +#print(newData2)
34 +#print(type(newData2))#newData2 데이터 형식은 list
35 +#df= pd.DataFrame.from_records(newData2)#newData2 dataframe으로 변환
36 +#df.to_excel(filename+'_명사추출'+'.xlsx') #파일명의 엑셀로 변환
37 +
38 +# -- TF-IDF function
39 +
40 +def f(t, d):
41 + # d is document == tokens
42 + return d.count(t)
43 +
44 +def tf(t, d):
45 + # d is document == tokens
46 + return 0.5 + 0.5*f(t,d)/max([f(w,d) for w in d])
47 +
48 +def idf(t, D):
49 + # D is documents == document list
50 + numerator = len(D)
51 + denominator = 1 + len([ True for d in D if t in d])
52 + return log10(numerator/denominator)
53 +
54 +def tfidf(t, d, D):
55 + return tf(t,d)*idf(t, D)
56 +
57 +def tfidfScorer(D):
58 + result = []
59 + for d in D:
60 + result.append([(t, tfidf(t, d, D)) for t in d] )
61 + return result
62 +
63 +#newData2는 명사추출을 통해 분리되어있음
64 +
65 +if __name__ == '__main__':
66 + corpus=[]
67 + for i in range(len(newData2)):
68 + corpus.append(newData2[i])
69 + TfIf=[] #결과저장
70 + for i, result in enumerate(tfidfScorer(corpus)):
71 + print('====== document[%d] ======' % i)
72 + print(result)
73 +
74 + #TfIf.append(result)
75 +
76 +#df= pd.DataFrame.from_records(TfIf)#TfIf dataframe으로 변환
77 +#df.to_excel(filename+'_가중치추출'+'.xlsx')
...\ No newline at end of file ...\ No newline at end of file
This diff could not be displayed because it is too large.
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 +
15 +#-*-coding:utf-8-*-
16 +
17 +import json
18 +
19 +class KnuSL():
20 +
21 + def data_list(wordname):
22 + with open('data/SentiWord_info.json', encoding='utf-8-sig', mode='r') as f:
23 + data = json.load(f)
24 + result = ['None','None']
25 + for i in range(0, len(data)):
26 + if data[i]['word'] == wordname:
27 + result.pop()
28 + result.pop()
29 + result.append(data[i]['word_root'])
30 + result.append(data[i]['polarity'])
31 +
32 + r_word = result[0]
33 + s_word = result[1]
34 +
35 + print('어근 : ' + r_word)
36 + print('극성 : ' + s_word)
37 +
38 +
39 + return r_word, s_word
40 +
41 +if __name__ == "__main__":
42 +
43 + ksl = KnuSL
44 +
45 + print("\nKNU 한국어 감성사전입니다~ :)")
46 + print("사전에 단어가 없는 경우 결과가 None으로 나타납니다!!!")
47 + print("종료하시려면 #을 입력해주세요!!!")
48 + print("-2:매우 부정, -1:부정, 0:중립 or Unkwon, 1:긍정, 2:매우 긍정")
49 + print("\n")
50 +
51 + while(True):
52 + wordname = input("word : ")
53 + wordname = wordname.strip(" ")
54 + if wordname != "#":
55 + print(ksl.data_list(wordname))
56 + print("\n")
57 +
58 +
59 + elif wordname == "#":
60 + print("\n이용해주셔서 감사합니다~ :)")
61 + break
1 +# -*-coding:utf-8-*-
2 +import collections
3 +import json
4 +
5 +import warnings
6 +
7 +warnings.simplefilter(("ignore"))
8 +import openpyxl
9 +import pandas as pd
10 +import re
11 +from datetime import datetime
12 +
13 +########코스피 감성 판단
14 +class KnuSL():
15 +
16 + def data_list(wordname):
17 + with open('KnuSentiLex/data/SentiWord_info.json', encoding='utf-8-sig', mode='r') as f:
18 + data = json.load(f)
19 + result = [0, 0]
20 +
21 + for i in range(0, len(data)):
22 + if data[i]['word'] == wordname:
23 + result.pop()
24 + result.pop()
25 + result.append(data[i]['word_root'])
26 + result.append(int(data[i]['polarity']))
27 +
28 + r_word = result[0] # 어근
29 + s_word = result[1] # 극성
30 +
31 + return s_word
32 +
33 +
34 +if __name__ == "__main__":
35 + ksl = KnuSL
36 +
37 + print("\nKNU 한국어 감성사전입니다~ :)")
38 + print("사전에 단어가 없는 경우 결과가 None으로 나타납니다!!!")
39 + print("종료하시려면 #을 입력해주세요!!!")
40 + print("-2:매우 부정, -1:부정, 0:중립 or Unkwon, 1:긍정, 2:매우 긍정")
41 + print("\n")
42 +#########
43 +Newsfilefolder = input("종목폴더입력: ")
44 +Newsfilename = input("파일이름입력:")
45 +Newsfilepos = "C:/Users/yangj/PycharmProjects/pythonProject1/뉴스키워드/" + Newsfilefolder + "/" + Newsfilename + ".xlsx"
46 +Newsfile = openpyxl.load_workbook(Newsfilepos) # 파일이름입력
47 +ws = Newsfile.active
48 +data = []
49 +date = []
50 +i = 0
51 +for row in ws.rows:
52 + data.append([])
53 + date.append(row[1].value)
54 + for cell in row:
55 + if cell.value != None:
56 + data[i].append(cell.value)
57 + i += 1
58 +del data[0] # 첫번째 의미없는 열 삭제
59 +del date[0]
60 +for i in range(len(data)):
61 + del data[i][0] # 각 열의 첫번째 행 삭제
62 +for i in range(len(data)):
63 + del data[i][0] # 각 열의 날짜 행 삭제
64 +
65 +KNUdata = []
66 +Tdata = []
67 +
68 +for x in range(len(data)):
69 + KNUdata.append([])
70 + Tdata.append([])
71 + for y in range(len(data[x])):
72 + KNUdata[x].append(ksl.data_list(data[x][y]))
73 + Tdata[x].append([data[x][y], KNUdata[x][y]])
74 +
75 +result = {'날짜': date, '단어, 극성': Tdata}
76 +
77 +df = pd.DataFrame(result)
78 +
79 +list_df = df.values.tolist() # dataframe list로 변경
80 +new_date = [] # 날짜 중복 삭제
81 +for v in date:
82 + if v not in new_date:
83 + new_date.append(v)
84 +# print(new_date)
85 +
86 +Setlist = [] # 날짜별 키워드 넣기
87 +for v in range(len(new_date)):
88 + Setlist.append([])
89 + Setlist[v].append(new_date[v])
90 + for i in range(len(list_df)):
91 + for j in range(len(list_df[i][1])):
92 + if new_date[v] == list_df[i][0]:
93 + Setlist[v].append(list_df[i][1][j])
94 +
95 +Stockfilefolder = input("종목시세폴더입력: ")
96 +Stockfilename = input("시세파일이름입력:")
97 +fileStock = "C:/Users/yangj/PycharmProjects/pythonProject1/종목별시세/" + Stockfilefolder + "/" + Stockfilename + ".xlsx"
98 +Stockfile = openpyxl.load_workbook(fileStock) # 파일이름입력
99 +stock_ws = Stockfile.active
100 +Stock_data = [] # list 타입
101 +i = 0
102 +for row in stock_ws.rows:
103 + Stock_data.append([])
104 + for cell in row:
105 + if cell.value != None:
106 + Stock_data[i].append(cell.value)
107 + i += 1
108 +del Stock_data[0]
109 +for i in range(len(Stock_data)):
110 + del Stock_data[i][2] # 대비 삭제
111 +for i in range(len(Stock_data)):
112 + del Stock_data[i][7] # 거래대금 삭제
113 +for i in range(len(Stock_data)):
114 + del Stock_data[i][7] # 시가 총액 삭제
115 +
116 +
117 +i = 0
118 +for k in range(len(Setlist)):
119 + if (Stock_data[i][0].split('/') == Setlist[k][0].split('.')[:3]): # 날짜 비교 날짜가 같다면
120 + if Stock_data[i][2] > 0: # 코스피 등락이 양수
121 + for j in range(1, len(Setlist[k])):
122 + if Setlist[k][j][1] == 0:
123 + Setlist[k][j][1] = 1
124 + else:
125 + Setlist[k][j][1] += 1
126 + elif Stock_data[i][2] < 0:
127 + for j in range(1, len(Setlist[k])): # 음수면 어제 뉴스는 악재 취급
128 + if Setlist[k][j][1] == 0:
129 + Setlist[k][j][1] = -1
130 + else:
131 + Setlist[k][j][1] -= 1
132 + i += 1
133 + else:
134 + if Stock_data[i+1][2] > 0: # 다음날 주가 등락률이 양수면
135 + for j in range(1, len(Setlist[k])): # 어제뉴스는 호재 취급
136 + if Setlist[k][j][1] == 0:
137 + Setlist[k][j][1] = 1
138 + else:
139 + Setlist[k][j][1] += 1
140 + elif Stock_data[i+1][2] < 0:
141 + for j in range(1, len(Setlist[k])): # 음수면 어제 뉴스는 악재 취급
142 + if Setlist[k][j][1] == 0:
143 + Setlist[k][j][1] = -1
144 + else:
145 + Setlist[k][j][1] -= 1
146 +
147 +Setlist_w = []
148 +for i in range(len(Setlist)):
149 + Setlist_w.append([])
150 + for j in range(1, len(Setlist[i])):
151 + Setlist_w[i].append(Setlist[i][j][0]) # 극성 제외 단어만 추출
152 +
153 +counter = {}
154 +for i in range(len(Setlist_w)):
155 + counter[i] = collections.Counter(Setlist_w[i]) # 누적치
156 +
157 +for i in range(len(Setlist_w)):
158 + Setlist_w[i] = list(zip(counter[i].keys(), counter[i].values())) # 튜플 리스트화 [(값, 값)]
159 +
160 +Plist = []
161 +for i in range(len(Setlist_w)):
162 + Plist.append([])
163 + for j in range(len(Setlist_w[i])):
164 + Plist[i].append(list(Setlist_w[i][j])) # 튜플 -> 리스트화 [[값, 값]]
165 +
166 +for i in range(len(Plist)):
167 + for j in range(len(Plist[i])):
168 + Plist[i][j][1] = 0 # 극성 0으로 초기화
169 +
170 +for i in range(len(Setlist)):
171 + for j in range(1, len(Setlist[i])):
172 + for h in range(len(Plist[i])):
173 + if Setlist[i][j][0] == Plist[i][h][0]:
174 + Plist[i][h][1] += Setlist[i][j][1] # 누적치
175 +vert_p = [] # 수직 중복 삭제
176 +for i in range(len(Plist)):
177 + for j in range(len(Plist[i])):
178 + vert_p.append(Plist[i][j]) # 단어만 넣기
179 +# print(vert_p)
180 +vert_p.sort(key=lambda x: x[0]) # 단어 기준으로 정렬
181 +for i in range(len(vert_p) - 2): # 단어 비교해서 같으면 누적 다르면 값 바꾸기
182 + for j in range(i + 1, len(vert_p)):
183 + if vert_p[i][0] == vert_p[j][0]:
184 + vert_p[i][1] += vert_p[j][1]
185 + vert_p[j] = ['0', 0]
186 +
187 +vert_p = [i for i in vert_p if not '0' in i] # '0'들어간 열 제거
188 +df_ver = pd.DataFrame(vert_p)
189 +df_ver.to_excel(Stockfilename + ' KNU_New_vdic2.xlsx', sheet_name='sheet1')
This diff could not be displayed because it is too large.
1 +출처
2 +
3 +1) 표준국어대사전 뜻풀이
4 +-> https://github.com/mrchypark/stdkor
5 +2) 신조어
6 +-> 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
7 +3) 이모티콘
8 +-> https://ko.wikipedia.org/wiki/%EC%9D%B4%EB%AA%A8%ED%8B%B0%EC%BD%98
9 +4) SentiWordNet_3.0.0_20130122
10 +-> http://sentiwordnet.isti.cnr.it/
11 +5) SenticNet-5.0
12 +-> http://sentic.net/
13 +6) 감정단어사전0603
14 +-> http://datascience.khu.ac.kr/board/bbs/board.php?bo_table=05_01&wr_id=91
15 +7) 김은영, “국어 감정동사 연구”, 2004.02, 학위논문(박사) - 전남대학교 국어국문학과 대학원
16 +
17 +
18 +단어 수 : 154
19 +극성 : 중립 or Unknown
20 +
21 +:p
22 +8-)
23 +B-)
24 +가까스로
25 +가라앉다
26 +가라앉지 않은
27 +가르침을 받아
28 +가리지 않고
29 +감싸고 달래다
30 +강구하다
31 +개회하다
32 +격동시키다
33 +격하다
34 +고부라지거나
35 +고부라지거나 비틀어지며
36 +골똘하게
37 +공격하다
38 +공적의
39 +교관하다
40 +굳은
41 +굳은 상태로
42 +굽히지 않는
43 +권세를 꺾다
44 +긁어
45 +긴절하다
46 +긴절히
47 +뉘우치다
48 +뉘우침
49 +능청스럽게
50 +능청스럽게 굴다
51 +더 필요한
52 +더들다
53 +더듬는
54 +더듬는 모양
55 +덮어 주다
56 +도도하게
57 +도도하게 행동하다
58 +떠들썩하게
59 +뜨겁다
60 +뜻이 강하다
61 +마는 둥
62 +마음대로
63 +마음대로 하다
64 +매우 조심스러움
65 +매우 조심스럽게
66 +머리가
67 +모양
68 +몹시 희다
69 +
70 +미덥지
71 +밀려나지 않고
72 +바닥이 훤하게
73 +바라거나
74 +바라거나 탐내는
75 +바라는
76 +바람이 없고
77 +박복함
78 +발열과
79 +발열이
80 +배우는
81 +배워지고
82 +버릇
83 +버젓하지
84 +벅차다
85 +번드럽게
86 +번드럽다
87 +번지르르하게
88 +번지르르하게 나다
89 +벌을
90 +벌을 주다
91 +벙글거리며
92 +보고 싶거나
93 +부르르
94 +부르르하다
95 +분발하여
96 +분발하여 일어날
97 +붓거나 부풀었던 것이 줄어들어 본래의 모습대로 되다
98 +사고가
99 +사정을 살피다
100 +삼연히
101 +
102 +성을
103 +성이
104 +성하고
105 +성하고 쇠함을
106 +소동을
107 +수고가
108 +수고가 되는
109 +수더분하거나
110 +수더분하게
111 +수줍다
112 +수줍음만
113 +수줍음만 타는
114 +순종하는 모양
115 +시간이 더
116 +쓰러뜨리다
117 +앙큼하다
118 +억척스럽고
119 +역사적인
120 +예사롭게
121 +오점
122 +우스운 말이나
123 +울리는 힘이
124 +웃기는 우스운
125 +웃기려고
126 +웃기려고 일부러
127 +원하다
128 +윽윽거리다
129 +윽윽대다
130 +윽윽하다
131 +익살 소설
132 +익살궂다
133 +익살극
134 +익살맞다
135 +익살배기
136 +익살스럽게
137 +익살스럽게 꾸민
138 +익살스럽게 대답함
139 +익살스럽다
140 +익살스레
141 +익살을
142 +익살을 많이
143 +익살을 부리는
144 +익살쟁이
145 +일부러 우스운
146 +자기에게 유리하도록
147 +잘못을 깨치고
148 +절실하게
149 +절실하다
150 +존속하다
151 +종횡무진
152 +좇다
153 +줄 만하다
154 +중간에서 화해하거나
155 +질기다
156 +탈이 없다
157 +탐내는
158 +
159 +필요하고 절실하게
160 +필요하고 절실하다
161 +행동하기가
162 +행동하기가 조심스럽고
163 +행동하는
164 +혹하여 달뜬
165 +혹하여 달뜸
166 +희롱질하다
167 +희희덕거리다
168 +희희덕대다
169 +힁허케
170 +히들거리다
171 +히들히들
172 +히들히들하다
173 +힘쓰다
174 +반신반의하다
This diff is collapsed. Click to expand it.