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", | ||||
|     "animejs": "2.0.2", | ||||
|     "autwh": "0.0.1", | ||||
|     "bayes": "0.0.7", | ||||
|     "bcryptjs": "2.4.3", | ||||
|     "body-parser": "1.17.2", | ||||
|     "cafy": "2.4.0", | ||||
|  | @ -120,6 +121,7 @@ | |||
|     "is-root": "1.0.0", | ||||
|     "is-url": "1.2.2", | ||||
|     "js-yaml": "3.9.1", | ||||
|     "mecab-async": "^0.1.0", | ||||
|     "mongodb": "2.2.31", | ||||
|     "monk": "6.0.3", | ||||
|     "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