diff --git a/src/tools/ai/core.ts b/src/tools/ai/core.ts new file mode 100644 index 0000000000..25bb807bba --- /dev/null +++ b/src/tools/ai/core.ts @@ -0,0 +1,45 @@ +const bayes = require('./naive-bayes.js'); +const MeCab = require('mecab-async'); + +import Post from '../../api/models/post'; +import config from '../../conf'; + +/** + * 投稿を学習したり与えられた投稿のカテゴリを予測します + */ +export default class Categorizer { + private classifier: any; + private mecab: any; + + constructor() { + this.mecab = new MeCab(); + if (config.categorizer.mecab_command) this.mecab.command = config.categorizer.mecab_command; + + // BIND ----------------------------------- + this.tokenizer = this.tokenizer.bind(this); + } + + private tokenizer(text: string) { + return this.mecab.wakachiSync(text); + } + + public async init() { + this.classifier = bayes({ + tokenizer: this.tokenizer + }); + + // 訓練データ取得 + const verifiedPosts = await Post.find({ + is_category_verified: true + }); + + // 学習 + verifiedPosts.forEach(post => { + this.classifier.learn(post.text, post.category); + }); + } + + public async predict(text) { + return this.classifier.categorize(text); + } +} diff --git a/src/tools/ai/predict-all-post-category.ts b/src/tools/ai/predict-all-post-category.ts index 87e198b39b..058c4f99ef 100644 --- a/src/tools/ai/predict-all-post-category.ts +++ b/src/tools/ai/predict-all-post-category.ts @@ -1,31 +1,9 @@ -const bayes = require('./naive-bayes.js'); -const MeCab = require('mecab-async'); - import Post from '../../api/models/post'; -import config from '../../conf'; +import Core from './core'; -const classifier = bayes({ - tokenizer: this.tokenizer -}); - -const mecab = new MeCab(); -if (config.categorizer.mecab_command) mecab.command = config.categorizer.mecab_command; - -// 訓練データ取得 -Post.find({ - is_category_verified: true -}, { - fields: { - _id: false, - text: true, - category: true - } -}).then(verifiedPosts => { - // 学習 - verifiedPosts.forEach(post => { - classifier.learn(post.text, post.category); - }); +const c = new Core(); +c.init().then(() => { // 全ての(人間によって証明されていない)投稿を取得 Post.find({ text: { @@ -45,7 +23,7 @@ Post.find({ }).then(posts => { posts.forEach(post => { console.log(`predicting... ${post._id}`); - const category = classifier.categorize(post.text); + const category = c.predict(post.text); Post.update({ _id: post._id }, { $set: {