設問2:英語の男女人名の違いを調べてみよう!

CodeIQに出題した設問2の解説。

Python自然言語処理パッケージNLTKをインストールすること。以下のURLを参照して下さい。
http://www.nltk.org/

NLTKにはフリーの英語人名データが収録されています。
下記のようにパッケージを読み込んでプログラミングしてください。

from nltk.corpus import names

下記のコマンドで男女の人名ファイル名を取得できます。

names.fileids()

namesに収録されている男女の人名ファイルを読み込んで、語末のアルファベット1文字による人名の頻度表を作成してください。例えば、'John'であれば、'n'が1回と数えます。

NLTKのConditionalFreqDist関数を使って、頻度の集計をしてください。
ConditionalFreqDist内のペアは('a', 'female.txt')のような順序でプログラムを作成すること。

出力ファイルは、ヘッダーを付けて、カンマ区切りのCSV形式で以下の通り。
アルファベット順で出力すること。
1カラム目 語末の1文字
2カラム目 女性人名の頻度
3カラム目 男性人名の頻度

WordEnding,female.txt,male.txt
,1,0
a,1773,29
c,0,25
b,9,21
(以下省略)

[注意]namesの収録データ不備により、女性名'Gale 'が含まれており、語末をとると空白' 'になってしまいます。今回は出力ファイルからこの欄を除く必要はありません。

nltkでデータをダウンロード出来ない時は、下記のサイト内の32. Names Corpusからダウンロードしてください。
http://nltk.googlecode.com/svn/trunk/nltk_data/index.xml

提出物
解答は、テキストファイルをアップロードしていただきます。1枚のテキストファイルにして、提出してください。

提出する内容は以下の通り。
1. 出現頻度を出力するPythonの処理プログラム。
2. 男女の人名の語末文字の上位3位は何であるか。上位3位の語末文字から何が言えるか、気づいた点を書いてください。

参考文献
・Steven Bird 「入門 自然言語処理オライリー・ジャパン
 http://www.amazon.co.jp/gp/product/4873114705
・上記の書籍の英語版はオンラインで読めます。
 Natural Language Processing with Python --- Analyzing Text with the Natural Language Toolkit
 Steven Bird, Ewan Klein, and Edward Loper
 O'Reilly Media, 2009.
 http://nltk.org/book/

解答のポイントは次の三つです。
1. NLTKで複数のファイルを扱う。
2. ConditionalFreqDist関数を使って、条件付き頻度分布オブジェクトを生成する。
3. 頻度出力の為のループの書き方。

プログラムの例は以下の通り。

#!/usr/bin/python
#
#                               names.py
#

import nltk
from nltk.corpus import names

def main(o_file):

    cdf = nltk.ConditionalFreqDist(
        (word.lower()[-1:], fileid)
        for fileid in names.fileids()
        for word in names.words(fileid))

    ### OUTPUT ###
    o_handle = open(o_file, 'w')
    s = 'WordEnding,'
    s += ','.join(names.fileids())
    o_handle.write('%s\n' % s)
    for target in cdf.keys():
        s = target
        for fileid in names.fileids():
            s += ',%d' % cdf[target][fileid]
        o_handle.write('%s\n' % s)

###
main('names.out')

出力は以下の通り。

WordEnding,female.txt,male.txt
 ,1,0
a,1773,29
c,0,25
b,9,21
e,1432,468
d,39,228
g,10,32
f,2,25
i,317,50
h,105,93
k,3,69
j,1,3
m,13,70
l,179,187
o,33,165
n,386,478
p,2,18
s,93,230
r,47,190
u,6,12
t,68,164
w,5,17
v,2,16
y,461,332
x,10,10
z,4,11

気づいた点。
頻度の上位三位を調べると、女性名はa,e,yで語尾で多く、男性名はn,e,yが多い。語尾がaならば、女性名、語尾がnならば男性名と言えそうです。
更なる分析が必要となりますね。