2015/01/24(土)フォーマルな英語を書く方法

指導教員(外国人)にメールを送る前に自分が書いた表現はフォーマルなのかどうかを調べて毎度かなり時間をとられるのでここにまとめておきます。

フォーマルな英語とインフォーマルな英語の違いは以下の通り

  • word choice
  • word usage
  • gramatical structure

フォーマルな英語を書くのに必要なことは以下の通り。

  1. 句読点 (punctuation) を正しく使う(&はandと書くなども)
  2. ありふれた口語単語や口語表現を避けよ(movie は film にするなど)
  3. 短縮形を使うべからず(can't は cannot にするなど)
  4. 一人称と二人称を避けるように試みる(主観が入らないように)
  5. 文をcoordinate conjunction (And, But, So, Or) などで始めない
  6. 常套句は避けよ
  7. ステージディレクションを避けよ
  8. 曖昧な単語を避けよ(a few, enough など)
  9. 関係代名詞を省略するな

7のステージディレクションってなんのこっちゃと思って調べましたが、要するに「I am writing to you to ask you ...」とか書かず、もっと簡潔に伝えたいことを伝えればいいようです。

9は「that」の使用は避けて「which」「whom」「who」を使うほうがいいようです。

それぞれの詳細は以下のURLを参照してください。 http://www.wikihow.com/Avoid-Colloquial-(Informal)-Writing

以下の動画も参考になります。

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='')