FrontPage / Learning Programming / 2017
概要 †
- Unix環境でのプログラミング方法,研究室の実験環境を学ぶ
- 自然言語処理で頻繁に使われる処理を題材としてプログラミング演習を行うことで,スムースに研究に取り組める力を養います
内容 †
- Unix環境でのプログラミング方法
- 研究室の実験環境
- Pythonプログラミングのチュートリアル
- Pythonの基本的な使い方.ipythonの使い方,pipの使い方など
- 分からないことはどう調べれば良いのか
- 言語処理100本ノック 2015
- 自然言語処理に関するプログラムを実際に作ってもらい,互いにコードレビューを行います。
- 問題に対する答えは一つではありません。どんな方法でも,無理矢理でも解いてみてください。
2017年度 †
- 日時
- 火曜日 14:30-16:10
- 参加者
- 阿部,伊藤,栗林,田上,吉成,王, 白井, 中村
- 書いたコード
- https://github.com/cl-tohoku/100knock-2017
scalaで書いてみた 000-059(松林) ソースコードの場所はこのページの編集コメントに書いてあります。
記録のとり方 †
- やったことだけ書く
- 以前の記録と同じことを書いても良い
- 何度も書かれているということは,それだけ重要だということを意味する
予定・記録 †
- 2/6(火) 14:40-16:10
- `hasattr`, `getattr`, `setattr`
- `pd.read_html`
- HTML 中のテーブルをパーズする
- `d = defaultdict(lambda: len(d))`
- 単語ベクトルを可視化するときはラベル表示を忘れないように
- 1/30(火) 14:40-16:10
- ローカル環境に実装を落としてビルドするのは良い訓練
- make の使い方を学びましょう
- 例:Mikorov の Word2vec
- word2vec != Mikolov 論文 (e.g. Efficient Estimation of Word Representations in Vector Space) であることに注意しましょう
- 実験を Jupyter 上でやるのはやめましょう
- ログをファイルに吐き出しましょう (e.g. logzero)
- CUI な資産との相性が悪い (e.g. peco/fzf,シェルスクリプト)
- グローバル変数に依存した関数設計は避けよう
- 行列演算は numpy のメソッドだけを使って行うようにしよう
- numpy を使ったコードに for 文が混ざり始めたら怪しい
- `scipy.stats.rankdata`: 数値列のランキングを求める
- pathlib: マルチプラットフォームで統一的にパスを取り扱うための高レベルな標準ライブラリ
- ライブラリを配布してマルチプラットフォームで使えるようにするとかを考えない限りは使わなくていい
- ローカル環境に実装を落としてビルドするのは良い訓練
- 1/9(火) 14:40-16:10
- 単語にユニークな ID を割り振るイディオム:`word2id = defaultdict(lambda: len(word2id))`
- map-reduce の考え方
- **自己**相互情報量
- 主成分分析
- 分散共分散行列
- 固有値・固有ベクトル
- SVD
- 主成分分析に scikit-learn の TruncatedSVD を用いる場合は事前に中心化しておくべき
- sparse matrix を維持しつつ中心化行列を得るには?
- 12/19(火) 14:40-16:00
- (80)-(82)
- 単語ベクトルとは
- `bzcat`: bzip 圧縮されたファイルのための `cat` コマンド
- `.rstrip(s).lstrip(s)` は意味不明
- ダブルクォートの種類
- TeX でクォートする場合は \`\`hoge'' こうする
- `diff`, `patch` の使い方
- 国名の取得方法
- Wikipedia から API で取得
- pycountry
- `str.replace()` する前の包含判定は無くてもよい
- Toolz, CyToolz
- なぜ窓幅をランダムにサンプリングするか
- 近いほうの単語がより多くサンプリングされるのが効く
- Mikolov の C 実装もそうなってる
- Wolfram Alpha
- 並列処理
- シェルでやる場合はシェルスクリプトか GNU Parallel
- Python でやる場合は joblib か dask
- Trie 木
- 12/12(火) 14:40-16:00
- (56)-(59)
- dependency graph を構築するときにノードの同一性判定を単語の文字列そのものにしてると,文中に同じ単語が存在するときに想定通りに動かない
- Web 上で Graphviz を使う
- S式のパーズには再帰が必要だと一瞬で見抜けるようにせよ
- 正規表現の一部の拡張は再帰も扱える
- 12/5(火) 14:40-16:00
- (50)-(55)
- 50: `re.split`, `re.sub`, `re.search`, `sed`, `pcregrep`
- ファイルの行末を文区切りとみなすかどうか
- 今回のテキストファイルは文区切りと思ってよい
- CoreNLP はデフォルトでは文区切りとみなさない
- stemming には punctuation 類の除去は含まれない
- CoreNLP の設定はプロパティーファイルを作成して `-props` オプションで指定する
- `annotators`: アノテーションリストの指定
- `outputExtension`: 出力拡張子の指定
- `tokenize.whitespace` (default: false): 単語区切りは空白文字だけで行う.tokenize 済みのテキストファイルを処理するときに true にする.
- `ssplit.eolonly` (default: false): 文区切りは行末だけ.sentence split 済みのテキストファイルを処理するときに true にする.
- CoreNLP にもバグはつきもの
- CoreNLP の実行時につけるとよいオプション
- 使用メモリ上限 (例: `-mx5g`)
- `-ms4g`
- GC の設定(例: `-XX:NewSize=3g`, `-XX:MaxNewSize=3g`, `-XX:SurvivorRatio=4`)
- 大量の文書を長い時間をかけてパーズすると落ちることがあるので,細かいオプション指定が必要
- Python で XML をパーズするには lxml が良い
- CoreNLP のマルチスレッドオプションは以前はうまく動かなかったので今も非推奨
- 代わりにシングルスレッドの CoreNLP を複数端末で実行する
- 他のパーザ (SyntaxNet, spaCy) との比較
- CoreNLP は一通り揃ってるのが強い
- 細かい設定もできるので自分のニーズに合わせることができるが,モデルは何年も前のものなので精度が良くない
- mention span はオーバーラップする可能性がある
- 11/14(火) 14:40-16:10
- フロントエンド勉強会 第4回
- CGI とは
- `cgi` を import してヘッダーを書いて JSON を返すように書く
- JSON を返すと受け取り側の JS で処理しやすい
- Python で HTML をベタに書くのは大変なので,テンプレートエンジンを使う
- Jinja2 など
- HTML(のようなもの)にサーバサイド (Python) の変数を埋め込める
- CGI では URL を叩くたびに新しい Python プロセスが立ち上がるので重い
- 簡単な処理で済むなら CGI でいい
- permission を 755 にしておく
- Python でサーバを立ち上げると,CGI で問題だった initialize の遅さが解消される
- cherrypy, flask など
- HTTP メソッドは基本的に GET と POST だけ覚えておけばよい
- リアルタイム通信では WebSocket を使う
- Python ライブラリでは tornade がある
- 動的な UI を作りたいときは jQuery UI
- 11/07(火) 13:00-14:30
- フロントエンド勉強会 第3回
- 静的ページと動的ページの違い
- JavaScript は HTML を書き換えるために使うスクリプト言語
- DOM とは
- `console.log()`: print
- JS は非同期処理できる
- 上から順に素直に処理が進んでいくと思っているとハマる
- `addEventListner()` は非同期
- jQuery でクラスや ID を選択する記法は CSS と同じ
- `$("要素").click()` よりも `$(document).on("click", "要素")` がオススメ
- 前者は click イベントが要素に紐づくが,後者は document に紐づくので,要素が増えたり消えたりしても想定通りに動く
- ただし毎回 document 全体に検索をかけるので重くなる
- CSS でできることは jQuery でなく CSS で実装するようにする
- `keyDown`, `keyUp`, `keyPress`
- メソッドチェーン
- メソッドが自分自身を返すようにして,メソッドを繋げることで一連の処理を書くこと
- jQuery は基本的にメソッドチェーンで書いていく
- Ajax
- JS で Web API を非同期に叩く技術
- レスポンスが返るまでに時間がかかる URL を叩いても JS は動き続ける
- 11/01(水) 14:40-16:10
- フロントエンド勉強会 第2回
- CSS について
- `<div style="ここに色々書く"></div>`
- 重要なプロパティ
- `background`
- `color`
- `display`
- `visibility`
- `width`
- `position`
- `float`
- class と id の違い
- スタイルの適用順
- 要素へのクラス複数割り当て
- 重要なセレクタ
- `:hover`
- `>`
- ` `
- ブロック要素とインライン要素の違い
- margin, border, padding
- media query
- CSS フレームワーク
- Bootstrap
- Chrome のインスペクタ
- デザインそのものをどうするか
- UI/UX, HCI
- 『ノンデザイナーズ・デザインブック』
- JavaScript
- 10/26(木) 8:50-10:20
- (66)-(68)
- [meta] 66は問題の解釈に揺れがある
- mongoDB におけるソートの方法
- `find` メソッドの引数で指定する
- `find().sort()`
- 組み込み関数の上書きに注意
- KVS vs. document-oriented database
- document-oriented database vs. RDB
- RDB は最初にスキーマの定義が必要
- 「なんで mongoDB 使ったの???」にディフェンスできるようにせよ
- フロントエンド勉強会 第1回
- 10/17(火) 14:40-16:10
- (60)-(65)
- サーバとは
- ローカルホスト
- 一つのLANの中でサーバを立てる
- 同じLAN内なら誰でも接続できる
- データベースサーバの立て方
- IPアドレス
- win: ipconfig
- mac/linux: ifconfig
- ポート番号
- サーバの殺し方
- 普通は `Ctrl+c` でプロセスを終了する
- `Ctrl+z` はサスペンドするだけなので注意
- 強制的に殺す場合は `top` などで PID を確認して `kill -9 PID` する
- `top` の使い方
- アクティビティモニタの CUI 版
- バイト文字列と普通の文字列の違い
- key-value store の限界
- GET(key) は高速にできるが,GET(value) はできない
- value に対する検索は全てのデータを舐めなければならない
- key と value を逆にしたデータを新たに追加すれば良いかもしれないが,容量が倍になってアホくさい
- オブジェクトのシリアライズ
- pickle, json, joblib
- インデックスの作成
- 名前を辞書順に並べるイメージ
- 検索が高速になる
- 挿入は遅くなる
- MongoDB の insert は上書きしない
- 同じ値を insert し続けるとデータベースが膨らみ続ける
- なのでデータの存在を確認して,無いなら save するのが安全
- どういう運用を求めてるかによってデータベースの選定や細かい設定が変わる
- 10/10(火) 14:40-16:10
- (76)-(79)
- 表形式のデータを扱うには pandas が便利
- 例:各事例からどんな素性が取れているかをざっと確認する
- 分類結果・事例・素性を紐づけてお互いに参照できるようにするのは良いプラクティス
- SGD(確率的勾配降下法)
- 深層学習時代には必須の知識
- 線形とは
- 調和平均は Preicision/Recall について非線形
- マクロ平均/マイクロ平均
- 調和平均は非線形なので交差検証におけるF値のマクロ平均とマイクロ平均は一致しない
- どちらを使うかは case-by-case
- cross validation(交差検証)のバリエーション
- K-fold cross validation: データをK分割して一つを評価,残りを訓練に使う
- Leave-one-out cross validation: 全データ中一事例だけ評価,残りを訓練に使う
- 汎化誤差とは
- ラベルのバランス
- 「素性抽出 → ベクトル化」は 訓練データ に対して行うこと
- ryo-t のコードの間違い探し
- 10/6(金) 16:20-17:50
- (73)-(75)
- scikit-learn はどのモデルも共通のインターフェースを持ち扱いやすい
- `model.fit()`: モデルを学習データにフィットさせる
- `model.predict(X)`: X のラベルを予測する
- `model.predict_proba(X)`: X の各ラベルに対する確率を出力する
- featureにidを対応付ける方法:
- `defaultdict(lambda: len(features))`
- `defaultdict(count(0).__next__)`
- `sklearn.feature_extraction.DictVectorizer`
- 疎行列:ほとんどの要素の値が0であるような行列
- メモリ効率の良いデータ構造が scipy でいくつか用意されている
- numpy array にそのまま格納するのはメモリの無駄
- 何度実行しても同じ実験結果が得られるように,乱数のシード値を指定できるようにせよ
- 特に忘れがちなのがモデルパラメータの初期化.scikit-learn ではモデルのクラスインスタンスの生成時に `random_state` 引数にシード値を指定する.
- パラメータの初期値の違いによる最終的な精度のブレによって,新たに追加した素性が有効かどうかが見えづらくなる場合がある
- `np.argsort()`: 値でソートしてインデックスを返す
- 2-D array では `axis=0` は行方向,`axis=1` は列方向.最初に見えるインデックスから axis をカウントしていくイメージ
- numpy array を連結するためのメソッドあれこれ
- `np.concatenate()`
- `np.vstack()`, `np.hstack()`
- `np.r_[]`, `np.c_[]`
- 9/26(火) 13:00-14:30
- (70)-(72)
- devdocs.io: a Dash alternative
- pytest はディレクトリ以下の「テストっぽい関数」をまとめて実行してくれる
- unittest
- “Develop or Die”
- 素性の入れ替え:%%file で保存して argparse
- 素性の入れ替え:model クラスのようなものを作っておいて initialize 時に利用する素性を設定
- 7/31(月) 13:00-14:30
- (47)-(49)
- 例外的な入力を受け取ったら例外を投げる。 `None` を返さない
- 末尾再帰
- `yield from` でイテレータから次々ジェネレートする
- `itertools.chain()`, `itertools.chain.from_iterable()`, itertools
- 1ヵ月後に読んだときに変数/関数の意味がすぐ分かるように命名する
- 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)
- The optional argument count is the maximum number of pattern occurrences to be replaced; count must be a non-negative integer
- https://docs.python.org/3/library/re.html?highlight=re.sub#re.sub
- 括弧によるキャプチャ
- (...) によってグループ化されたサブパターンにマッチした文字列はキャプチャされ後方参照に利用できる
- (?:...) はキャプチャしない(後方参照用の番号を消費しない)、グループ化するだけ
- (?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
- 研究者流コーディングの極意 (NLP2013 の岡崎さんのチュートリアル資料)
- UNIX ビギナー講座 (鈴木さんの資料)
- UNIX/Linux 環境でのコマンドライン操作に慣れる…前の基礎知識 - Qiita (横井さんの資料)
- git pull をするな
- 明示的に fetch と merge を叩く
- git branch -D master
- IPython から UNIX コマンドを叩く方法
- IPython での特殊な変数展開
- $var, {var} : IPython で定義された変数が優先して展開される
- $$var : シェルの環境変数が展開される
- "$var" : ダブルクォートで囲うのは良い習慣
- ディレクトリ構成
- data/ : 加工前のデータを格納
- work/ : 中間生成物を格納
- sum(iterable)
- 命名規則
- ものの数を表すときは n_ の prefix を付けることが多い
- https://google.github.io/styleguide/pyguide.html?showone=Naming#Naming
- 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 で複数選択したセルの統合
- (4)
- 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)
- (0) - (3)
- 2/10(金) 14:40-
- 各種設定
TA †
研究室の実験環境など †
- 🔒内部資料 (2016年版)
Pythonプログラミングのチュートリアル †
- 100本ノックの前のPythonクラッシュコース(鈴木)
- ※ 2017-02-12 現在 Python 3 非対応
- 言語処理100本ノックを解き始める前に(高橋諒)
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
© Inui Laboratory 2010-2018 All rights reserved.