1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
|
drive.mount('/content/drive')
import pandas as pd
train = pd.read_csv('/content/drive/My Drive/BIGCOIN/PREPORCOESSING/트레인데이터/최종 훈련 text/final_text.csv')
train= train.dropna()
# 트레인 데이터 가볍게 만들기 및 인덱스 수정, 인덱스가 본래 데이터 그래로 들어와 있어서, 슬라이싱이 잘 되지 않았음
index = [i for i in range(len(train))]
train = train[["text", "gap_weighted_price"]]
train['index']= index
train =train.reset_index()
print(train.shape)
# KaggleWord2VecUtility 데이터 전차리
import re
import nltk
nltk.download('punkt')
import pandas as pd
import numpy as np
from bs4 import BeautifulSoup
from multiprocessing import Pool
class KaggleWord2VecUtility(object):
@staticmethod
def review_to_wordlist(review, remove_stopwords=False):
# 1. HTML 제거
review_text = BeautifulSoup(review, "html.parser").get_text()
# 2. 특수문자를 공백으로 바꿔줌
# 3. 소문자로 변환 후 나눈다.
words = review_text.lower().split()
# 4. 불용어 제거
if remove_stopwords:
words = [w for w in words if not w in stops]
# 5. 어간추출
stemmer = SnowballStemmer('english')
# 6. 리스트 형태로 반환
return(words)
@staticmethod
def review_to_join_words( review, remove_stopwords=False ):
words = KaggleWord2VecUtility.review_to_wordlist(\
review, remove_stopwords=False)
join_words = ' '.join(words)
return join_words
@staticmethod
def review_to_sentences( review, remove_stopwords=False ):
# punkt tokenizer를 로드한다.
"""
이 때, pickle을 사용하는데
pickle을 통해 값을 저장하면 원래 변수에 연결 된 참조값 역시 저장된다.
저장된 pickle을 다시 읽으면 변수에 연결되었던
모든 레퍼런스가 계속 참조 상태를 유지한다.
"""
# 1. nltk tokenizer를 사용해서 단어로 토큰화 하고 공백 등을 제거한다.
raw_sentences = tokenizer.tokenize(review.strip())
# 2. 각 문장을 순회한다.
sentences = []
for raw_sentence in raw_sentences:
# 비어있다면 skip
if len(raw_sentence) > 0:
# 태그제거, 알파벳문자가 아닌 것은 공백으로 치환, 불용어제거
KaggleWord2VecUtility.review_to_wordlist(\
raw_sentence, remove_stopwords))
return sentences
# 속도 개선을 위해 멀티 스레드로 작업하도록
@staticmethod
def _apply_df(args):
df, func, kwargs = args
@staticmethod
def apply_by_multiprocessing(df, func, **kwargs):
# 키워드 항목 중 workers 파라메터를 꺼냄
# 위에서 가져온 workers 수로 프로세스 풀을 정의
pool = Pool(processes=workers)
# 실행할 함수와 데이터프레임을 워커의 수 만큼 나눠 작업
for d in np.array_split(df, workers)])
pool.close()
# 작업 결과를 합쳐서 반환
return pd.concat(result)
from multiprocessing import Pool
import numpy as np
def _apply_df(args):
df, func, kwargs = args
def apply_by_multiprocessing(df, func, **kwargs):
# 키워드 항목 중 workers 파라메터를 꺼냄
# 위에서 가져온 workers 수로 프로세스 풀을 정의
pool = Pool(processes=workers)
# 실행할 함수와 데이터프레임을 워커의 수 만큼 나눠 작업
for d in np.array_split(df, workers)])
pool.close()
# 작업 결과를 합쳐서 반환
return pd.concat(list(result))
from sklearn.pipeline import Pipeline
# 튜토리얼과 다르게 파라메터 값을 수정
# 파라메터 값만 수정해도 캐글 스코어 차이가 많이 남
# tfidf 이용시 TfidfVectorizer로 교체
vectorizer_tfidf = TfidfVectorizer로(analyzer = 'word',
tokenizer = None,
preprocessor = None,
stop_words = None,
#min_df = 50, # 토큰이 나타날 최소 문서 개수
ngram_range=(1,1),
#max_features = 50000
)
vectorizer
vectorizer_dtm = CountVectorizer(analyzer = 'word',
tokenizer = None,
preprocessor = None,
stop_words = None,
#min_df = 50, # 토큰이 나타날 최소 문서 개수
ngram_range=(1,1),
#max_features = 50000
)
vectorizer
# 여기에서는 하나의 과정만 묶어주어 pipeline이 불필요 할 수도 있습니다.
# pipeline은 feature engineering의 여러 과정을 묶어 줄 때 사용합니다.
pipeline_tdidf = Pipeline([
('vect', vectorizer_tfidf),
])
pipeline_dtm = Pipeline([
('vect', vectorizer_dtm),
])
# 클린 데이터 dtm생성
%time train_data_features_tfidf = pipeline_tdidf.fit_transform(clean_train_reviews)
train_data_features
%time train_data_features_dtm = pipeline_dtm.fit_transform(clean_train_reviews)
train_data_features
#피쳐 이름 저장, 이름은 똑같으니 하나만 ok
features = train_data_features_tfidf.get_feature_names()
# 피쳐 이름 데이터 프레임화
feature_df= pd.DataFrame(features).reset_index()
# cont 상위 5% 리스트 데이터 프레임화
five_df = pd.DataFrame(upper_five_list).reset_index()
# 둘 병합
# 병합된 것으로 부터, train_data_features에서 슬라이싱 하기 위한 index를 리스트화
upperfivelist= merge["index_x"].tolist()
# 인덱스 번호로 변환된 cont 상위 5%리스트로 인덱싱
cont_upper_five_features_tfidf = train_data_features_tfidf.T[upperfivelist].T
cont_upper_five_features_dtm = train_data_features_dtm.T[upperfivelist].T
# 저장
import pickle
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
일단 기록 해 놓자, 기여도는 dtm 기반으로 만들어진 rating에 의해 계산되었다. 만약 tfidf로 계산한 rating이었다면 또 다른 값이 나왔을 것이다.
또 만약, tfidf로 이용했을 때, 빈도 수가 아닌, 변화량을 기준으로 rating을 산출 할 가능성도 있다....
의미적으로 볼 때, 어떤 값이 더 정확하게 단어들의 긍부정에 대한 민감도를 표시할지는 모르겠지만.. 가능성을 상정하야 두자.일단 하나의 흐름을 만들어야 한다.
'2019년 혁신성장 청년인재 집중양성(빅데이터) > 집중양성과정 프로젝트 01' 카테고리의 다른 글
[비트코인 전처리4] 가격 증감을 바탕으로 단어 긍정지수 산출 (0) | 2019.09.19 |
---|---|
[비트코인 전처리3] 'price'에 관한 코사인 유사도 상위 5만 추출 (0) | 2019.09.19 |
[비트코인 전처리2] 트윗 데이터에 가격 태그 붙이기 (0) | 2019.09.16 |
[비트코인 트위터 감성분석] 1년 간 트위에서 시간당 100개씩 트윗 산출[1] (0) | 2019.09.15 |
랜덤포레스트로 학습을 시켜봤지만, 잘못 가르쳐서 미안하다. (0) | 2019.09.09 |