python 言語処理100本ノック -第1章: 準備運動- 05. n-gram

05. n-gram

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

はい出ました、n-gram。第一章の中で一番難しかったです。(というより、知らないとできない。)
まずはn-gramとは何か?から理解しないといけません。
コトバンクによるとn-gramは以下のように定義されています。

任意の文字列や文書を連続したn個の文字で分割するテキスト分割方法.特に,nが1の場合をユニグラム(uni-gram),2の場合をバイグラム(bi-gram),3の場合をトライグラム(tri-gram)と呼ぶ.

・・・よくわかりません。
実例を見た方が早そうです。
文字列”あいうえお”をbi-gramで分割すると、”[あい][いう][うえ][えお]”となります。
対象文字列を先頭から順に2文字ずつきりとっていくイメージですかね。
pythonのコードにするとこんな感じになりました。もっといい方法がある気もしますが・・・

 

#coding: utf-8
#単語n-gram
def word_n_gram(p_target, p_n):
    targetarry = []
    targetarry = p_target.split(' ')
    cnt = len(targetarry) - p_n + 1
    result = []
    for i in range(cnt):
        tmp = []
        for j in range(n):
            tmp.append(targetarry[i+j])
        result.append(tmp)
    print(result)
#文字n-gram
def char_n_gram(p_target, p_n):
    result =[]
    for i in range(len(p_target) - p_n + 1):
        result.append(p_target[i : i + p_n])
    print(result)
#実行部
target = 'I am an NLPer'
n = 2
word_n_gram(target, n)
char_n_gram(target, n)

■開発環境
Windows10
Python 3.7.3
Visual Studio Code 1.33.1

■言語処理100本ノック 公式
言語処理100本ノック 2015