Skip to content

Instantly share code, notes, and snippets.

@nobusue
Created February 13, 2011 16:19
Show Gist options
  • Save nobusue/824816 to your computer and use it in GitHub Desktop.
Save nobusue/824816 to your computer and use it in GitHub Desktop.
/*
* ベイジアンフィルタのサンプル(Groovyバージョン)
* 元ネタ) 機械学習 はじめよう 第3回 ベイジアンフィルタを実装してみよう
* http://gihyo.jp/dev/serial/01/machine-learning/0003
*
* 分かち書きにはGomokuを利用
* https://github.com/sile/gomoku
*/
import net.reduls.gomoku.Tagger
import net.reduls.gomoku.Morpheme
vocabularies = [] as Set
wordcount = [:].withDefault{ [:].withDefault{0} }
catcount = [:].withDefault{0}
def getwords(sentence){
def result = Tagger.parse(sentence)
//def words = result*.find{ it.feature =~ /名詞|動詞|形容詞|形容動詞|感動詞|副詞|連体詞/ }.surface
def words = result*.find{ it.feature =~ /名詞/ }.surface
return words.collect{ it.toLowerCase() }
}
def wordcountup(word, cat){
wordcount[cat][word] += 1
vocabularies << word
}
def catcountup(cat){
catcount[cat] += 1
}
def train(doc, cat){
word = getwords(doc)
word.each{ w ->
wordcountup(w, cat)
catcountup(cat)
}
}
def priorprob(cat){
return catcount[cat] / catcount.values().sum()
}
def incategory(word, cat){
if( wordcount[cat].containsKey(word) ) {
//println "Hit word=${word}, cat=${cat}, count=${wordcount[cat][word]}"
return wordcount[cat][word]
}
else return 0
}
def wordprob(word, cat){
def prob = (incategory(word, cat) + 1.0) /
(wordcount[cat].values().sum() + vocabularies.size())
return prob
}
def score(word, cat){
score = Math.log( priorprob(cat) )
word.each{ w ->
score += Math.log(wordprob(w, cat))
}
return score
}
def classifier(doc){
def best = ''
def max = Integer.MIN_VALUE
word = getwords(doc)
catcount.each{ catkey,catval ->
def prob = score(word, catkey)
//println "${catkey}=>${prob}: ${doc}"
if(prob > max) {
max = prob
best = catkey
}
}
return best
}
train(
'''Python(パイソン)は、オランダ人のグイド・ヴァンロッサムが作ったオープンソースのプログラミング言語。オブジェクト指向スクリプト言語の一種であり、Perlとともに欧米で広く普及している。イギリスのテレビ局 BBC が製作したコメディ番組『空飛ぶモンティ・パイソン』にちなんで名付けられた。Pythonは英語で爬虫類のニシキヘビの意味で、Python言語のマスコットやアイコンとして使われることがある。
Pythonは汎用の高水準言語である。プログラマの生産性とコードの信頼性を重視して設計されており、核となるシンタックスおよびセマンティクスは必要最小限に抑えられている反面、利便性の高い大規模な標準ライブラリを備えている。
Unicodeによる文字列操作をサポートしており、日本語処理も標準で可能である。 多くのプラットフォームをサポートしており(動作するプラットフォーム)、また、豊富なドキュメント、豊富なライブラリがあることから、産業界でも利用が増えつつある。''',
'Python')
train(
'''Ruby(ルビー)は、まつもとゆきひろ(通称Matz)により開発されたオブジェクト指向スクリプト言語であり、従来Perlなどのスクリプト言語が用いられてきた領域でのオブジェクト指向プログラミングを実現する。Rubyは当初1993年2月24日に生まれ、1995年12月にfj上で発表された。名称のRubyは、プログラミング言語Perlが6月の誕生石であるPearl(真珠)と同じ発音をすることから、まつもとの同僚の誕生石(7月)のルビーを取って名付けられた。
機能として、クラス定義、ガベージコレクション、強力な正規表現処理、マルチスレッド、例外処理、イテレータ・クロージャ、Mixin、演算子オーバーロードなどがある。Perlの代替となることができることが初期の段階から重視されている。Perlと同様にグルー言語としての使い方が可能で、Cプログラムやライブラリを呼び出す拡張モジュールを組み込むことができる。
Ruby処理系は、主にインタプリタとして実装されている(詳しくは#実装を参照)。
構文は、ALGOL系を継承しながら、可読性を重視している。Rubyにおいては整数や文字列なども含めデータ型はすべてがオブジェクトであり、純粋なオブジェクト指向言語といえる。
長らく言語仕様が明文化されず、まつもとによる実装が言語仕様に準ずるものとして扱われて来たが、2010年6月現在、RubySpecとして言語仕様が策定中である。
フリーソフトウェアとしてRuby ライセンス(Ruby License や Ruby's と表記されることもある。GPLかArtisticに似た独自ライセンスを選択するデュアルライセンス)で配布されている。''',
'Ruby')
train(
'''機械学習(きかいがくしゅう、Machine learning)とは、人工知能における研究課題の一つで、人間が自然に行っている学習能力と同様の機能をコンピュータで実現させるための技術・手法のことである。 ある程度の数のサンプルデータ集合を対象に解析を行い、そのデータから有用な規則、ルール、知識表現、判断基準などを抽出する。 データ集合を解析するため、統計学との関連も非常に深い。
機械学習は検索エンジン、医療診断、スパムメールの検出、金融市場の予測、DNA配列の分類、音声認識や文字認識などのパターン認識、ゲーム戦略、ロボット、など幅広い分野で用いられている。応用分野の特性に応じて学習手法も適切に選択する必要があり、様々な手法が提案されている。それらの手法は、 Machine Learning や IEEE Transactions on Pattern Analysis and Machine Intelligence などの学術雑誌などで発表されることが多い。''',
'機械学習')
train(
'''Groovy(グルービー)は、Javaプラットフォーム (Java仮想マシン、JVM) 上で動作するアジャイルな動的言語である。
Groovyの処理系はオープンソースソフトウェアであり、James StrachanとBob McWhirterらを中心に、オープンソース開発サイトであるcodehaus上でBSD/Apacheライクなライセンスにて、2003年8月27日に開発が開始された(CVSへの最初のコミットがなされた)。その後、開発の主体はGuillaume LaforgeとJeremy Raynerらに移り開発が続けられている。
GroovyはJVM上で動作する言語処理系および言語の名称であり、Javaとの直接的な連携を特徴とする。例えばGroovyからすべてのJava SE APIや、 Javaで書かれた任意のサードパーティ製のコンパイル済みのライブラリなどを呼び出すことができる。言語の記述能力としては、Javaで記述できることは、無名内部クラスの定義など一部の例外を除き基本的にGroovyでも記述することができる。逆に言うとJavaで記述できない機能は記述できないが、 Javaと同様にC言語などで書かれたネイティブメソッドなどは呼び出すことができる。
Groovyは動的な言語であり、直接スクリプトを実行することができる。Groovyコード断片をコマンドラインに与えワンライナーとして実行することも可能である。なおこの時、中間的にJavaソースコードが生成されることはなく、バイトコードがメモリ上に生成されて直接実行される。また、groovycコマンド(groovyコンパイラ)を使ってクラスファイルをあらかじめ生成しておくこともできる。いずれにせよGroovyコードは内部的にはJavaバイトコードに変換されてJVM上で実行される。
このとき、GroovyコードもJavaコードも、JVMからみると両方ともJavaバイトコードとして解釈実行されるという意味で区別がない。 Groovyのこのような仕組みから、GroovyはJavaと極めて親和性が高く、Java技術で培われてきた開発インフラやライブラリ、ノウハウ、ツール、JVM最適化技術などの多くをそのまま流用することができる。Groovyから生成したクラスファイルは通常のクラスファイルであるので、 Javaクラスファイルを要求するプラグインなどをGroovyで記述することも容易である。
Groovyは、同じ実行時システムを共有する、Javaコードの別の表記法だと考えることもできる。''',
'Groovy')
def words = ''
words = 'グイド・ヴァンロッサム氏によって作られました.'
println "${words} => 推定カテゴリ: ${classifier(words)}"
words = '豊富なドキュメントや豊富なライブラリがあります.'
println "${words} => 推定カテゴリ: ${classifier(words)}"
words = '純粋なオブジェクト指向言語です.'
println "${words} => 推定カテゴリ: ${classifier(words)}"
words = 'Rubyはまつもとゆきひろ氏(通称Matz)により開発されました.'
println "${words} => 推定カテゴリ: ${classifier(words)}"
words = '「機械学習 はじめよう」が始まりました.'
println "${words} => 推定カテゴリ: ${classifier(words)}"
words = '検索エンジンや画像認識に利用されています.'
println "${words} => 推定カテゴリ: ${classifier(words)}"
words = 'JVM上で動作します.'
println "${words} => 推定カテゴリ: ${classifier(words)}"
words = '動的な言語です.'
println "${words} => 推定カテゴリ: ${classifier(words)}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment