Last active
August 29, 2015 14:04
-
-
Save hiroosak/c02cbfe60d47bbb7a314 to your computer and use it in GitHub Desktop.
Naive Bayesの確認
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var _ = require('lodash'); | |
var MeCab = require('mecab-async'); | |
var mecab = new MeCab(); | |
var async = require('async'); | |
var textTraining = { | |
'Python': 'Python(パイソン)は、広く使用されている汎用のスクリプト言語である。コードのリーダビリティが高くなるように言語が設計されていると主張され、その構文のおかげで、Cなどの言語に比べて、より少ないコード行数でプログラムを表現することができる[11][12]と主張されている。小規模なプログラムから大規模なプログラムまで、さまざまなプログラムをクリアに書けるように、多くのコードが提供されている[13]。', | |
'Ruby': 'Ruby は当初1993年2月24日に生まれ、1995年12月にfj上で発表された。名称の Ruby は、プログラミング言語 Perl が6月の誕生石である Pearl(真珠)と同じ発音をすることから、まつもとの同僚の誕生石(7月)のルビーを取って名付けられた。 機能として、クラス定義、ガベージコレクション、強力な正規表現処理、マルチスレッド、例外処理、イテレータ、クロージャ、Mixin、演算子オーバーロードなどがある。Perl を代替可能であることが初期の段階から重視されている。Perlと同様にグルー言語としての使い方が可能で、C言語プログラムやライブラリを呼び出す拡張モジュールを組み込むことができる。 Ruby 処理系は、主にインタプリタとして実装されている(詳しくは#実装を参照)。 可読性を重視した構文となっている。Ruby においては整数や文字列なども含めデータ型はすべてがオブジェクトであり、純粋なオブジェクト指向言語といえる。 長らく言語仕様が明文化されず、まつもとによる実装が言語仕様に準ずるものとして扱われて来たが、2010年6月現在、JRuby や Rubinius といった互換実装の作者を中心に機械実行可能な形で明文化する RubySpec という試みが行われている。公的規格としては2011年3月22日にJIS規格(JIS X 3017)が制定され、その後2012年4月1日に日本発のプログラム言語では初めてISO/IEC規格(ISO/IEC 30170)として承認された [2]。 フリーソフトウェアとして Ruby ライセンス(Ruby License や Rubysと表記されることもある。GPLかArtisticに似た独自ライセンスを選択するデュアルライセンス。)で配布されている。', | |
'Node.js': 'Node.js はイベント化された入出力を扱うUnix系プラットフォーム上のサーバーサイドJavaScript環境である(V8 JavaScriptエンジンで動作する)。Webサーバなどのスケーラブルなネットワークプログラムの記述を意図している[1]。ライアン・ダールによって2009年に作成され、ダールを雇用しているJoyentの支援により成長している[2] [3]。 Node.jsはPythonのTwisted、PerlのPerl Object Environment(英語版)、C言語のlibevent(英語版)、RubyのEventMachineと同様の目的を持つ。 ほとんどのJavaScriptとは異なり、Webブラウザの中で実行されるのではなく、むしろサーバサイドJavaScriptの一種である。 Node.jsはいくつかのCommonJS(英語版)仕様を実装している[4]。 Node.jsは対話的なテスト用にREPL (Read-eval-print loop) 環境を含んでいる。', | |
'Go': 'Goの構文は様々な言語に部分的に類似している。変数の定義における型の記法はLimboと同様の後置でALGOLやPascalに類似し、ブロックの区切りに波括弧を使う記法はC言語に類似している。for文やif文では条件式を丸括弧で括らず帰結部分には波括弧が必須である。メモリ管理はガベージコレクションに一任され、連想配列も備える。並列処理はOccamやLimboと同様、アントニー・ホーアによるCSPのプロセス代数をモデルとし[3]、Limboと同様チャンネルによるスレッド間通信機能がある。 型の継承、ジェネリックプログラミング、アサーション、オーバーロードといった機能が存在しないことも特徴である。インターフェースを用いたポリモーフィズム(多態性)が実現されている。panicとrecoverを用いた例外処理機能を提供している。[3]FAQにおいて、ジェネリックプログラミングは一部導入が表明されているが、オーバーロードは効率的見地から排除されたことが述べられている。関数は多値を返すことができるので、それによりエラーの報告は容易である、としている。' | |
}; | |
var wordsFunc = function(result, value, key) { | |
result = result || []; | |
var func = function(done) { | |
mecab.parse(value, function(err, res) { | |
if (err) { done(err); } | |
var obj = {}; | |
obj[key] = _.chain(res) | |
.pluck(0) | |
.countBy() | |
.value(); | |
done(null, obj); | |
}); | |
}; | |
result.push(func); | |
}; | |
var textSearchFunc = null; | |
var setBayes = function(done) { | |
async.series(_.transform(textTraining, wordsFunc, []), function(err, res) { | |
res = _.reduce(res, function(result, obj) { | |
return _.merge(result, obj); | |
}, {}); | |
done(null, res); | |
}); | |
}; | |
setBayes(function(err, res) { | |
// return float(self.catcount[cat]) / sum(self.catcount.values()) | |
// console.log(res); | |
/** | |
* priorprob | |
* category の生起確率 P(category) = 訓練データとしてカテゴリが与えられた件数 / 総文書数 | |
*/ | |
var priorprob = function(category) { | |
return 5 / 5; | |
}; | |
var incategory = function (word, category) { | |
if (res[category][word]) { | |
return res[category][word]; | |
} else { | |
return 0.0; | |
} | |
}; | |
var wordprob = function(word, category) { | |
// カテゴリ内の単語数 | |
var categoryWordCount = _.reduce(res[category], function(result, val, key) { | |
return result + val; | |
}, 0); | |
// 総数 | |
var totalWord = _.reduce(res, function(result, val, key) { | |
return result + _.keys(val).length; | |
}, 0); | |
var prob = (incategory(word, category) + 1.0) / (categoryWordCount + totalWord * 1.0); | |
return prob; | |
}; | |
var score = function(words, category) { | |
var score = Math.log(priorprob(category)); | |
_.map(words, function(word) { | |
score += Math.log(wordprob(word, category)); | |
}); | |
return score; | |
}; | |
var categories = _.keys(textTraining); | |
var searchTextFunc = function(text, done) { | |
mecab.parse(text, function(err, res) { | |
if (err) { done(err); } | |
var words = _.chain(res) | |
.pluck(0) | |
.uniq() | |
.value(); | |
var obj = []; | |
_.each(categories, function(category) { | |
obj.push({ | |
category: category, | |
score: score(words, category) | |
}); | |
}); | |
var max = _.max(obj, function (o) { return o.score; }); | |
done(null, max); | |
}); | |
}; | |
_.each([ | |
'豊富なドキュメントや豊富なライブラリがあります.', | |
'純粋なオブジェクト指向言語です.', | |
'「機械学習はじめよう」パターン認識編が始まりました.', | |
'検索エンジンや画像認識に利用されています.', | |
'非同期処理をサポートしている.' | |
], function(research) { | |
searchTextFunc(research, function(err, res) { | |
console.log(research, res); | |
}); | |
}); | |
}); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment