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