summaryrefslogtreecommitdiff
path: root/src/tools/analysis/core.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/analysis/core.ts')
-rw-r--r--src/tools/analysis/core.ts49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/tools/analysis/core.ts b/src/tools/analysis/core.ts
new file mode 100644
index 0000000000..20e5fa6c51
--- /dev/null
+++ b/src/tools/analysis/core.ts
@@ -0,0 +1,49 @@
+const bayes = require('./naive-bayes.js');
+
+const MeCab = require('./mecab');
+import Post from '../../api/models/post';
+
+/**
+ * 投稿を学習したり与えられた投稿のカテゴリを予測します
+ */
+export default class Categorizer {
+ private classifier: any;
+ private mecab: any;
+
+ constructor() {
+ this.mecab = new MeCab();
+
+ // BIND -----------------------------------
+ this.tokenizer = this.tokenizer.bind(this);
+ }
+
+ private tokenizer(text: string) {
+ const tokens = this.mecab.parseSync(text)
+ // 名詞だけに制限
+ .filter(token => token[1] === '名詞')
+ // 取り出し
+ .map(token => token[0]);
+
+ return tokens;
+ }
+
+ 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);
+ }
+}