hitode909の日記

以前はプログラミング日記でしたが、今は子育て日記です

N-gramしてみた

昨日、はじめてのAIプログラミングという本を読んだ。
それで紹介されていた、N-gramという手法がおもしろそうだったのでやってみた。

はじめてのAIプログラミング―C言語で作る人工知能と人工無能

はじめてのAIプログラミング―C言語で作る人工知能と人工無能

N-gramとは

  • 日本語の文章をn文字ずつに切り出して、出現回数を数えると楽しい
  • 3文字で切るのがいいらしい(?)

ソース


next if token =~ /\n|\r/ のあたりがおかしいが、リンク先では正しく表示される。

使い方

R echo "アメリカにはアメリカ人がいて、アメリカにはたくさん人がいて、すごいですね" | ruby ngram.rb
[["メリカ", 3],
 ["アメリ", 3],
 ["がいて", 2],
 ["リカに", 2],
 ["カには", 2],
 ["いて、", 2],
 ["人がい", 2],
 ["にはア", 1],
 ["たくさ", 1],
 ["にはた", 1],
 ["て、ア", 1],
 (略)

3文字ずつ区切って、同じ文字列の出現回数を数えるだけで、入力された文章ではアメリカの話をしているっぽい、ということが分かる。

使ってみる

青空文庫から夏目漱石の「こころ」を落としてきて、nkfでUTF8にしてからこれにつっこんでみる。もとのファイルが300kbくらいで、出力は1.2MBくらい

[["した。", 1481],
 ["ました", 1039],
 ["った。", 862],
 ["です。", 804],
 ["のです", 791],
 ["。私は", 662],
 ["かった", 601],
 ["たので", 573],
 ["た。私", 547],
 (略)

ですます調であることや、私が過去の話をしていることが分かる。
もう少し見て行くと、内容に関係する単語(主に登場人物)が上の方に来ている。てきとうに抜粋。

 ["奥さん", 388],
 ["先生の", 178],
 ["先生は", 172],
 ["嬢さん", 166],
 ["お嬢さ", 166],

登場人物の1人であるKが居ないが、1文字だから前後の文字の影響が大きいので、上位には来にくく、逆に、お嬢さんは4文字で1つなので、上位に来やすいのではないか。

感想

読みたくないほんとか、道の領域の文章を読むときとか、本文を読む前にこれで解析しておけば、要約のように使えて、役に立つのではと思う。
最初に挙げた本には、マルコフ連鎖を用いて文章を作成する方法なども示されていたので、やってみたい。