05 : 言語処理100本ノックでPythonのお勉強

第一章 : 05のお題 n-gram

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

そもそもn-gramとは何ぞや。bi-gramとは何ぞや。wikipediaを調べると以下のようなものらしい。

「N文字インデックス法」「Nグラム法」などともいう。検索対象を単語単位ではなく文字単位で分解し、後続の N-1 文字を含めた状態で出現頻度を求める方法。Nの値が1なら「ユニグラム(英: uni-gram)」、2なら「バイグラム(英: bi-gram)」、3なら「トライグラム(英: tri-gram)」と呼ばれる。

例えば、「こんにちは」という文字列をbi-gramで分割すると、「こん」、「んに」、「にち」、「ちは」という文字列に分けられる。tri-gramで分割すると、「こんに」、「んにち」、「にちは」という文字列にわけられる。n-gramは検索などに使われる技術のよう。

プログラムは以下のようになります。

def n_gram(target, n):
    result = []
    for i in range(0, len(target) -n + 1):
        result.append(target[i:i+n])
    return result

l = "I am an NLPer"
words = l.split(" ")

# bi-gram
result = n_gram(words, 2)
print(result)

# tri-gram
result = n_gram(words, 3)
print(result)