お知らせ

ただいま、シンタックスハイライターの設定を見直しております。
プログラムが見にくくなっているページがありますが、ご容赦ください。

N-gram(1)

データの活用

こんにちは。今回は文を分割する方法について書きます。以前、形態素解析について書きましたが、もっとお手軽に文章を分割することができます。

以前の記事:にほんごであそぼ!(形態素解析のお話)

N-gramとは

エヌグラムとよみます。文字列を連続したN文字で区切っていく分割の方法です。N=1のときuni-gram(ユニグラム)、N=2のときbi-gram(バイグラム)、N=3のときtri-gram(トリグラム、トライグラム)といいます。発音が気になったので、ネイティブの発音を聞いてみました。

ユニグラムス、ビッグラムス、トリグラムスと発音しているように聞こえましたが、リスニング力に自信がないのでこれ以上深入りするのはやめることにします。

N-gramの例

例として、芥川龍之介の羅生門の書き出し「ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。」を使って、2-gramではどのように区切られるかを見てみます。

['ある', 'る日', '日の', 'の暮', '暮方',
 '方の', 'の事', '事で', 'であ', 'ある',
 'る。', '。一', '一人', '人の', 'の下',
 '下人', '人が', 'が、', '、羅', '羅生',
 '生門', '門の', 'の下', '下で', 'で雨',
 '雨や', 'やみ', 'みを', 'を待', '待っ',
 'って', 'てい', 'いた', 'た。']

次に3-gramで区切った場合です。

['ある日', 'る日の', '日の暮', 'の暮方', '暮方の',
 '方の事', 'の事で', '事であ', 'である', 'ある。',
 'る。一', '。一人', '一人の', '人の下', 'の下人',
 '下人が', '人が、', 'が、羅', '、羅生', '羅生門',
 '生門の', '門の下', 'の下で', '下で雨', 'で雨や',
 '雨やみ', 'やみを', 'みを待', 'を待っ', '待って',
 'ってい', 'ていた', 'いた。']

意味があるまとまりに必ずしもなっていませんが、前後の関係がわかる形で区切ることができています。

N-gramのプログラム

Pythonのプログラムで、上の結果を得ました。

def n_gram( text, n ):
	return [ text[i:i+n] for i in range( len(text)-n+1 ) ]


path = 'rashomon.txt'
file = open( path, encoding='utf-8' )
text = file.read()
file.close()

print( n_gram( text, 2 ) )
print( n_gram( text, 3 ) )

Pythonの内包表記と文字列のスライスを使っているので、慣れないと読みにくいですが、「i文字目からn文字分取り出してリストを作る」ということが2行目に書かれています。

粒度について

ここまで、文字単位でのN-gramを書いてきましたが、形態素解析などと組み合わせると次のような区切り方ができます。

  • 形態素レベルでのN-gram
  • 品詞に着目したN-gram
  • プログラム言語に対してのN-gram
  • DNAの塩基配列に対してのN-gram

単に区切るだけではなく、出現頻度や同時に出現する共起ということを考えることができます。たぶんうまく使っていくと、中島みゆきと松任谷由実の歌詞を区別できるだろうし、目薬は入れるのではなく差すと表現するもの、ということが見つけられるだろうと思っています。(本当かな?)

ということで、今回の文字単位の区切り方だけではなく、形態素に着目した形で改めて取り上げてみたいと思います。

今日は短いですが、これでおしまいにします。それではまた。

この記事を書いた人
春日井 優

高校で情報科という教科を担当しています。以前は数学科も担当していました。(今でも数学科の教員免許状は有効です。)プログラムを覚えたのは、「ゲームセンターあらし」という漫画のキャラクターがBASICを解説する「こんにちはマイコン」を読んだことがきっかけでした。

Posted by kasugai