close_btn
조회 수 479 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print

< word2vec을 활용한 spam 메일 분류  >


# ham/spam 데이터 불러오기
import pandas as pd
ham_spam = pd.read_csv('ham_spam.csv')

# ham_spam 데이터에서 "text"와 "category"만 가져와서 리스트로 만들기
data = list(zip(ham_spam['text'],ham_spam['category']))

# text와 category(=label) 나누기
text = [data[i][0] for i in range(len(data))]
label = [data[i][1] for i in range(len(data))]

# 숫자 제거, 문자 아닌 것 제거하고 띄어쓰기(' ') 기준으로 split하여 단어 뽑아내기
import re
text1 = [re.sub('\d+',' ',tmp) for tmp in text]
text2 = [re.sub('\W+',' ',tmp) for tmp in text1]
text_split = [tmp.split(' ') for tmp in text2]
text_split


# train, test 데이터 나누기
from sklearn.cross_validation import train_test_split  # 버전에 따라 다름
text_train, text_test, label_train, label_test = train_test_split(text_split, label, random_state = 0)
# text(메일 내용)의 train과 test 를 나눠줌
# 정답인 label(ham인지 spam인지)도 train, test 따로 나눠줌
# random_state : 난수 고정 / test_size(default) : 0.25

print(len(text_train), len(text_test))   # 4169 / 1390
print(len(label_train), len(label_test)) # 4169 / 1390

# stop_words 설정 후 제거하기
# stop_words 설정하기(의미가 없다고 판단되는 단어들)
stop_words = ['are','a','just','in','','am','Am','also','to',
             'is','or','and','we','at','it','the','on','for','I','m',
             'by','i','on','an','By','be','me','that','Up','But','Are']

# stop words 제거 함수
def rm_stop(token):
    final = []
    for words in token:
        word_list = []
        for word in words:
            if word.split("/")[0] not in stop_words:
                word_list.append(word)
        final.append(word_list)
    return final

# text에 stop_words 제거하기
text_train = rm_stop(text_train)
text_test = rm_stop(text_test)
text_train



# Word2Vec(CBOW / skip-gram)
# 단어의 문맥적 의미를 보존하면서 단어를 벡터로 표현하는 과정 
- CBOW :  주변 N개의 단어들로 target단어를 예측
- skip-gram : target단어로 주변 N개 단어 등장여부를 예측

from gensim.models import Word2Vec
# Skip-gram (sg=1)
model1 = Word2Vec(text_train, size=100, window=10, min_count=10, workers=4, sg=1)
# CBOW (sg=0)
model2 = Word2Vec(text_train, size=100, window=10, min_count=10, workers=4, sg=0)

# size : 한 단어당 몇 차원의 벡터로 만들지
# window : 앞뒤 몇개의 단어를 사용할지
# min_count : 최소 등장 횟수(min_count이하인 단어는 제외)
# sg : CBOW(=0)로 할지 skip-gram(=1)으로 할지



# Text embedding 하기
from sklearn.feature_extraction.text import TfidfVectorizer
from collections import defaultdict
import numpy as np

# 문서 embedding
class TfidfEmbeddingVectorizer:
    def __init__(self, word2vec):
        self.word2vec = word2vec
        
    def transform(self, X):
        tfidf = TfidfVectorizer(analyzer = lambda x : x) 
        tfidf.fit(X)
        max_idf = max(tfidf.idf_) 
        word2weight = defaultdict(lambda : max_idf, [(w, tfidf.idf_[i]) for w, i in tfidf.vocabulary_.items()]) 
        
        array_list =[]
        for words in X:
            array_list.append(np.array(np.mean([self.word2vec[w]*word2weight[w] for w in words if w in self.word2vec] or [np.zeros(100)], axis = 0)))
        return(array_list)

vec_tf_skip_gram = TfidfEmbeddingVectorizer(w2v_skip_gram)
vec_tf_CBOW = TfidfEmbeddingVectorizer(w2v_CBOW)
# skip-gram
train_tf_s = vec_tf_skip_gram.transform(text_train)
test_tf_s = vec_tf_skip_gram.transform(text_test)
# CBOW
train_tf_c = vec_tf_CBOW.transform(text_train)
test_tf_c = vec_tf_CBOW.transform(text_test)


# Support Vector Machine
from sklearn.svm import SVC
clf1 = SVC(decision_function_shape='ovo') # SVM 만들기
svc_clf_s = clf.fit(train_tf_s, label_train)  # skip-gram
svc_clf_c = clf.fit(train_tf_c, label_train)  # CBOW

# 예측값 뽑아내기
svc_pred_s = svc_clf.predict(test_tf_s) # skip-gram
svc_pred_c = svc_clf.predict(test_tf_c) # CBOW

# 정확도 확인
from sklearn import metrics
print(metrics.classification_report(label_test, svc_pred_s)) # skip-gram
precision recall f1-score support
        ham       0.98      0.96      0.97      1221
       spam       0.75      0.82      0.79       169

avg / total       0.95      0.95      0.95      1390

print(metrics.classification_report(label_test, svc_pred_c)) # CBOW

precision recall f1-score support

        ham     0.88        1.00      0.94      1221 

       spam      0.00       0.00      0.00       169 

          

avg / total       0.77       0.88      0.82      1390


# Skip_gram이 성능이 훨씬 좋다. 
# 따라서, skip_gram으로 처리한 text로 다른 모델(K-NN, RF)도 만들어보자


# K-Nearest Neighbor
from sklearn import neighbors, datasets
clf = neighbors.KNeighborsClassifier()
knn_clf = clf.fit(train_tf_s, label_train)
knn_pred = knn_clf.predict(test_tf_s)
knn_pred

print(metrics.classification_report(label_test, knn_pred))
             precision    recall  f1-score   support

        ham       0.98      0.98      0.98      1221
       spam       0.88      0.86      0.87       169

avg / total       0.97      0.97      0.97      1390


# 랜덤 포레스트
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier()
RF_clf = clf.fit(train_tf_s, label_train)
RF_pred = RF_clf.predict(test_tf_s)
RF_pred
print(metrics.classification_report(label_test, RF_pred))
              precision    recall  f1-score   support
        ham       0.98      0.99      0.98      1221
       spam       0.91      0.86      0.88       169

avg / total       0.97      0.97      0.97      1390


List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 R 소스 공유 게시판 이용 관련 공지사항 1 DataMarket 2014.05.21 13222
92 투빅스 7&8기 9주차 과제 Neural Network를 이용한 MNIST 분류 - 8기 김민정 민정e 2017.09.23 235
91 투빅스 7&8기 9주차 과제 Neural Network를 이용한 MNIST 분류 - 8기 최서현 최서현 2017.09.22 202
90 투빅스 7&8기 7주차 과제 유기동물 과제 - 8기 조양규 dial123 2017.09.14 308
89 투빅스 7&8기 7주차 과제 유기동물입양예측 - 8기 김강열 김강열 2017.09.14 325
» 투빅스 7&8기 6주차 과제 word2vec - 8기 황다솔 다솔 2017.08.31 479
87 투빅스 7&8기 6주차 과제 TF-IDF 문서유사도 측정 - 8기 최서현 최서현 2017.08.31 366
86 투빅스 7&8기 5주차 과제 Selenium Crawling - 8기 김강열 김강열 2017.08.24 506
85 투빅스 7&8기 5주차 과제 Image Augmentation - 8기 김민정 김소희 최수정 황다솔 file 민정e 2017.08.24 458
84 투빅스 7&8기 5주차 과제 Beautiful Soup 이용한 Crawling - 8기 류호성 file 류호성 2017.08.24 456
83 투빅스 7&8기 4주차 과제 tree, RF, bagging, boosting 이용 분석 - 8기 조양규 file dial123 2017.08.17 510
82 투빅스 7&8기 4주차 과제 의사결정나무&랜덤포레스트 - 8기 김강열 김강열 2017.08.17 514
81 투빅스 7&8기 3주차 과제 클러스터링 구현 - 8기 권문정 김강열 이현경 조양규 1 이현경 2017.08.10 571
80 투빅스 7&8기 3주차 과제 PCA - 8기 이현경 file 이현경 2017.08.12 560
79 투빅스 7&8기 2주차 과제 연관성 분석 - 8기 조양규 file dial123 2017.08.03 571
78 투빅스 7&8기 2주차 과제 나이브베이즈 구현 - 8기 이현경 file 이현경 2017.08.03 531
77 투빅스 7&8기 2주차 과제 로지스틱/Ridge/Lasso&알고리즘 - 8기 김강열 file 김강열 2017.08.03 626
76 투빅스 7&8기 1주차 과제 알고리즘 - 8기 김강열 file 김강열 2017.07.27 672
75 투빅스 7&8기 1주차 과제 회귀분석 - 8기 황다솔 file 다솔 2017.07.27 820
74 투빅스 6&7기 8주차 과제 PCA(주성분 분석) - 7기 이동수 1 탱탱볼 2017.03.18 1679
73 투빅스 6&7기 8주차 과제 LBP 알고리즘 구현 - 7기 이광록 1 file 2017.03.16 1423
Board Pagination ‹ Prev 1 2 3 4 ... 5 Next ›
/ 5

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5