設問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ならば男性名と言えそうです。
更なる分析が必要となりますね。