본문 바로가기

2019년 혁신성장 청년인재 집중양성(빅데이터)/집중양성과정 프로젝트 01

[20190903] 기계학습을 위한 사전 전처리

1. 크롤링한 데이터를 토큰화하여 저장 

 

2. 학습 모델을 만들기 위한 태깅 트레인 데이터

 

이미 있는 코퍼스 활용, 주식의 증감(부호), 증감의 정도

 

워드 투 벡을 통한 학습에서 만들어지는 벡터는 B,C의 경우 사전과 같이 이용 될 수 있음. 하지만 완전히 같은 것은 아님. 왜냐하면 제작 과정을 정확히 알 수 없기 떄문에.

 

A. 사람이 태깅한 감정을 학습시키거나(1: 긍정 0: 중립 -1 :부정)

B. 주식의 오르 내림의 정도로 학습을 시키거나(실제 가격 변화)

C. 주식의 오르 내림의 수준을 수치화 시키거나(ex) -2 : 많이 내려감 -1 내려감 0: 거의 없음 +1 올라감 +2 많이 올라감)

 

 

 

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
# 테스트 데이터로 2017년 BTC 자료에서 텍스트만 추출
 
import json
import ast
import pandas as pd
import csv
 
 
 
 
 
 
#구글 드라이브에 파일을 올려서 드라이브 마운트 시키는 것이 훠월씬 빠름
 
from google.colab import drive
drive.mount('/content/drive')
 
 
 
test = json.load(open('/content/drive/My Drive/BIGCOIN/PREPORCOESSING/2017_en_BTC.json'))
 
 
# json 파일의 text만 따로 리스트로 만듦
 
text = []
for i in test:
  text.append(i["text"])
 
 
 
 
 
 
#길이 확인
print(len(text))
 
 
 
 
 
#텍스트를 데이터프레임 형태로 저장
 
df = pd.DataFrame(text, columns=['text'])
 
# dropna를 이용하여 na값 제거
df_na = df.dropna(axis=0)
 
# drop_duplicates()를 이용하여 중복된 행들 제거
 
df_dist=df_na.drop_duplicates()
 
'''계속 오류가 났지만 이유를 몰랐다. 그 이유는 결측치였다. try, except구문을
활용해 문제가 있는 텍스트를 확인하고 그 값을 확인했더니 na였다.'''
 
# 인덱스를 초기화 하지 않으면 본래의 인덱스를 그대로 가지기 때문에, 숫자가 뛰엄 뛰엄 생긴다.
df_dist= df_dist.reset_index(drop=True)
 
 
 
 
 
 
# 갯수 확인 17521개 제거
 
print(len(df["text"]))
print(len(df_dist["text"]))
 
# shape 확인
 
 
# 정보 확인
 
 
 
 
 
 
# nltk 비롯 처리를 위한 코드
 
!pip show BeautifulSoup4
from bs4 import BeautifulSoup
import re
import nltk
nltk.download('stopwords')
nltk.download('wordnet')
from nltk.corpus import stopwords
from nltk.stem.snowball import SnowballStemmer
 
def review_to_words( raw_review ):
    # 1. HTML 제거
    #review_text = BeautifulSoup(raw_review, 'html.parser').get_text()
    # 2. 영문자가 아닌 문자는 공백으로 변환
    letters_only = re.sub('[^a-zA-Z]'' ', raw_review)
    # 3. 소문자 변환
    # 4. 파이썬에서는 리스트보다 세트로 찾는게 훨씬 빠르다.
    # stopwords 를 세트로 변환한다.
    stops = set(stopwords.words('english'))
    # 5. Stopwords 불용어 제거
    meaningful_words = [w for w in words if not w in stops]
    # 6. 어간추출
    stemmer = SnowballStemmer('english')
    stemming_words = [stemmer.stem(w) for w in meaningful_words]
    # 7. 공백으로 구분된 문자열로 결합하여 결과를 반환
    return' '.join(stemming_words) )
 
 
 
 
 
# 병렬처리를 위한 멀티프로세싱
 
from multiprocessing import Pool
import numpy as np
 
def _apply_df(args):
    df, func, kwargs = args
    return df.apply(func, **kwargs)
 
def apply_by_multiprocessing(df, func, **kwargs):
    # 키워드 항목 중 workers 파라메터를 꺼냄
    workers = kwargs.pop('workers')
    # 위에서 가져온 workers 수로 프로세스 풀을 정의
    pool = Pool(processes=workers)
    # 실행할 함수와 데이터프레임을 워커의 수 만큼 나눠 작업
            for d in np.array_split(df, workers)])
    pool.close()
    # 작업 결과를 합쳐서 반환
    return pd.concat(list(result))
 
 
#깨끗한 문자를 얻을 수 있는지 확인한다.
 
clean_review = review_to_words(df_dist['text'][26])
clean_review
 
 
 
num_reviews = df_dist['text'].size
num_reviews
 
 
 
# 모든 텍스트에 대하여 클린 워드 진행
 
clean_train_reviews = []
for i in range(0, num_reviews):
    except :
      print(i)
 
 
 
 
%time clean_test_reviews = apply_by_multiprocessing(\
    df_dist['text'], review_to_words, workers=4)  
 
 
 
 
#리스트 확인
 
clean_test_reviews[1]
 
 
 
 
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.pipeline import Pipeline
 
# 튜토리얼과 다르게 파라메터 값을 수정
# 파라메터 값만 수정해도 캐글 스코어 차이가 많이 남
vectorizer = CountVectorizer(analyzer = 'word'
                             tokenizer = None,
                             preprocessor = None, 
                             stop_words = None, 
                             min_df = 2# 토큰이 나타날 최소 문서 개수
                             ngram_range=(13),
                             max_features = 20000
                            )
vectorizer
 
 
 
#파이프라인을 통해 간편하게 함수를 적용할 수 있다고 한다.
pipeline = Pipeline([
    ('vect', vectorizer),
])  
 
 
 
 
# 벡터화에서의 fit과 학습에서의 fit은 다르다고 한다.
 
%time test_data_features = pipeline.fit_transform(clean_test_reviews)
test_data_features
 
 
 
 
 
 
vocab = vectorizer.get_feature_names()
print(len(vocab))
vocab[:10]
 
 
 
# 벡터화 된 피처를 확인해 봄
import numpy as np
    
for tag, count in zip(vocab, dist):
    print(count, tag)
    
pd.DataFrame(dist, columns=vocab)
 
 
pd.DataFrame(test_data_features[:10].toarray(), columns=vocab).head()
 
 
 
type(test_data_features)
 
 
np.save('test_data_features', test_data_features)
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

 

1
2
3
4
5
6
7
8
9
 
'''세이브 이후에, 파일을 불러올 수 있는지 확인했다.
그냥 import numpy as np를 할 경우 오류가 뜨니, 이전 버전을 다운 받아야 한다.'''
 
!pip install numpy==1.16.1
import numpy as np
 
 
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

 

이제 2번 ㄱㄱ