質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1670閲覧

Node.jsでテキスト解析

matusmon

総合スコア12

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/01/20 11:12

###前提・実現したいこと
初めての投稿です。
よろしくお願いします。

日本語文字列を含むテキストを解析して自動的にカテゴライズするための仕組みを趣味で作りたいと思っています。
こちらこちらを参考に、npmのパッケージ baysとmecab-async用いて同一のスクリプト内でカテゴライズできることは確認できたのですが、学習用データが膨大なため、モデルデータとして予めjson形式でエクスポートしておき、別のスクリプトでそのjsonファイルを使ってカテゴライズしたいと考えています。

javascript

1classifier.learn(text, category)

で学習させた後、

javascript

1var stateJson = classifier.toJson()

stateJsonをテキスト出力し、
別のスクリプトで

javascript

1var jsonFile = fs.readFileSync('./model.json', 'utf8') 2var revivedClassifier = bayes.fromJson(jsonFile)

としたところで、一体、revivedClassifierをどう使えば日本語文字列をカテゴライズできるのかいまいち分からず、行き詰まってしまいました。
ご教示願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

参考元の2つのURLでほぼ理解できると思いますが?

revivedClassifierは、学習結果のjsonから生成したclassifierで、revivedClassifier.categorize()すればカテゴライズします。

js

1//ベイジアンフィルタ for Node.js 2// モジュール 3var bayes = require('bayes'); 4var Mecab = require('mecab-lite'); 5mecab = new Mecab(); 6mecab.MECAB = '"C:\Program Files (x86)\Mecab\bin\mecab"'; 7mecab.ENCODING = 'UTF-8'; 8var fs = require('fs'); 9 10// 判定するワード 11var word1 = 'ファッションチェック'; 12var word2 = '映画専門誌「キネマ旬報」などに寄稿'; 13var word3 = '物まねネタ・ヒーコで再ブレイク'; 14 15var classifier = null; 16 17// 学習jsonファイルチェック 18fs.access('learned.json', err => { 19 if (err) { 20 // なければclassifierインスタンス生成し、学習 21 classifier = bayes({ 22 tokenizer: function (text) { 23 return mecab.wakatigakiSync(text); 24 } 25 }); 26 learn(); 27 } else { 28 // 学習jsonがあれば、学習jsonからclassifierを生成 29 var json = fs.readFileSync('learned.json'); 30 classifier = bayes.fromJson(json); 31 // カテゴライズ 32 categorizeStart(); 33 } 34}); 35 36function learn() { 37 //学習情報 wikiから取得した内容 38 var text1 = '長いので略'; 39 var text2 = '長いので略'; 40 var name1 = 'おすぎ'; 41 var name2 = 'ピーコ'; 42 43 //学習させる 44 classifier.learn(text1, name1); 45 classifier.learn(text2, name2); 46 47 // 学習結果を保存 48 var stateJson = classifier.toJson(); 49 fs.writeFile('learned.json', stateJson); 50 51//カテゴライズ 52 categorizeStart(); 53} 54 55 56function categorizeStart() { 57 //判定させる 58 categorize(word1); 59 categorize(word2); 60 categorize(word3); 61} 62 63//判定結果 64function categorize(text) { 65 var r = classifier.categorize(text); 66 console.log(text + "は" + r); 67}

投稿2018/01/20 12:39

turbgraphics200

総合スコア4267

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matusmon

2018/01/20 13:03

ありがとうございます。 確かに、jsonからclassifierインスタンスを作ることでカテゴライズ可能でした。 ということは、 classifier.categorize(text) でカテゴライズするtextは、分かち書きされていない状態で渡される、という認識で合っているでしょうか。
matusmon

2018/01/20 13:42

bayes/lib/naive_bayes.jsのソースを見ると、categorizeの処理の中で、tokenを作るためにdefaultTokenizerの中で文字列の整形処理を行っているように見えます。 その際に、正規表現で日本語文字列等はスペース文字に置換されてしまっていて、期待通りの結果が得られません。 jsonからclassifierインスタンスを作るときに、どのようにしたらtokenizerのオプションを使うことができるのでしょうか。 もしくは、naive_bayes.jsを改造するしか無いのでしょうか。
takashikawai

2023/08/31 07:53

naive_bayes.jsを改造したらうまくいきました。 /** * Given an input string, tokenize it into an array of word tokens. * This is the default tokenization function used if user does not provide one in `options`. * * @param {String} text * @return {Array} */ var defaultTokenizer = function (text) { //remove punctuation from text - remove anything that isn't a word char or a space //var rgxPunctuation = /[^(a-zA-ZA-Яa-я0-9_)+\s]/g //var sanitized = text.replace(rgxPunctuation, ' ') //return sanitized.split(/\s+/) const TinySegmenter = require('tiny-segmenter'); const segmenter = new TinySegmenter(); return segmenter.segment(text); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問