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 | ... | ... |
-
Please register or login to post a comment