NLP プログラミング勉強会 0 - プログラミング入門

自然言語処理プログラミング勉強会 0 プログラミング入門

Graham Neubig
奈良先端科学技術大学院大学 (NAIST)1NLP プログラミング勉強会 0 - プログラミング入門

本チュートリアルについて●●

14 部構成、比較的簡単なトピックから各回：

チュートリアルで：新しい内容● 宿題：プログラミング演習● 次の週：結果について発表、もしくは話し合いをする●●

プログラミング言語：任意

スライドは Python で● Python, C++, Java, Perl についての質問い答えられる●●

2 人で組んで作業をするのもおすすめ

2

NLP プログラミング勉強会 0 - プログラミング入門

環境設定

3

NLP プログラミング勉強会 0 - プログラミング入門

端末を開く
●

Linux, Mac●●

プログラムメニューから「端末」を選択

Windows
cygwin を利用● もしくは Linux マシンに ssh で接続●

4

NLP プログラミング勉強会 0 - プログラミング入門

ソフトのインストール●

3 種類のソフト：
python: プログラミング言語のインタープリター● テキスト編集ソフト (gvim, emacs など )● git: バージョン管理ソフト●●

Linux:●●

sudo apt-get install git vim-gnome python

Windows:cygwin の setup.exe を実行● 「プログラム」で「 git 」「 gvim 」「 python 」を選択●

5

NLP プログラミング勉強会 0 - プログラミング入門

チュートリアルのファイルを githubからダウンロード●「 git clone 」を使ってチュートリアルのファイルをダウンロード$ git clone https://github.com/neubig/nlptutorial.git●

このファイルは nlptutorial ディレクトリにあるはず$ cd nlptutorial$ ls download/00-intro/nlp-programming-en-00-intro.pdf

6

NLP プログラミング勉強会 0 - プログラミング入門

gvim の使い方●●

どのテキストエディタでも良いが、 vim を使う場合：
初めてなら、 vim の設定を記述する vimrc をコピーすると使いやすくなるかも：$ cp misc/vimrc ~/.vimrc●

vim で「 test.txt 」というファイルを作る：$ gvim test.txt●●「 i 」を押すと入力開始、「 test 」を書く

エスケープを押して、「 :wq 」でファイルを保存して終了（ :w は保存、 :q は終了）

7

NLP プログラミング勉強会 0 - プログラミング入門

git の使い方●●

git を使って書いたコードの履歴管理することが可能
まず、追加したファイルを add$ git add test.txt●「 commit 」で変更を保存$ git commit( 「テストファイルを追加」などのメッセージを入力 )●他の機能は最後の commit への巻き戻し (git reset) 、サーバーに置いてあるコードの変更の反映 (git pull) 、サーバーへのコードのアップロード (git push)8

NLP プログラミング勉強会 0 - プログラミング入門

プログラミングの基礎

9

NLP プログラミング勉強会 0 - プログラミング入門

Hello World!
1)my-program.py をエディタで開く (gvim, emacs, gedit)$ gvim my-program.py2) 下記のプログラムを入力
3) プログラムを実行可能に$ chmod 755 my-program.py4) プログラムを実行$ ./my-program.py
Hello World!
10

NLP プログラミング勉強会 0 - プログラミング入門

データタイプ●●●

文字列 : “hello”, “goodbye”
整数 : -1, 0, 1, 3

浮動小数点 : -4.2, 0.0, 3.14

$ ./my-program.py
string: hello float: 2.500000 int: 4
11

NLP プログラミング勉強会 0 - プログラミング入門

if/else, for
条件が満たされればこれをする
そうでなければこれをする
各要素に対してこれをする$ ./my-program.py
my_variable is not 4
i == 1i == 2i == 3i == 4

注意！
12range(1, 5) == (1, 2, 3, 4)

NLP プログラミング勉強会 0 - プログラミング入門

複数のデータ点の格納キー
0123456密行列
値

20941020193

疎行列
キー
4981
96
104

値
2094
102orキーapple
bananacherrydate

値
2094
102

13

NLP プログラミング勉強会 0 - プログラミング入門

配列 (Python で「リスト」 )●●密なデータの格納に適している
キーは整数で、 0 から始まる

5 要素のリストを作成
リストの最後尾に要素を追加
リストの長さを表示
4 番目の要素を表示
リストの各要素を表示

14

NLP プログラミング勉強会 0 - プログラミング入門

マップ (Python で「辞書」 )●疎行列に適している。引数は何でも OK 。

キー ( 「 alan 」 ) と値 ( 「 22 」 ) からなる辞書を作成
新しい要素を追加
サイズを表示1 つの要素を表示
キーが辞書内に存在するかどうかキー・値の各組を表示（キー順で）
15

NLP プログラミング勉強会 0 - プログラミング入門

defaultdict●

デフォルトの値を定義する辞書の拡張ライブラリ読み込み
デフォルトを 0 に設定存在するキーをプリント
存在しないキーをプリント

16

NLP プログラミング勉強会 0 - プログラミング入門

文字列の分割、連結●

NLP で文を単語に分割することはしばしばある
文を空白区切りで単語の配列に分割

配列を“ ||| “ を区切りとして文字列に連結$ ./my-program.py...
this ||| is ||| a ||| pen

17

NLP プログラミング勉強会 0 - プログラミング入門

文字列の分割、連結●

NLP で文を単語に分割することはしばしばある
文を空白区切りで単語の配列に分割

配列を“ ||| “ を区切りとして文字列に連結$ ./my-program.py...
this ||| is ||| a ||| pen

18

NLP プログラミング勉強会 0 - プログラミング入門

関数●

関数は入力を受け取り、入力を変換し、戻り値を返す
add_and_abs の入力は
「 x 」と「 y 」

x と y を足し、絶対値を返す

add_and_abs をx=-4 と y=1 として呼ぶ
19

NLP プログラミング勉強会 0 - プログラミング入門

コマンドライン引数
最初の引数

ファイルを読み込み「 r 」で開く

1 行ずつファイルを読み込む
行末記号「 \n 」を削除
行が空でなければ表示$ ./my-program.py test.txt

20

NLP プログラミング勉強会 0 - プログラミング入門

コードのテスト

21

NLP プログラミング勉強会 0 - プログラミング入門

入力・出力の簡単なテスト

例：
プログラム word-count.py はファイルの中の単語を数える
1) 小さな入力ファイルを作成
2) 人手で単語を数え、出力の正解ファイルを作成
test-word-count-in.txt

test-word-count-out.txt

abcbcda1b2
c2d13) プログラムを実行$ ./word-count.py test-word-count-in.txt > word-count-out.txt4) 結果を比較$ diff test-word-count-out.txt word-count-out.txt

22

NLP プログラミング勉強会 0 - プログラミング入門

演習問題●

ファイルの中の単語の頻度を数えるプログラムを作成
this is a pen
this pen is my pen●●●

a1is 2
my 1pen 3
this 2

テスト入力 =test/00-input.txt, 正解 =test/00-answer.txt
実行： data/wiki-en-train.word に対して
報告：単語の異なり数● 数単語の頻度●

23

NLP プログラミング勉強会 0 - プログラミング入門

単体テスト
●
●
●

各関数をテストするコードを書く

様々なテストを行い、不正解の場合はエラーを表示
全てのテストが通った場合のみ 1 を返す

24

NLP プログラミング勉強会 0 - プログラミング入門

コードのテストは必要不可欠！
●

テストを作ることで：コードを書く前に解きたい問題の意識をはっきりに● デバッグに使う時間が激減● 時間を置いてコードを読み返す時に分かりやすい●25

NLP プログラミング勉強会 0 - プログラミング入門

演習問題

26

NLP プログラミング勉強会 0 - プログラミング入門

演習問題●

ファイルの中の単語の頻度を数えるプログラムを作成
this is a pen
this pen is my pen●●●a1is 2my 1
pen 3
this 2

テスト入力 =test/00-input.txt, 正解 =test/00-answer.txt
実行： data/wiki-en-train.word に対して
報告：

単語の異なり数● 数単語の頻度●27

NLP プログラミング勉強会 0 - プログラミング入門

擬似コード
create a map counts

単語と頻度を格納するために

open a filefor each line in the filesplit line into words
for w in words
if w exists in counts, add 1 to counts[w]else set counts[w] = 1
print key, value of counts

28