하루 하루

NLTK - Learning to Classify Text ( 1 ) 본문

IT/Artificial intelligence

NLTK - Learning to Classify Text ( 1 )

san_deul 2020. 5. 24. 16:59

Supervised Learning for document classification

(https://youtu.be/kxImnFg4ZiQ) 

단계

1. Data preaparation

2. Text preprocessing

male. txt에 있는 이름들에 male이라고 레이블을 붙이고, 

female.txt에 있는 이름들에 female이라고 레이블을 붙여서 데이터를 준비했다. 

 

from nltk.corpus import *
import random
labeled_names = ([(name, 'male') for name in names.words('male.txt')] +
                 [(name, 'female') for name in names.words('female.txt')])
#male.txt 의 단어에 male이라고 레이블을 붙였다.
#Female.txt 의 단어에 Female이라고 레이블을 붙였다.
random.shuffle(labeled_names)
labeled_names

 

3. Feature enginerring

독이 있는 뱀을 찾아 낼 때, 색을 기준으로 색이 화려하면 독이 있는 뱀이라던지,

머리가 큰 뱀이 독이 있는지 등을 그 기준을 설정하는 단계!

해당 예제에서는 이름의 마지막 글자 ( word[-1] ) 가 성별을 결정하는 중요 기준이라고 설정하였다. 

def gender_features(word):
        return {'last_letter': word[-1]}
featuresets = [(gender_features(n), gender) for (n, gender) in labeled_names]
featuresets
# feature를 끝나는 단어로 설정했다. 

4.  Train and evaluate models

나이브베이지안 알고리즘을 사용해서 train을 하였다. 

train_set, test_set = featuresets[500:], featuresets[:500]
classifier = nltk.NaiveBayesClassifier.train(train_set)
#나이브베이지안 알고리즘 사용 
print("Gender Classification:", nltk.classify.accuracy(classifier, test_set))
# 테스트 네임 

 

결과적으로 80%의 정확도를 보였다

 

 

classifier.show_most_informative_features(5)
classifier.classify(gender_features('James'))

* nltk.classify.apply_features

많은 양의 데이터를 처리해야하는 경우 해당 함수를 이용할 수 있다. 

 

overfit / underfit 

def gender_features2(name):
    features = {}
    features["first_letter"] = name[0].lower()
    features["last_letter"] = name[-1].lower()
    for letter in 'abcdefghijklmnopqrstuvwxyz':
        features["count({})".format(letter)] = name.lower().count(letter)
        features["has({})".format(letter)] = (letter in name.lower())
    return features

와 같이 feature를 많이 적용하게 되면 overfitting 되면서 

featuresets = [(gender_features2(n), gender) for (n, gender) in labeled_names]
train_set, test_set = featuresets[500:], featuresets[:500]
classifier = nltk.NaiveBayesClassifier.train(train_set)
print(nltk.classify.accuracy(classifier, test_set))

 

이전보다 작은 정확도를 보이게 된다.

 

* training set / dev-text set  / test set

 dev-text set  -> error를 개선하는 것에 사용되는 데이터 

 

 

 

Comments