이름만으로 성별 구분

아래 글은 책(“Natural Language Processing with Python” )의 예제에 알파벳 bigram feature를 추가해서 실험 한 결과이다.

(이 부분에 대한 명시 없이 글을 써놓고 있다가 댓글에서 지적을 받아 수정했다. 코드예제 책을 보며 작성하고 시간이 많이 흐른 뒤에 해당 코드를 사용해서 포스팅을 하다보니 본의아니게 큰 실수를 하고 말았다. 나중에라도 이런 명시가 없어서 벌어질 사태를 생각하면 지적해준 분에게 너무 감사하다. 고의성 부분은 예전에 작성한 https://freesearch.pe.kr/archives/2379 도 해당 책의 개념을 기반으로 유전알고리즘을 본인이 작성한것이라는것을 확인해 보시면 어느정도 참고가 될거라 생각한다. 창피한 나머지 글을 삭제하려 하다가 추후 이런일이 없게 교훈으로 삼기 위해 이렇게 코멘트를 넣고남겨둔다. 먼저  위책의 저자와 블로그 독자분에게 죄송하다는 마음을 전하고 싶다.)

nltk corpus에 있는 영어 이름 데이터베이스를 사용해서 모델 빌드를 한 예제이다.


데이터가 충분하니(55869개나 된다. @.@) 간단한 알고리즘을 사용해도 충분히 성능이 나올거라는 생각에 베이지언으로 돌려봤다(여러 다른 알고리즘을 사용할 수 있다. 그러기 위해서는 feature를 뽑는 다른 방법들을 사용할 필요가 있는데 이 부분은 다루지 않았다).

아래는 Python 코드

[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)
[/python]

ps. This code came mainly from “Natural Language Processing with Python“.

몇번 돌려보니 “81 ~ 83”%의 정확도를 보여줬으며.. 5번 시행시 평균 82% 정도의 정확도를 보여주고 있었다.

요런 바이너리 분류기의 경우는 우연히 정답을 맞출 가능성도 있기 때문에 성능 측정 방법에 신중을 기해야 하는데, 그에 대한 이야기는 나중에 기회되면 하도록 하겠다.


잘못 분류한 데이터를 위 코드를 통해서 뽑아보면 다른 속성 추가도 가능할 것이다. 이걸 error analysis라고 하는데, 해보실 분들은 직접 디버깅 해보시기 바란다.


한글 이름 데이터도 해보면 재밋을거 같은데….. 아마도 요런 데이터는 대규모 인터넷 사이트나 대법원 같은 국가 기관에서 관리하지 않을까 한다. 무엇보다 이런 데이터 공개가 원활한 외국이 부러울 따름이다.

한글 이름의 경우에는 자소단위로 파싱을 해야 할 것이다. 근데 데이터가 아주 아주 많다면 그도 필요없을 수 있다.


언젠가 기회되면 nltk 데이터를 기반으로 뉴스 기사 분류기도 한번 만들어 보겠다.

0 0 votes
Article Rating
Subscribe
Notify of
guest

11 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
윤남식

비슷한 통계조사를 아래의 링크에서 했었네요..

http://openlook.org:625/blog/2008/05/27/my-name/

극악

왠지 국내에서는 마법의 숫자 ‘주민등록번호’로 남자인지 여자인지 알아낼거 같군요 -_-;;

lexif-dev

http://openlook.org:625/blog/2008/05/17/statistics-of-korean-names/
한국에도 이런 작업을 한 분이 계시죠.
http://openlook.org:625/app/nameanalysis/ 직접 자기 이름을 넣어서 결과를 볼 수도 있어요

Copy_example

양아치 짓 하시네요.. 이런 일은 미쿡에서는 있을 수 없죠..
[Natural Language Processing With python]에서 223 페이지 예제 잖아요..ㅋㅋㅋ
그대로 카피 했는데요.. 실험 잘 하셨네요..

Anonymous

아.. 죄송합니다. 제가 이 글을 쓸때 그 책의 코드를 보고 있었던게 맞습니다.
제가 그 부분 명시했어야 하는데 너무 쉽게 포스팅을 날린거 같네요.

앞으로는 더욱더 주의하도록 하겠습니다.

그리고 글에는 바로 해당 부분 주석 넣도록 하겠습니다.

지적 감사드립니다.

ps. 좀더 부드럽게 지적을 써주셨으면 좋았을 거란 생각을 다시 해봅니다. ^^;

오종화

적은량의 한글데이터만 가지고라도 위의 nltk 프로그램을 혹시 돌려보신 것 있으신가요?  

gogamza

데이터가 없어서 돌려보질 못했습니다. 
그렇다고 만들어서 돌리기도 좀 그렇구요… 최근에는 nltk보다 R을 주로 사용하고 있는 관계로 이 코드하고는 더 멀어진듯 합니다. 

마르

역시 미국에서도 비슷한 시도가 있군요. 한글 이름을 분석하려고 알아보던중 들렸습니다. 덧글의 지적에 바로 반성하고 코멘트 추가하신거 보니 존경스럽네요.

gogamza

이 글을 보니 정말 예전 심장이 쫄깃했던 경험이 다시 생각나네요. ^^; 역시 공개된 장소에 글을 쓰는 사람으로서 조심해야 될 부분이라 생각을 해봅니다.