順調にいけば来年の4月に第一子が生まれる予定であるので,学芸大学近くのコジャレたわんこカフェでランチを食べながら家族会議を開いたのである。結果,子供の名付けの方針を以下のように決定した。
- 良い意味を持った漢字を使いたい
- 字面にはこだわりたい
- 読みにもこだわりたい
- 画数はこだわらないけど良いに越したことはない
- ドキュンネームは避ける
かなり盛りだくさんの指針であり,名付けの作業は相当難航することが予想される。漢字とか読みとかをあたえると名前を生成してくれるようなプログラマブルな仕組みが必要だな,と思ったのはそのためであった。
iPhoneアプリ作ろうかとか,Webアプリにしようかなどと妄想ばかりふくらむのは世の常なのだが,使い勝手は悪くてもデータ量が豊富な方がよいだろうな,と思ったのでPythonの名付け支援ライブラリ japanesenames を作ってみた。
名前のリストはWebからスクレイピングして得ているのだけど,網羅的な名前のリストと言ってもたかだか数万のオーダーと分かったので,いちいちデータベース化することもない。正規表現とか使って都度必要なデータを抽出すればよい。何が言いたいかというと,実装速度優先で処理は富豪的である(でも十分に実用的)。今後はスクレイプ先を追加したり,画数関連のメソッドを充実させようかな。
使い方
ライブラリを使う前に,make_data.pyを動かして名前のデータをスクレイピングして書き出しておくこと。
Collectionクラスを使うと,特定の漢字やふりがなだけを含む名前の集合を得ることが出来る。
たとえば,自分の名前にある漢字の一文字を子供の名前につけたいと思ったとしよう。
>>> # Collectionクラスをインポート >>> from japanesenames.collection import BoysNameCollection as BNC >>> # クエリを実行するためにオブジェクトを作る >>> q = BNC() >>> # '淳'という字を含む名前 >>> q.contains(u'淳') >>> # いくつあるか表示 >>> print len(q) 61 >>> # ふりがなを与えてさらにコレクションを制約 >>> q.contains_in_furigana(u'あ') >>> print len(q) 40
Collectionオブジェクト自体はイテレータを返す。リストに変換して要素を表示する。
>>> print list(q) [Name(name=u'淳夢', furigana=u'あつむ'), ...] >>> # リスト内包表記を使って'あつし'という読みの名前を除外 >>> [x for x in q if x.furigana != u'あつし'] [Name(name=u'淳夢', furigana=u'あつむ'), ...]
名前を表現するオブジェクトはNameオブジェクトである。Nameオブジェクトはハッシャブルなので,setの要素にできる。名前のsetを使うと,集合演算使って名前を絞り込むことが出来る。
>>> q1 = BNC() >>> q1.contains(u'淳') >>> q2 = BNC() >>> q2.contains_in_furigana(u'あつ') >>> # 'あつ'というふりがなを含む名前を除外し,似た読みを避ける >>> set(q1) - set(q2) set([Name(name=u'淳規', furigana=u'じゅんき'), Name(name=u'淳平', furigana=u'じゅんぺい')...])
Nameオブジェクトはkakusu()メソッドを持ち,画数を容易に計算できる。
>>> # show kakusu of each name >>> [(x, x.kakusu()) for x in set(q1) - set(q2)] [(Name(name=u'淳規', furigana=u'じゅんき'), 22), (Name(name=u'淳平', furigana=u'じゅんぺい'), 16)....]