summaryrefslogtreecommitdiff
path: root/src/tools
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2017-09-06 23:58:28 +0900
committersyuilo <syuilotan@yahoo.co.jp>2017-09-06 23:58:28 +0900
commited3e188bfc1102bf6deb3a39b1a2bd0de4553490 (patch)
treedf69352ce9faa5c6ffb5b2d26af356926495aba7 /src/tools
parentv2544 (diff)
downloadsharkey-ed3e188bfc1102bf6deb3a39b1a2bd0de4553490.tar.gz
sharkey-ed3e188bfc1102bf6deb3a39b1a2bd0de4553490.tar.bz2
sharkey-ed3e188bfc1102bf6deb3a39b1a2bd0de4553490.zip
Refactoring
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/ai/core.ts45
-rw-r--r--src/tools/ai/predict-all-post-category.ts30
2 files changed, 49 insertions, 26 deletions
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';
-
-const classifier = bayes({
- tokenizer: this.tokenizer
-});
+import Core from './core';
-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: {