2015/01/18(日)Python勉強メモ#5「homura と madoka で形態素の頻度を数えよ」
あらかじめ「pip」とかで「homura」と「madoka」を入れておきましょう。
まずはダウンローダーの「homura」で形態素解析済みの青空文庫のデータをダウンロード。
my-mbp% ipython
Python 3.4.2 (default, Jan 12 2015, 11:46:28)
Type "copyright", "credits" or "license" for more information.
IPython 2.3.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: from homura import download
In [2]: download('http://aozora-word.hahasoha.net/utf8/newnew.csv.gz')
100% 615.8 MiB 11.1 MiB/s 0:00:00 ETA
適当に解凍したら「madoka」(Pythonの辞書より省メモリかもしれないデータ構造を提供するライブラリ)で形態素をカウントです。(Madokaの詳細: http://s-yata.github.io/madoka/index.ja.html)
#!/usr/bin/env python
import madoka
sketch = madoka.Sketch()
with open('newnew.csv', 'r') as f:
for line in f:
morpheme = line.split(',')[3]
sketch[morpheme] += 1
print(morpheme)
print(sketch['人'])
print(sketch['面倒'])
print(sketch['蕩尽'])
出力された頻度(推定値)は以下のようになりました。
1418808
57427
1910
実際の頻度は以下の通り。
#!/usr/bin/env python
from collections import Counter
cnt_of = Counter()
with open('newnew.csv', 'r') as f:
for line in f:
morpheme = line.split(',')[3]
cnt_of[morpheme] += 1
print(morpheme)
print(cnt_of['人'])
print(cnt_of['面倒'])
print(cnt_of['蕩尽'])
217837
1738
23
2015/01/16(金)Python勉強メモ#4「ベンチマークをとれ」
PyPIにある「Benchmarker」を利用。コードはひらがなリストを作る処理です。リスト内包表記が最速でした。
#!/usr/bin/env python
from benchmarker import Benchmarker
with Benchmarker(1000*100, width=20) as bench:
code_point = range(0x3040, 0x30A0)
@bench('1')
def _(bm):
for i in bm:
moji_list = []
for cp in code_point: moji_list.append( chr(cp) )
@bench('2')
def _bm(bm):
for i in bm:
moji_list = [ chr(cp) for cp in code_point ]
@bench('3')
def _bm(bm):
for i in bm:
moji_list = list(chr(cp) for cp in code_point)
## benchmarker: release 4.0.1 (for python)
## python version: 3.4.2
## python compiler: GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)
## python platform: Darwin-14.0.0-x86_64-i386-64bit
## python executable: /Users/username/.anyenv/envs/pyenv/versions/3.4.2/bin/python
## cpu model: Intel(R) Core(TM) i5-4258U CPU @ 2.40GHz
## parameters: loop=100000, cycle=1, extra=0
## real (total = user + sys)
1 3.1367 3.0500 3.0200 0.0300
2 2.4863 2.4300 2.4200 0.0100
3 2.8027 2.7300 2.7100 0.0200
## Ranking real
2 2.4863 (100.0) ********************
3 2.8027 ( 88.7) ******************
1 3.1367 ( 79.3) ****************
## Matrix real [01] [02] [03]
[01] 2 2.4863 100.0 112.7 126.2
[02] 3 2.8027 88.7 100.0 111.9
[03] 1 3.1367 79.3 89.3 100.0
2015/01/15(木)Python勉強メモ#3「Unicodeブロック:Hiragana のコードポイントとその文字の順序付き辞書を作り、すべて出力せよ」
ワイの書いたコード↓
#!/usr/bin/env python
from collections import OrderedDict
code_point_list = range(0x3040, 0x30A0)
chara_list = [ chr(code_point) for code_point in code_point_list ]
moji_dict = OrderedDict(); # 登録順序を記憶
moji_dict.update([ tuple([ code_point, chara ]) for code_point, chara in zip(code_point_list, chara_list) ])
moji_dict.update({ 0x303F: chr(0x3020) }) # 順序が保持されているか確認用
for key, value in moji_dict.items():
print('U+{0:X} {1}'.format(key, value))
U+3040
U+3041 ぁ
U+3042 あ
U+3043 ぃ
U+3044 い
U+3045 ぅ
U+3046 う
U+3047 ぇ
U+3048 え
U+3049 ぉ
U+304A お
U+304B か
U+304C が
U+304D き
U+304E ぎ
U+304F く
U+3050 ぐ
U+3051 け
U+3052 げ
U+3053 こ
U+3054 ご
U+3055 さ
U+3056 ざ
U+3057 し
U+3058 じ
U+3059 す
U+305A ず
U+305B せ
U+305C ぜ
U+305D そ
U+305E ぞ
U+305F た
U+3060 だ
U+3061 ち
U+3062 ぢ
U+3063 っ
U+3064 つ
U+3065 づ
U+3066 て
U+3067 で
U+3068 と
U+3069 ど
U+306A な
U+306B に
U+306C ぬ
U+306D ね
U+306E の
U+306F は
U+3070 ば
U+3071 ぱ
U+3072 ひ
U+3073 び
U+3074 ぴ
U+3075 ふ
U+3076 ぶ
U+3077 ぷ
U+3078 へ
U+3079 べ
U+307A ぺ
U+307B ほ
U+307C ぼ
U+307D ぽ
U+307E ま
U+307F み
U+3080 む
U+3081 め
U+3082 も
U+3083 ゃ
U+3084 や
U+3085 ゅ
U+3086 ゆ
U+3087 ょ
U+3088 よ
U+3089 ら
U+308A り
U+308B る
U+308C れ
U+308D ろ
U+308E ゎ
U+308F わ
U+3090 ゐ
U+3091 ゑ
U+3092 を
U+3093 ん
U+3094 ゔ
U+3095 ゕ
U+3096 ゖ
U+3097
U+3098
U+3099 ゙
U+309A ゚
U+309B ゛
U+309C ゜
U+309D ゝ
U+309E ゞ
U+309F ゟ
U+303F 〠
2015/01/15(木)Python勉強メモ#2「Unicodeブロック:Hiragana の文字をすべて出力せよ」
#!/usr/bin/env python
for cp in range(0x3040, 0x30A0): print(chr(cp), end=' ')
出力:
ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た だ ち ぢ っ つ づ て で と ど な に ぬ ね の は ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ ゐ ゑ を ん ゔ ゕ ゖ ゙ ゚ ゛ ゜ ゝ ゞ ゟ
ちなみにPerlで書くと↓のようになります。
#!/usr/bin/env perl
use open qw/:utf8 :std/;
print chr . ' ' for 0x3040 .. 0x309F;
16進数を「0x」で表現できる点はPythonのほうが好きです。
Perlでも「0x」使えました。(汗)
追記: Python版はリスト内包表記のほうがいいですかね。
#!/usr/bin/env python
[ print(chr(cp), end=' ') for cp in range(0x3040, 0x30A0) ]
これでもいけますね。
#!/usr/bin/env python
print(' '.join(chr(cp) for cp in range(0x3040, 0x30A0)), end='')
2013/05/16(木)Perl勉強メモ #003 グラフ描く
「Graphviz::DSL」がレポートで活躍しています。
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Graphviz::DSL;
use open IO => qw/:utf8 :std/;
my $graph = graph {
name 'Miscellaneous Symbols';
global rankdir => 'LR';
my $cnt = 0;
for my $dec ( hex('2600') .. hex('2609') )
{
$cnt++;
my $char = chr $dec;
node "node${cnt}", shape => 'record', label => "{<p>$char|<n>}";
}
while ($cnt > 1)
{
edge [ "node" . ($cnt - 1) . ":n" => "node" . $cnt . ":p" ];
$cnt--;
}
};
$graph->save(path => 'symbols', type => 'png', encoding => 'utf-8');
だけで以下のグラフが出ます。
日本語WordNetに使うとかなり面白いグラフが出ます。
こんなんして意味あんのか?と思ってたけど、ログを解析してOSのデッドロック状態をグラフで表したりすると全然わかりやすさが違って驚きました。