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)