양지수

정렬후 가중치삭제후 저장 필요

Showing 1 changed file with 48 additions and 8 deletions
...@@ -4,6 +4,8 @@ import konlpy ...@@ -4,6 +4,8 @@ import konlpy
4 from konlpy.tag import * 4 from konlpy.tag import *
5 import openpyxl 5 import openpyxl
6 import pandas as pd 6 import pandas as pd
7 +from math import log10
8 +from operator import itemgetter
7 9
8 #형태소분석라이브러리 10 #형태소분석라이브러리
9 #okt = Okt() 11 #okt = Okt()
...@@ -22,24 +24,62 @@ for row in sheet.rows: #data에 크롤링한 뉴스 제목들 저장 ...@@ -22,24 +24,62 @@ for row in sheet.rows: #data에 크롤링한 뉴스 제목들 저장
22 ) 24 )
23 #print(data) 25 #print(data)
24 #print(type(data[1])) #str 26 #print(type(data[1])) #str
25 -#newData=[] 27 +
26 newData2=[] 28 newData2=[]
27 -#for i in range(len(data)): 29 +
28 -# newData.append(okt.nouns(data[i])) #명사만 추출okt
29 #print(newData) 30 #print(newData)
30 for i in range(len(data)-1): 31 for i in range(len(data)-1):
31 newData2.append(hannanum.nouns(data[i+1])) #명사만 추출hannanum가 okt보다 성능좋음 32 newData2.append(hannanum.nouns(data[i+1])) #명사만 추출hannanum가 okt보다 성능좋음
32 -print(newData2) 33 +#print(newData2)
33 34
34 newData3=[] 35 newData3=[]
35 for i in range(len(newData2)): 36 for i in range(len(newData2)):
36 newData3.append([]) 37 newData3.append([])
37 for j in newData2[i]: 38 for j in newData2[i]:
38 - if any(map(str.isdigit,j))==False: 39 + if any(map(str.isdigit,j))==False and len(j)>1: #추출한 결과가 숫자포함이거나 한글자 인것 제외
39 newData3[i].append(j) 40 newData3[i].append(j)
40 -print(newData3) 41 +#print(newData3)
41 42
42 #print(type(newData2))#newData2 데이터 형식은 list 43 #print(type(newData2))#newData2 데이터 형식은 list
43 -df= pd.DataFrame.from_records(newData3)#newData2 dataframe으로 변환 44 +#df= pd.DataFrame.from_records(newData3)#newData3 dataframe으로 변환
44 -df.to_excel(filename+'_명사추출_숫자제외'+'.xlsx') #파일명의 엑셀로 변환 45 +#df.to_excel(filename+'_명사추출_숫자제외'+'.xlsx') #파일명의 엑셀로 변환
46 +
47 +#TF-IDF함수 시작
48 +
49 +def f(t, d): # 엑셀 d 안에 있는 t 빈도 세기
50 + return d.count(t)
51 +
52 +def tf(t, d): #tf(t,d)증가빈도 공식 적용
53 + return 0.5 + 0.5*f(t,d)/max([f(w,d) for w in d])
54 +
55 +def idf(t, D): #역문서 빈도 공식 적용
56 + numerator = len(D) #문서 집합에 포함 된 문서 수
57 + denominator = 1 + len([ True for d in D if t in d]) #1더해서 0되는 것 방지
58 + return log10(numerator/denominator)
59 +
60 +def tfidf(t, d, D):
61 + return tf(t,d)*idf(t, D)
62 +
63 +def tfidfScorer(D):
64 + result = []
65 + for d in D:
66 + result.append([(t, tfidf(t, d, D)) for t in d] )
67 + return result
68 +
69 +#newData3는 명사추출을 통해 분리되어있음(이미 split상태)
70 +
71 +if __name__ == '__main__':
72 + corpus=[]
73 + for i in range(len(newData3)):
74 + corpus.append(newData3[i])
75 + TfIf=[] #결과저장
76 + for i, result in enumerate(tfidfScorer(corpus)):
77 + #print('====== document[%d] ======' % i)
78 + #print(result)
79 + TfIf.append(result)
80 +print(TfIf)#TFIF는 (단어,가중치) 조합으로 저장
81 +
82 +
83 +#df= pd.DataFrame.from_records(TfIf)#TfIf dataframe으로 변환
84 +#df.to_excel(filename+'_가중치추출'+'.xlsx')
45 85
......