빈도 기준으로 시간별 텍스트를 정리하여 저장하였다. 이제 이 premart 데이터를 가지고 mart를 만든다.
TFIDF란 특정 문서에 어떤 단어가 얼마나 유의미한지 나타내는 지표다.
예를들어, 문서 1,2,3에 ‘트위터’란 단어가 3번문서만 10번 나왔다면 트위터는 3번문서에서 매우 중요한 단어다.
반대로, ‘데이터’가 1,2,3 모두에 들어가면 데이터란 단어는 모든 문서에 의미가 없는 단어다
또 다른 케이스로, ‘분석’이 2번 문서에만 나오지만 한번만 나오면 3번문서의 트위터보다는 덜 중요할 것이다.
TF: term frequency (어떤 문서에서 단어의 빈도)
IDF : inverse document frequency (모든 문서에서 단어가 출현한 빈도)
를 곱한 값으로, 자세한건 아래 문서나 코드를 참고한다
https://towardsdatascience.com/tf-idf-simplified-aba19d5f5530
해당 분석에서는 최신 한시간을 하나의 문서로 보고, 비교대상을 기존 7일 (7 * 24 = 168 문서)으로 놓는다
우선 idf는 지난 7일간의 단어들에 대해서 계산한다
예시로 각각 코인이 아닌 btc에 대해서만 추출하겠다
df = pd.read_csv('..') # S3에서 가져오거나, 실험때는 주피터 환경에서 premart 테이블을 가져온다
btc = df[df['key']=='bitcoin'].drop(columns=['Unnamed: 0.1', 'Unnamed: 0']).rename(columns={'count':'wc'})
unique_terms = set(btc['word'])
dates = sorted(list(set(btc['date'])))
st = []
wc_list = {}
date_count = len(dates)
for date in dates:
tdf = btc[btc['date']==date]
wc_list[date] = dict(zip(tdf.word, tdf.wc))
for term in unique_terms: # 개별 단어에 대해
row = []
row.append(term)
unique_count = 0
for date in dates: # 각 시간별로
count = wc_list[date].get(term, 0)
row.append(count) # 데이터를 확인하기 위해, unique count가 아닌 전체 개수도 받아온다
if (count != 0): # 시간에 단어가 노출됐으면 개수를 추가한다
unique_count +=1
row.append(np.log(date_count/unique_count)) # idf 계산식을 추가한다
st.append(row)
columns = []
columns.append('word')
for i in range(len(dates)):
columns.append('date'+str(i))
columns.append('idf')
idf_ = pd.DataFrame(st, columns=columns)