FrontPage / Learning Programming

概要

  • Unix環境でのプログラミング方法,研究室の実験環境を学ぶ
  • 自然言語処理で頻繁に使われる処理を題材としてプログラミング演習を行うことで,スムースに研究に取り組める力を養います

内容

  1. Unix環境でのプログラミング方法
  2. 研究室の実験環境
  3. Pythonプログラミングのチュートリアル
    • Pythonの基本的な使い方.ipythonの使い方,pipの使い方など
    • 分からないことはどう調べれば良いのか
  4. 言語処理100本ノック 2015
    • 自然言語処理に関するプログラムを実際に作ってもらい,互いにコードレビューを行います。
    • 問題に対する答えは一つではありません。どんな方法でも,無理矢理でも解いてみてください。

2017年度

日時
火曜日 13:00-14:30
参加者
阿部,伊藤,栗林,田上,吉成,王, 白井, 中村
書いたコード
https://github.com/cl-tohoku/100knock-2017

scalaで書いてみた 000-059(松林) ソースコードの場所はこのページの編集コメントに書いてあります。

記録のとり方

  • やったことだけ書く
  • 以前の記録と同じことを書いても良い
    • 何度も書かれているということは,それだけ重要だということを意味する

予定・記録

  • 7/24(月) 10:30-12:00
    • (45)-(46)
    • argparseは重要
      • ユーザーフレンドリーなコマンドラインインターフェースの提供
    • stringモジュールには様々な文字列定数が定義されている
      • punctuation
      • digits
      • ascii_letters
    • メソッドの戻り値は単純な形式にすべし
    • 既存のクラスにメソッドを追加するには
      • 別途定義した関数をクラスのアトリビュートにする
    • sorted()
      • 文字列は文字コードでソートされる
      • keyを指定するときはoperator.itemgetter()が便利
  • 7/3(月) 10:30-12:00
    • (42)-(44)
    • `do_something(morphs)` 的な関数は morphs が chunk に対する操作であれば Chunk クラスのメソッドにすべき
    • 一つの見方として,クラスはラクをするための手段
      • コードが重複してる匂いを感じたら,ラクをするためにメソッド化を検討する
    • メソッドの返り値を明示的に書かないと None が返る
      • None はブール値を評価するコンテキストでは False として評価されるが,False とは全く別物
    • `def f(**kwargs)` なる関数を定義して `f(key=val)` と呼び出すと `kwargs` には `{key: val}` のような辞書が入っている
    • DOT 言語:グラフ記述言語
    • Python でグラフ構造を扱うためのライブラリ
      • graphviz
      • pygraphviz — Graphviz C ライブラリのラッパー
      • graphviz-python — Graphviz オフィシャルのバインディング
      • pydot — pure Python な DOT 言語パーザ+α
      • networkx — 大規模なグラフを考慮したライブラリ
    • dependency の向き
    • Universal Dependencies
    • メソッド名の動詞は原型にするか s を付けるか
      • インスタンスメソッドなら主語はほぼ必ず単数なので,s を付けるのが英語として自然
      • Java ならしつこく言われるが,Python ならそこまで気にしなくていい
  • 6/26(月) 10:30-12:00
    • (41)
    • 変数名・関数名
      • リーダブルコードは必読
    • メソッドをローカル変数へバインディングすることによってなぜ呼び出しが速くなるか
      • Python の名前解決の仕組み
    • ヘルパークラス,ヘルパー関数
    • `collections.abc`
      • `Sequence` を継承することで,「Morph を要素にもつ,シーケンスとしての Chunk」が持つべきメソッド群を少数のメソッドから生成できる
    • `classmethod`, `staticmethod`
      • `classmethod` デコレータの典型的な使いみちは複数のインスタンス化手段の提供
      • `staticmethod` デコレータはクラスに強く関係するがクラスの情報を使わなくても実現できる処理を実行するメソッドに付ける
    • `functools.lru_cache`
      • メソッドの入出力をキャッシュできる
    • Class and Object Oriented Programming 内部資料
  • 6/19(月) 10:30-12:00
    • (41)
    • enum.Enum()とcollections.namedtuple()
    • __str__()と__repr__()
    • テストコードを書く
      • assert文
    • cytoolz.nth()
    • アンパック代入
    • フラグ変数の命名
    • [[]] * n
  • 6/12(月) 10:30-12:00
    • (38)-(40)
    • Jupyter 上で図を表示したいときは `%matplotlib inline`
    • matplotlib でフォントを変更したいときは `plt.rcParams['font.family'] =` `'``フォント名``'`
      • Ubuntu では VL ゴシックや Takao ゴシックがデフォルトで使える日本語フォント
    • Numpy array
      • slicing
      • type
    • Zipf’s Law
    • pandas は必須
    • オブジェクト指向プログラミング (object-oriented programming; OOP) とは
    • Python における OOP イントロダクション
    • `__slots__`
    • `__str__`
    • `@classmethod`
  • 5/30(火) 13:00-14:30
    • (34)-(37)
    • 関数・変数名は3週間後の自分が見た時に分かるように命名する
      • 例:sent は word のリスト
      • `for word in sent: …`
    • 文字の連結では “+” ではなく `str.join()` や `str.format()` を有効活用する
      • タイプ量が少ないので
    • `print()` は重い
      • for 文の中で使われるとそこそこヤバい
    • `print()` のバッファリング
      • `flush=True` とすると強制的に出力がフラッシュされる
    • `list.clear()` vs. `list = []`
      • `list.clear()` は元々持ってるリストの要素を消去する
      • `list = []` は `list` に空リストを再代入し,元々持ってたリストは GC に回収させる
    • `itertools.groupby()`
      • (35) でも便利に使える
      • group はイテレータとして返されることに注意
      • group の中身を2回以上利用したい場合は一旦リストなどにする
    • `collections.Counter`
      • Counter object を逐次的に更新していく場合は `Counter.update()` を使う
    • `collections.defaultdict`(オレマジオススメライブラリ)
      • 単語をインデックスにマッピングする辞書を作る時に便利
      • `self.vocab = defaultdict(lambda: len(self.vocab))`
      • `dict.get(key, default)` でも同じことはできる
    • プロッティングライブラリいろいろ
      • matplotlib, seaborn, bokeh, plotly, pandas.plot, …
      • seaborn, pandas.plot は matplotlib のラッパー
      • 高レベルライブラリのどれかを覚えて使うとよい
    • 論文では図へのフォント埋め込みが要件となってる場合もある
      • `matplotlib.rc('pdf', fonttype=42)` で埋め込める
    • pandas は必須
  • 5/16(火) 13:00-14:30
    • (29)-(33)
    • HTTP, URI, HTML
    • Python で Web API を叩く時は requests ライブラリを使っておけば OK
      • URI の quoting も勝手にやってくれる
      • 標準ライブラリの urllib では urllib.parse.urlencode で
    • curl, wget
    • ジェネレータとは
      • サーバに優しいプログラミングを心がけよ
    • 変数名のネーミング
      • Google Python Style Guide https://google.github.io/styleguide/pyguide.html
      • module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_CONSTANT_NAME, global_var_name, instance_var_name, function_parameter_name, local_var_name
    • mecab の出力の解析に正規表現はオーバースペック
      • 速度的にボトルネックになる
    • itertools.islice
      • スライス記法 seq[start:stop:step] のイテレータ版
    • itertools.groupby (take home message)
      • キーが一致する系列をグルーピングできる
      • モチベ: EOS に囲まれた本当に欲しい情報をガポっと取ってきたい
      • 一行一行 EOS かどうかを見て処理を振り分けるのは面倒だしバグの温床になる
    • csv として処理する方法もある
      • 本当の csv ファイルを自分で str.split(',') などでパーズするのは非推奨
    • itertools.chain.from_iterable
      • iterable を flatten した上でイテレートできる
  • 5/9(火) 14:40-16:10
    • (26)-(28)
    • 記法は仕様を確認 e.g., MediaWiki
    • itertools
      • itertools.takewhile(), itertools.dropwhile()
      • itertools は遅延評価&可変長のシーケンスをパイプライン処理するのに便利=NLPに便利
      • itertools の reference は recipe まで含めて読むと良い
    • re.sub(pattern, repl, string, count=0, flags=0)
    • 括弧によるキャプチャ
      • (...) によってグループ化されたサブパターンにマッチした文字列はキャプチャされ後方参照に利用できる
      • (?:...) はキャプチャしない(後方参照用の番号を消費しない)、グループ化するだけ
      • (?P<name>...) 名前付きキャプチャ, (?P=name) 後方参照, \g<name> 置換先での参照
    • +?, *?: non-greedy
    • multiline, dotall
      • pcregrep -M, (?s)
      • grep -Pz, (?s)
      • perl -0p, (?s)
      • Python: re.DOTALL / re.MULTILINE
    • Python の関数は第一級オブジェクト、変数同様に利用できる
      • f = lambda x: ... でも def f(x) でも同様
    • メタ文字でない ' や < や括弧開き(e.g., [)が手前にない括弧閉じ(e.g., ])などはエスケープ不要
    • (?!...) 否定先読み
  • 4/25(火) 13:00-14:30
    • (24)-(25)
    • 閉じ角括弧`]`と閉じ中括弧`}`は前方に対応するエスケープされてない括弧がない限りはメタ文字ではない
      • `]` がメタ文字になるのは文字クラス内(2文字目以後)のみ
      • 例:`[]a]` と `[a\]]`,`[\]a]`は等価
    • match.end()
      • マッチした部分の末尾のインデックスを返す
    • match()は前方一致
    • cutコマンド
      • 疑問:delimiterがないのに2番目のフィールドが取れる
    • grepコマンドのオプション
      • `-P` Perl Compatible Regular Expression
      • `-e` 正規表現パターン(複数指定可)
      • `-o` マッチした部分だけ出力
    • 通常後読みする文字列は固定長でなければならない
    • pcregrep
    • pip
    • regex パッケージ
      • re よりも文法が潤沢
    • 言語=文字列の集合
    • 正規言語では表現できない処理
      • 後方参照,再帰,後読みアサーション
      • 基本的に重い
    • まとまった処理は関数にまとめる
    • collections.OrderedDict
      • 追加順を記憶する辞書型
    • pprintで見やすく出力
    • リダイレクションを左に書いても良い
      • 全て等価
      • command < filename
      • < filename command
      • cat filename | command
    • re.DOTALL
      • 本来.(ドット)に含まれない文字も.(ドット)に含むようにする
    • sedによる行の削除
      • sed -e '1d'で1行目を削除
    • 宿題:(25)のryo-tさんのコード を読み解いてくる
    • 余力のある人はitertoolsの公式ドキュメントを読む en, ja
  • 4/18(火) 13:00-14:30
    • (22) - (23)
    • ジェネレータとイテレータの違い
    • re
    • 肯定/否定 の 先読み/後読み
    • str.strip(), lstrip(), rstrip() は引数に文字集合を取る
    • マッチの一部のグループ化とキャプチャ
    • 控え目な量指定子
    • 後方参照
    • プロセス置換・コマンド置換
  • 4/11(火) 13:30-14:30
    • (21)
    • GNU とは
    • UNIX
      • macOS は BSD 派生
    • 書庫化と圧縮
      • tar, gzip, bzip2
    • 正規表現 HOWTO https://docs.python.jp/3/howto/regex.html
    • re.
      • compile()
      • search()
      • finditer()
      • findall()
    • print() の end 引数
    • 任意の文字にマッチするメタ文字とその任意回の繰り返し ".*" の多用に注意せよ
    • sed -n '/regex/p'
    • 正規表現の方言
      • POSIX BRE(grep, sed)(基本使わない)
      • POSIX ERE(grep -E, sed -r, sed -E)
      • PCRE(grep -P)
    • tee
    • パイプ,標準入力,標準出力,標準エラー出力
    • dir()
  • 4/6(木) 14:30-16:00
    • (9), (20)
    • ジェネレータ
    • Typoglycemia
    • 乱数生成アルゴリズム
      • 線形合同法
      • メルセンヌ・ツイスタ -- Python や他の多くのプログラミング言語で使われる
      • xorshift -- メルセンヌ・ツイスタに比べてより良い
    • Python の三項演算子
    • random.shuffle() は破壊的メソッド
      • cf. 副作用
    • list はミュータブル,tuple はイミュータブル
    • 研究のコードでは再現性確保の観点から乱数のシード値を必ず指定するべき
    • gzip ファイル
      • 圧縮: gzip,展開: gunzip
      • Python では gzip.open() で読む
    • デカいファイルを処理する時は head コマンド等で様子を見よ
    • Python での JSON の読み書き
      • json.{load, loads, dump, dumps}
    • 文字コード
      • ユニコード
      • utf-8
      • ascii
    • JSON Lines
      • 一行一 JSON なファイル
      • 標準化はされてない
    • jq コマンド
      • コマンドラインで JSON を扱う際のスタンダード
    • 正規表現とは
      • 正規表現の典型的な用途
    • 正規表現を書く時は online simulator と syntax diaglam を表示するツールを使うと良い
  • 3/31(金) 14:40-16:10
    • (5) - (8)
    • Jupyterlab
    • n-gram とは何か,なぜ使うのか
    • 標準出力と標準エラー出力
      • 標準出力にはプログラマが欲しい出力が吐き出されると期待する
      • エラー情報は標準出力ではなく,標準エラー出力に吐き出そう
      • Python なら sys.stderr.write()
    • エラーコード
      • sys.exit(0以外) とすれば,OS にプログラムが異常終了したことを伝えられる
      • エラーコードにはそれぞれ意味が与えられているが,とりあえず 1 にしておけば OK
    • Jupyter notebook 上では if __name__ == '__main__': main() は面倒なので書かなくていい
      • 本来の目的はスクリプトが import された時の名前空間の汚染を防ぐため
    • n-gram を構成したいシーケンスが sequence プロトコルをサポートしない場合の書き方
      • Python におけるイテレータとは
    • nltk
      • Python で自然言語処理するための標準的なツールセット
      • nltk.util.ngrams
    • set に定義された各種メソッド,オペレータ
    • 色々な呼び出し方
      • set.intersection(X, Y)
      • X.intersection(Y)
      • X & Y
      • どれを使ってもいいが,一貫性をもたせることが重要
    • "set X and set Y" で集合 X, Y の intersection を表現すると数学警察が出動する
    • フォーマット文字列
      • % による記法
      • str.format()
      • f'{式}'(Python 3.6 以降)
    • str.islower()
      • str に大文字・小文字の区別がない文字を含む場合の奇妙な振る舞いに注意
      • 全角英数字も区別できて便利
    • 文字コード
      • ASCII テーブル
    • ord(), chr()
    • 暗号化 <-> 復号
    • 正規表現を書くときはテスターを使おう
  • 3/23(木) 15:00-17:00
    • (16) - (19)
    • 例外
      • Python における例外の投げ方
      • 研究レベルのコードでは例外処理を書く必要はない
      • エラーが発生するような状況ではプログラムに止まってもらった方が良い
    • ord()
    • %%bash
    • $()
    • 標準入力・標準出力・パイプ
    • split コマンドの使い方
    • numpy とは
    • set
      • set 内包表記
    • unix で sort するときは LC_ALL=C を指定すると速い
    • sorted(seq, key, reversed)
    • ラムダ式
    • collections.Counter
      • most_common([n])
    • list.count()
  • 3/9(木) 14:40-
    • (13) - (15)
    • ふつうのファイルは改行記号で終わる
      • POSIX の規格
    • zip() は短い方に合わせる
    • コードのパフォーマンスの測定の仕方
      • %%timeit
      • %timeit
      • %time
    • 副作用
    • PEP 498: 書式化済み文字列リテラル
      • Python 3.6 から f'{式}' が使える
    • file.readline() はファイル末尾まで読んだら空文字を返す
    • %file, %load
    • itertools.islice()
      • seq[start:stop:step] のイテレータ版
      • itertools は極めて重要
    • /dev/null : 不必要な出力のゴミ捨て場
    • queue module
    • collections.deque(デック)
  • 3/3(金) 14:40-
    • (10) - (12)
    • Appendix
    • git pull をするな
      • 明示的に fetch と merge を叩く
    • git branch -D master
    • IPython から UNIX コマンドを叩く方法
    • IPython での特殊な変数展開
      • $var, {var} : IPython で定義された変数が優先して展開される
      • $$var : シェルの環境変数が展開される
    • "$var" : ダブルクォートで囲うのは良い習慣
    • ディレクトリ構成
      • data/ : 加工前のデータを格納
      • work/ : 中間生成物を格納
    • sum(iterable)
    • 命名規則
    • docstring
    • with 構文
      • contextlib
    • file.open(filepath, mode, encoding)
      • mode はデフォルトで "r"
      • encoding は macOS で普通なら utf-8 だが,locale の設定によって変わる
    • file.close()
      • with 構文を使えば,with 以下の文が終了するか例外発生時に自動的に実行される
      • ファイルオブジェクトを変数に bind しなければ参照カウントが増えないので close() を呼ぶ必要もない
    • ファイル読み書き
      • file.read()
      • file.readlines()
      • file.write()
      • file.writelines()
    • ファイルオブジェクトはイテレータなので何度も read できない
    • 同じファイルを何度も読みたい時:
      • file.seek(0) : ストリームの位置を先頭にする.使えない場合もある
      • file.close() してから open() し直す
      • 同じ変数に bind し直せば古いファイルオブジェクトの参照カウントが減るので close() しなくても良い説
    • コマンドのオプションの調べ方
      • --help, -h
      • man
    • BSD 系と GNU 系コマンドの違い
    • wc, grep -c
    • sed, tr, expand
    • zip(*iterable) : 転置
      • 引数のアンパック
    • a, *b = iterable
      • アンパック代入
    • print() 関数の引数にファイルを指定できる
    • Python における iterable とは
  • 2/22(水) 14:40-
    • (4)
      • 連想配列
      • ハッシュテーブル
      • sequence の真偽値
      • enumerate()
      • 短絡評価
      • 三項演算子
      • item in seq の時間計算量
      • https://wiki.python.org/moin/TimeComplexity
      • 明示的な行継続
      • 非明示的な行継続
      • 辞書内包表記 (dict-comprehension)
      • dict() に tuple を生成する generator を渡す
      • 辞書内包表記に基づく方法と generator に基づく方法の速度差
      • 辞書内包表記の syntax は融通が効かない
      • itertools.starmap()
      • zip(*seq)
      • if __name__ == '__main__'
      • トップレベルの if 文以下の文は global な名前空間を汚す
      • Code Golf
      • False == 0, True == 1
      • Shift + Tab で docstring 表示
      • Ctrl + Shift + - でセル分割
      • Shift + j/k でセル複数選択
      • Shift + m で複数選択したセルの統合
  • 2/17(金) 14:40-
    • (0) - (3)
      • スライス
      • reversed()
      • イテレータ
      • 予約語
      • __builtin__
      • zip()
      • 内包表記
      • map, filter
      • ジェネレータ(オブジェクト,式)
      • next()
      • lambda
      • list.pop()
      • str.join()
      • str.format()
      • str.split()
      • str.strip()
      • 正規表現
      • re module
      • raw string
      • 文字列メソッドと re module のパフォーマンス
      • enumerate(seq, start)
  • 2/10(金) 14:40-
    • 各種設定

TA

研究室の実験環境など

Pythonプログラミングのチュートリアル

100本ノックコーチ割り当て

場所担当者
第1章: 準備運動高橋諒
第2章: UNIXコマンドの基礎中山
第3章: 正規表現横井
第4章: 形態素解析清野
第5章: 係り受け解析浅野
第6章: 英語テキストの処理赤間
第7章: データベース
第8章: 機械学習鈴木
第9章: ベクトル空間法 (I)
第10章: ベクトル空間法 (II)
代打

参考書

Linux 標準教科書 (Ver.1.1.0)
: Linux 標準教科書 (Ver.2.0)
cat, paste, join, grep, head, tail, cut, awk, sed, tr, sort, uniq, wc
http://d.hatena.ne.jp/mi_kattun/20100916/1284631280
grep
http://www.k-tanaka.net/unix/grep.html http://www.k-tanaka.net/unix/grep.html
zgrep, zdiff, zmore
http://net-newbie.com/linux/commands/index.html#MISC
bzgrep etc.
http://manpages.ubuntu.com/manpages/gutsy/ja/man1/bzgrep.1.html
nkf
文字コード変換コマンドnkfの使い方まとめ Linux http://blog.layer8.sh/ja/2012/03/31/nkf_command_option/
wc
http://www.k-tanaka.net/unix/wc.html
find
http://www.k-tanaka.net/unix/find.html

過去の記録


Last-modified: 2017-07-24 (Mon) 03:59:57 (4d)
© Inui-Okazaki Laboratory 2010-2017 All rights reserved.
Recent Changes
2017-07-28 2017-07-27 2017-07-25 2017-07-24
  • Learning Programming
2017-07-22 2017-07-21 2017-07-20 2017-07-19 2017-07-18 2017-07-14 2017-07-13 2017-07-12 2017-07-11 2017-07-10 2017-07-07 2017-07-06 2017-07-05 2017-07-04 2017-07-03 2017-07-01 2017-06-30 2017-06-29 2017-06-28 2017-06-27 2017-06-26 2017-06-24 2017-06-23 2017-06-22 2017-06-21 2017-06-20 2017-06-19 2017-06-18 2017-06-17 2017-06-16 2017-06-15 2017-06-14 2017-06-13 2017-06-12 2017-06-11 2017-06-10 2017-06-09 2017-06-08 2017-06-07 2017-06-06 2017-06-05 2017-06-04 2017-06-03 2017-06-02 2017-06-01 2017-05-31 2017-05-30 2017-05-29 2017-05-28 2017-05-27 2017-05-26 2017-05-25 2017-05-24 2017-05-23 2017-05-22 2017-05-19 2017-05-18 2017-05-17 2017-05-16