百折不撓

データ系の新米エンジニアとして戦闘中。

言語処理100本ノックchap01_05

言語処理100本ノックの続き。
言語処理100本ノック 2015
この記事では、1章5問目をやっていきたいと思いますが、そもそも“N-gram”って何ぞや?一度勉強したけど思い出せない・・・。
最後に参考サイトのリンクを入りますが、要は、任意の文を、N個の文字のつながりで分割する。例えば、2-gramなら

今日の天気はポカポカでしたよ

これを

今日/の天/気は/ポカ/ポカ/でし/たよ/

とします。僕の現在の理解では、句読点を文字扱いするのか、余りの文字が出た場合どう扱うのかが分からないので入れませんでした。2文字ずつ品詞に関係なく分割していくんですね。そして、品詞で分解して文章を分析するのが形態素解析ですが、この問題では範囲外なので深入りはしません(参考サイトの方はもう少し詳しく説明されています)。
 さて、僕の処理としては以下となりました。

import numpy as np
import pandas as pd

def ngram(N, text): 
    num_of_parties = len(text) // N
    #num_of_tail_char = len(text) % N
    for i in np.arange(0,num_of_parties):
        if i == 0 :
            parties_head, parties_remain = text[:N], text[N:]
            parties = [parties_head]
        else:
            parties_head   = parties_remain[:N]
            parties.append(parties_head)
            
            parties_remain = parties_remain[N:]
    
    parties.append(parties_remain)
    
    return parties
    
#N = 5
#text = "ほげってほげってほげるんだ"

if __name__ == "__main__":
    print("NgramのNを入力してください。 N = ")
    N = input()
    N = int(N)
    print("Ngramを生成したい文章を入力してください。")
    text = input()

    print(ngram(N, text))

 テストなどのやり方もまだ分かっていないので完璧かは分かりませんが、それっぽくは動いています。ただ、こういう時にループ回数を1引かないいけないのか否か、毎回悩んでしまいます。特に、そこが怪しい気がします。
 改善点などありましたら、教えて頂けると嬉しいです。こんな所まで来て、読んでくれてありがとうございました!!

戯言:
 昨晩、布団の中で「スライス使えば、簡単じゃん」とかアホな事考えていたのですが、スライスでhoge[::2]みたいにしても2個飛びで取ってくるだけなので上手く行きそうもありませんでした。あれこれ考えて、やっとこさ出来ました。



参考サイト
N-gramと形態素解析 - gggggraziegrazie