아래 글은 책(“Natural Language Processing with Python” )의 예제에 알파벳 bigram feature를 추가해서 실험 한 결과이다.
(이 부분에 대한 명시 없이 글을 써놓고 있다가 댓글에서 지적을 받아 수정했다. 코드예제 책을 보며 작성하고 시간이 많이 흐른 뒤에 해당 코드를 사용해서 포스팅을 하다보니 본의아니게 큰 실수를 하고 말았다. 나중에라도 이런 명시가 없어서 벌어질 사태를 생각하면 지적해준 분에게 너무 감사하다. 고의성 부분은 예전에 작성한 http://freesearch.pe.kr/archives/2379 도 해당 책의 개념을 기반으로 유전알고리즘을 본인이 작성한것이라는것을 확인해 보시면 어느정도 참고가 될거라 생각한다. 창피한 나머지 글을 삭제하려 하다가 추후 이런일이 없게 교훈으로 삼기 위해 이렇게 코멘트를 넣고남겨둔다. 먼저 위책의 저자와 블로그 독자분에게 죄송하다는 마음을 전하고 싶다.)
nltk corpus에 있는 영어 이름 데이터베이스를 사용해서 모델 빌드를 한 예제이다.
데이터가 충분하니(55869개나 된다. @.@) 간단한 알고리즘을 사용해도 충분히 성능이 나올거라는 생각에 베이지언으로 돌려봤다(여러 다른 알고리즘을 사용할 수 있다. 그러기 위해서는 feature를 뽑는 다른 방법들을 사용할 필요가 있는데 이 부분은 다루지 않았다).
아래는 Python 코드
__author__ = 'gogamza' from nltk.corpus import names import nltk def gender_feature1(word): return {'last_letter':word[-1]} def gender_feature(word): bigram = [("".join(gram).lower(), "".join(gram).lower()) for gram in nltk.bigrams(word)] + \ [('last_letter', word[-1]), ('first_letter', word[0])] return dict(bigram) if __name__ == "__main__": import random names = ([(name, 'male') for name in names.words('male.txt')] + [(name, 'female') for name in names.words('female.txt')]) random.shuffle(names) featuresets = [(gender_feature(n), g) for (n, g) in names] train_set, test_set = featuresets[900:], featuresets[:900] model = nltk.classify.NaiveBayesClassifier.train(train_set) #model = nltk.classify.DecisionTreeClassifier.train(train_set) print nltk.classify.accuracy(model, test_set)
ps. This code came mainly from “Natural Language Processing with Python“.
몇번 돌려보니 “81 ~ 83”%의 정확도를 보여줬으며.. 5번 시행시 평균 82% 정도의 정확도를 보여주고 있었다.
요런 바이너리 분류기의 경우는 우연히 정답을 맞출 가능성도 있기 때문에 성능 측정 방법에 신중을 기해야 하는데, 그에 대한 이야기는 나중에 기회되면 하도록 하겠다.
잘못 분류한 데이터를 위 코드를 통해서 뽑아보면 다른 속성 추가도 가능할 것이다. 이걸 error analysis라고 하는데, 해보실 분들은 직접 디버깅 해보시기 바란다.
한글 이름 데이터도 해보면 재밋을거 같은데….. 아마도 요런 데이터는 대규모 인터넷 사이트나 대법원 같은 국가 기관에서 관리하지 않을까 한다. 무엇보다 이런 데이터 공개가 원활한 외국이 부러울 따름이다.
한글 이름의 경우에는 자소단위로 파싱을 해야 할 것이다. 근데 데이터가 아주 아주 많다면 그도 필요없을 수 있다.
언젠가 기회되면 nltk 데이터를 기반으로 뉴스 기사 분류기도 한번 만들어 보겠다.
이름만으로 성별 구분 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.