wip
This commit is contained in:
		
							parent
							
								
									016dda27bd
								
							
						
					
					
						commit
						f33571f2f4
					
				
					 2 changed files with 91 additions and 0 deletions
				
			
		|  | @ -97,6 +97,7 @@ | ||||||
|     "accesses": "2.5.0", |     "accesses": "2.5.0", | ||||||
|     "animejs": "2.0.2", |     "animejs": "2.0.2", | ||||||
|     "autwh": "0.0.1", |     "autwh": "0.0.1", | ||||||
|  |     "bayes": "0.0.7", | ||||||
|     "bcryptjs": "2.4.3", |     "bcryptjs": "2.4.3", | ||||||
|     "body-parser": "1.17.2", |     "body-parser": "1.17.2", | ||||||
|     "cafy": "2.4.0", |     "cafy": "2.4.0", | ||||||
|  | @ -120,6 +121,7 @@ | ||||||
|     "is-root": "1.0.0", |     "is-root": "1.0.0", | ||||||
|     "is-url": "1.2.2", |     "is-url": "1.2.2", | ||||||
|     "js-yaml": "3.9.1", |     "js-yaml": "3.9.1", | ||||||
|  |     "mecab-async": "^0.1.0", | ||||||
|     "mongodb": "2.2.31", |     "mongodb": "2.2.31", | ||||||
|     "monk": "6.0.3", |     "monk": "6.0.3", | ||||||
|     "morgan": "1.8.2", |     "morgan": "1.8.2", | ||||||
|  |  | ||||||
							
								
								
									
										89
									
								
								src/tools/ai/categorizer.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								src/tools/ai/categorizer.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,89 @@ | ||||||
|  | import * as fs from 'fs'; | ||||||
|  | const bayes = require('bayes'); | ||||||
|  | const MeCab = require('mecab-async'); | ||||||
|  | import Post from '../../api/models/post'; | ||||||
|  | 
 | ||||||
|  | export default class Categorizer { | ||||||
|  | 	classifier: any; | ||||||
|  | 	categorizerDbFilePath: string; | ||||||
|  | 	mecab: any; | ||||||
|  | 
 | ||||||
|  | 	constructor(categorizerDbFilePath: string, mecabCommand: string = 'mecab -d /usr/share/mecab/dic/mecab-ipadic-neologd') { | ||||||
|  | 		this.categorizerDbFilePath = categorizerDbFilePath; | ||||||
|  | 
 | ||||||
|  | 		this.mecab = new MeCab(); | ||||||
|  | 		this.mecab.command = mecabCommand; | ||||||
|  | 
 | ||||||
|  | 		// BIND -----------------------------------
 | ||||||
|  | 		this.tokenizer = this.tokenizer.bind(this); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	tokenizer(text: string) { | ||||||
|  | 		return this.mecab.wakachiSync(text); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	async init() { | ||||||
|  | 		try { | ||||||
|  | 			const db = fs.readFileSync(this.categorizerDbFilePath, { | ||||||
|  | 				encoding: 'utf8' | ||||||
|  | 			}); | ||||||
|  | 
 | ||||||
|  | 			this.classifier = bayes.fromJson(db); | ||||||
|  | 			this.classifier.tokenizer = this.tokenizer; | ||||||
|  | 		} catch(e) { | ||||||
|  | 			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); | ||||||
|  | 			}); | ||||||
|  | 
 | ||||||
|  | 			this.save(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	async learn(id, category) { | ||||||
|  | 		const post = await Post.findOne({ _id: id }); | ||||||
|  | 
 | ||||||
|  | 		Post.update({ _id: id }, { | ||||||
|  | 			$set: { | ||||||
|  | 				category: category, | ||||||
|  | 				is_category_verified: true | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
|  | 		this.classifier.learn(post.text, category); | ||||||
|  | 
 | ||||||
|  | 		this.save(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	async categorize(id) { | ||||||
|  | 		const post = await Post.findOne({ _id: id }); | ||||||
|  | 
 | ||||||
|  | 		const category = this.classifier.categorize(post.text); | ||||||
|  | 
 | ||||||
|  | 		Post.update({ _id: id }, { | ||||||
|  | 			$set: { | ||||||
|  | 				category: category | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	async test(text) { | ||||||
|  | 		return this.classifier.categorize(text); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	save() { | ||||||
|  | 		fs.writeFileSync(this.categorizerDbFilePath, this.classifier.toJson(), { | ||||||
|  | 			encoding: 'utf8' | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue