2018年01月21日

言語処理100本ノックでPython入門 #05 - 関数

  
今日は、言語処理100本ノックの問題05に挑戦です。

■ 問題
05. n-gram
与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.この関数を用い,"I am an NLPer"という文から単語bi-gram,文字bi-gramを得よ.

■ 書いたコード
def ngram(s, n):
    items = []
    last = len(s) - n + 1
    for i in range(last):
        items.append(s[i: i+n])
    return items

text = "I am an NLPer"
x = ngram(text, 2)
print(x)
x = ngram(text.split(), 2)
print(x)

ngramの第2引数の2を渡すことで、bi-gramが求まります。 最初のngramの呼び出しで、文字bi-gram、2つめのngramの呼び出しで単語bi-gramを求めています。


■ 実行結果
['I ', ' a', 'am', 'm ', ' a', 'an', 'n ', ' N', 'NL', 'LP', 'Pe', 'er']
[['I', 'am'], ['am', 'an'], ['an', 'NLPer']]


■ 今回学んだこと


リストへの追加
items = []
items.append("a")    
items.append("b")    
Pythonの [] は配列というよりも、C#でいうリストそのものですね。


関数の定義

関数の定義は、def キーワードを使います。
def ngram(s, n):
引数は、仮引数の名前だけを指定します。 C#と違って戻り値の方は指定する必要はないです。

はじめは、wordngram, charngram のような2つの関数を作るのかなと思ったのですが、そうする必要はありませんでした。

文字ngarmに対応するコードを書いたあと、単語ngramへのコードを書いたら、まったく同じコードになりました。

なので、ngramという関数一つでOKです。

C#のジェネリックのようなことが、特別なコードを書かなくてもできるのは面白いですね。
これは、明示的な型が無い言語の利点ではありますね。

関数の書き方覚えたので、これでもうすこし複雑なプログラムも書けそうです。