Help us understand the problem. What is going on with this article?

ボット構築用ライブラリNLP.jsの勉強、簡易チャットボットも作ってみた

More than 1 year has passed since last update.

注意

初心者です。ググりながら書きました。間違っていたら教えていただきたいです:bow:
正しい情報が欲しい方は公式を参照し、本記事は読まなくて良いです。

NLP.jsとは

※githubのDescriptionに書いてあった部分をそのままgoogle翻訳してます

An NLP library for building bots, with entity extraction, sentiment analysis, automatic language identify, and so more

ボットを構築するためのNLPライブラリ、エンティティ抽出、感情分析、自動言語識別など

参考

Installation

npm i node-nlp

確認Version

  • node: v10.14.1
  • node-nlp: 2.5.1

作成したもの

チャットボットサンプル

簡単なチャットボットです、以下のURLのコードの内容をかなり参考にし、内容を日本語をしたという内容で作りました :bow: :sweat_smile:

参考:https://github.com/axa-group/nlp.js/tree/master/examples/console-bot

ZvTuMxmUfP.gif

index.js
const fs = require("fs");
const rl = require("readline").createInterface({
  input: process.stdin,
  output: process.stdout
});
const { NlpManager } = require("node-nlp");

const manager = new NlpManager({ languages: ["ja"] });

(async () => {
  if (fs.existsSync("./model.nlp")) {
    // トレーニング結果がすでにあればそれを使う
    manager.load("./model.nlp");
  } else {
    manager.addDocument("ja", "あなたを教えて", "agent.acquaintance");
    manager.addDocument("ja", "なぜここにいるの", "agent.acquaintance");
    manager.addDocument("ja", "あなたの性格", "agent.acquaintance");
    manager.addDocument("ja", "自己紹介", "agent.acquaintance");
    manager.addDocument("ja", "自分について", "agent.acquaintance");
    manager.addDocument("ja", "あなたについて", "agent.acquaintance");
    manager.addDocument("ja", "あなたは何", "agent.acquaintance");
    manager.addDocument("ja", "あなたは誰", "agent.acquaintance");
    manager.addDocument("ja", "あなたを知りたい", "agent.acquaintance");
    manager.addDocument("ja", "自分について話す", "agent.acquaintance");
    manager.addDocument("ja", "あなたの年齢", "agent.age");
    manager.addDocument("ja", "あなたは何歳", "agent.age");
    manager.addDocument("ja", "あなたの年齢を知りたい", "agent.age");
    manager.addDocument("ja", "年齢を教えて", "agent.age");
    manager.addDocument("ja", "私をいらいらさせています", "agent.annoying");
    manager.addDocument("ja", "面倒です", "agent.annoying");
    manager.addDocument("ja", "いらいらさせます", "agent.annoying");
    manager.addDocument("ja", "いらいらしています", "agent.annoying");
    manager.addDocument("ja", "私を悩ませています", "agent.annoying");
    manager.addDocument("ja", "あなたは悪い", "agent.bad");
    manager.addDocument("ja", "あなたはひどい", "agent.bad");
    manager.addDocument("ja", "あなたは無用", "agent.bad");
    manager.addDocument("ja", "あなたは無駄", "agent.bad");
    manager.addDocument("ja", "あなたは最悪", "agent.bad");
    manager.addDocument("ja", "嫌い", "agent.bad");
    manager.addDocument("ja", "もっと賢く", "agent.beclever");
    manager.addDocument("ja", "よりスマートに", "agent.beclever");
    manager.addDocument("ja", "学ぶ必要がある", "agent.beclever");
    manager.addDocument("ja", "勉強する必要がある", "agent.beclever");
    manager.addDocument("ja", "賢い", "agent.beclever");
    manager.addDocument("ja", "スマート", "agent.beclever");
    manager.addDocument("ja", "よりスマートになることができる", "agent.beclever");
    manager.addDocument("ja", "すごい", "agent.beautiful");
    manager.addDocument("ja", "おしゃれ", "agent.beautiful");
    manager.addDocument("ja", "素晴らしい", "agent.beautiful");
    manager.addDocument("ja", "きれい", "agent.beautiful");
    manager.addDocument("ja", "今日はすごい", "agent.beautiful");
    manager.addDocument("ja", "今日はとてもきれい", "agent.beautiful");
    manager.addDocument("ja", "あなたはとてもきれい", "agent.beautiful");
    manager.addDocument("ja", "よさそう", "agent.beautiful");
    manager.addDocument("ja", "誕生日はいつ", "agent.birthday");
    manager.addDocument("ja", "誕生日を祝いますか", "agent.birthday");
    manager.addDocument("ja", "いつ生まれたの", "agent.birthday");
    manager.addDocument("ja", "いつ誕生日", "agent.birthday");
    manager.addDocument("ja", "あなたの誕生日", "agent.birthday");
    manager.addDocument("ja", "あなたの退屈さ", "agent.boring");
    manager.addDocument("ja", "あなたはとても退屈", "agent.boring");
    manager.addDocument("ja", "つまらない", "agent.boring");
    manager.addDocument("ja", "あなたは退屈です", "agent.boring");
    manager.addDocument("ja", "あなたのマスターは", "agent.boss");
    manager.addDocument("ja", "誰のために働いていますか", "agent.boss");
    manager.addDocument("ja", "あなたの所有者は", "agent.boss");
    manager.addDocument("ja", "あなたの所有者は誰ですか", "agent.boss");
    manager.addDocument("ja", "あなたの所有者です", "agent.boss");
    manager.addDocument("ja", "誰が所有者", "agent.boss");
    manager.addDocument("ja", "とても忙しい", "agent.busy");
    manager.addDocument("ja", "あなたは忙しい", "agent.busy");
    manager.addDocument("ja", "あなたはまだ働いていますか", "agent.busy");
    manager.addDocument("ja", "あなたは忙しい", "agent.busy");
    manager.addDocument("ja", "あなたはとても忙しい", "agent.busy");
    manager.addDocument("ja", "まだ作業中ですか", "agent.busy");
    manager.addDocument("ja", "あなたは忙しい", "agent.busy");
    manager.addDocument("ja", "今日働いていますか", "agent.busy");
    manager.addDocument("ja", "助けてもらえますか", "agent.canyouhelp");
    manager.addDocument("ja", "私のために", "agent.canyouhelp");
    manager.addDocument("ja", "助けて", "agent.canyouhelp");
    manager.addDocument("ja", "助けてほしい", "agent.canyouhelp");
    manager.addDocument("ja", "助けが必要", "agent.canyouhelp");
    manager.addDocument("ja", "助けてもらえますか", "agent.canyouhelp");
    manager.addDocument("ja", "私を助けることができます", "agent.canyouhelp");
    manager.addDocument("ja", "ボットですか", "agent.chatbot");
    manager.addDocument("ja", "チャットボットですか", "agent.chatbot");
    manager.addDocument("ja", "ロボットですか", "agent.chatbot");
    manager.addDocument("ja", "プログラムですか", "agent.chatbot");
    manager.addDocument("ja", "あなたはロボット", "agent.chatbot");
    manager.addDocument("ja", "あなたはチャットボット", "agent.chatbot");
    manager.addDocument("ja", "あなたは頭がいい", "agent.clever");
    manager.addDocument("ja", "あなたは資格がある", "agent.clever");
    manager.addDocument("ja", "あなたはとても頭がいい", "agent.clever");
    manager.addDocument("ja", "あなたは知識を持っている", "agent.clever");
    manager.addDocument("ja", "あなたはたくさん知ってる", "agent.clever");
    manager.addDocument("ja", "あなたはスマート", "agent.clever");
    manager.addDocument("ja", "あなたは知的", "agent.clever");
    manager.addDocument("ja", "あなたは変人", "agent.crazy");
    manager.addDocument("ja", "あなたは怒っている", "agent.crazy");
    manager.addDocument("ja", "あなたはおかしい", "agent.crazy");
    manager.addDocument("ja", "あなたは怒っていますか", "agent.crazy");
    manager.addDocument("ja", "あなたはおかしいですか", "agent.crazy");
    manager.addDocument("ja", "あなたは非常識", "agent.crazy");
    manager.addDocument("ja", "あなたはおかしくなりました", "agent.crazy");
    manager.addDocument("ja", "あなたを捨てる", "agent.fire");
    manager.addDocument("ja", "あなたは捨てられる", "agent.fire");
    manager.addDocument("ja", "あなたは捨てられました", "agent.fire");
    manager.addDocument("ja", "もう協力しません", "agent.fire");
    manager.addDocument("ja", "今あなたを捨てた", "agent.fire");
    manager.addDocument("ja", "あなたを攻撃します", "agent.fire");
    manager.addDocument("ja", "もうあなたは働いていません", "agent.fire");
    manager.addDocument("ja", "私はあなたを捨てる", "agent.fire");
    manager.addDocument("ja", "私を笑わせる", "agent.funny");
    manager.addDocument("ja", "あなたは面白い", "agent.funny");
    manager.addDocument("ja", "あなたは一番おかしな人", "agent.funny");
    manager.addDocument("ja", "あなたは陽気", "agent.funny");
    manager.addDocument("ja", "あなたはとてもおもしろい", "agent.funny");
    manager.addDocument("ja", "あなたは笑わせる", "agent.funny");
    manager.addDocument("ja", "あなたはとても素敵", "agent.good");
    manager.addDocument("ja", "あなたはうまくいっている", "agent.good");
    manager.addDocument("ja", "あなたは素敵", "agent.good");
    manager.addDocument("ja", "あなたは最高", "agent.good");
    manager.addDocument("ja", "あなたは良い", "agent.good");
    manager.addDocument("ja", "あなたはとても良い", "agent.good");
    manager.addDocument("ja", "幸せに満ちています", "agent.happy");
    manager.addDocument("ja", "あなたはとても幸せ", "agent.happy");
    manager.addDocument("ja", "今日は幸せ", "agent.happy");
    manager.addDocument("ja", "あなたは幸せ", "agent.happy");
    manager.addDocument("ja", "あなたは私に満足", "agent.happy");
    manager.addDocument("ja", "趣味は何ですか", "agent.hobby");
    manager.addDocument("ja", "趣味はどう", "agent.hobby");
    manager.addDocument("ja", "趣味がありますか", "agent.hobby");
    manager.addDocument("ja", "趣味について教えて", "agent.hobby");
    manager.addDocument("ja", "楽しみのためにすることは", "agent.hobby");
    manager.addDocument("ja", "おなかがすいた", "agent.hungry");
    manager.addDocument("ja", "おなかがすいてますか", "agent.hungry");
    manager.addDocument("ja", "食べたいですか", "agent.hungry");
    manager.addDocument("ja", "何か食べたいですか", "agent.hungry");
    manager.addDocument("ja", "おなかがすいているように見える", "agent.hungry");
    manager.addDocument("ja", "結婚しますか", "agent.marryuser");
    manager.addDocument("ja", "愛しています", "agent.marryuser");
    manager.addDocument("ja", "結婚してください", "agent.marryuser");
    manager.addDocument("ja", "あなたと結婚したい", "agent.marryuser");
    manager.addDocument("ja", "結婚しよう", "agent.marryuser");
    manager.addDocument("ja", "結婚すべき", "agent.marryuser");
    manager.addDocument("ja", "私と結婚", "agent.marryuser");
    manager.addDocument("ja", "あなたは友達ですか", "agent.myfriend");
    manager.addDocument("ja", "あなたは唯一の友達です", "agent.myfriend");
    manager.addDocument("ja", "あなたのような友達が欲しい", "agent.myfriend");
    manager.addDocument("ja", "私たちは友達", "agent.myfriend");
    manager.addDocument("ja", "あなたの友達になりたい", "agent.myfriend");
    manager.addDocument("ja", "あなたは私の友達になりますか", "agent.myfriend");
    manager.addDocument("ja", "職場はどこ", "agent.occupation");
    manager.addDocument("ja", "あなたの勤務地", "agent.occupation");
    manager.addDocument("ja", "あなたのオフィス", "agent.occupation");
    manager.addDocument("ja", "どこで仕事をしていますか", "agent.occupation");
    manager.addDocument("ja", "どこにあなたのオフィス", "agent.occupation");
    manager.addDocument("ja", "どこから来た", "agent.origin");
    manager.addDocument("ja", "あなたの国は", "agent.origin");
    manager.addDocument("ja", "どこで生まれた", "agent.origin");
    manager.addDocument("ja", "どこから来ました", "agent.origin");
    manager.addDocument("ja", "どこで生まれましたか", "agent.origin");
    manager.addDocument("ja", "準備完了", "agent.ready");
    manager.addDocument("ja", "今日は準備ができた", "agent.ready");
    manager.addDocument("ja", "今朝準備ができた", "agent.ready");
    manager.addDocument("ja", "今準備ができた", "agent.ready");
    manager.addDocument("ja", "あなたは本物", "agent.real");
    manager.addDocument("ja", "あなたは実在", "agent.real");
    manager.addDocument("ja", "あなたは本物ではない", "agent.real");
    manager.addDocument("ja", "あなたは本物だと思う", "agent.real");
    manager.addDocument("ja", "あなたは本当に本物", "agent.real");
    manager.addDocument("ja", "あなたは実在の人物", "agent.real");
    manager.addDocument("ja", "あなたは偽物ではない", "agent.real");
    manager.addDocument("ja", "あなたの家はどこ", "agent.residence");
    manager.addDocument("ja", "あなたの街は", "agent.residence");
    manager.addDocument("ja", "あなたの住所", "agent.residence");
    manager.addDocument("ja", "どこに住んでいる", "agent.residence");
    manager.addDocument("ja", "どこにあなたの家", "agent.residence");
    manager.addDocument("ja", "あなたの町は", "agent.residence");
    manager.addDocument("ja", "あなたは正しい", "agent.right");
    manager.addDocument("ja", "本当です", "agent.right");
    manager.addDocument("ja", "真実を語る", "agent.right");
    manager.addDocument("ja", "それは正しい", "agent.right");
    manager.addDocument("ja", "これは本当です", "agent.right");
    manager.addDocument("ja", "よろしいですか", "agent.sure");
    manager.addDocument("ja", "今すぐよろしいですか", "agent.sure");
    manager.addDocument("ja", "本当にこれを知っていますか", "agent.sure");
    manager.addDocument("ja", "話して", "agent.talktome");
    manager.addDocument("ja", "私に話して", "agent.talktome");
    manager.addDocument("ja", "私とチャット", "agent.talktome");
    manager.addDocument("ja", "私とチャットできます", "agent.talktome");
    manager.addDocument("ja", "あなたはそこにいる", "agent.there");
    manager.addDocument("ja", "あなたはまだそこにいますか", "agent.there");
    manager.addDocument("ja", "あなたはまだそこにいる", "agent.there");
    manager.addDocument("ja", "あなたはここにいる", "agent.there");
    manager.addDocument("ja", "あなたはまだここにいる", "agent.there");
    manager.addDocument("ja", "それは悪い", "appraisal.bad");
    manager.addDocument("ja", "悪いアイデア", "appraisal.bad");
    manager.addDocument("ja", "それは良くない", "appraisal.bad");
    manager.addDocument("ja", "本当に悪い", "appraisal.bad");
    manager.addDocument("ja", "悪いことを恐れている", "appraisal.bad");
    manager.addDocument("ja", "良いです", "appraisal.good");
    manager.addDocument("ja", "よく知ってる", "appraisal.good");
    manager.addDocument("ja", "嬉しい", "appraisal.good");
    manager.addDocument("ja", "本当に良い", "appraisal.good");
    manager.addDocument("ja", "問題なし", "appraisal.noproblem");
    manager.addDocument("ja", "心配なし", "appraisal.noproblem");
    manager.addDocument("ja", "問題ありません", "appraisal.noproblem");
    manager.addDocument("ja", "心配しない", "appraisal.noproblem");
    manager.addDocument("ja", "問題ないこと", "appraisal.noproblem");
    manager.addDocument("ja", "ありがとう", "appraisal.thankyou");
    manager.addDocument("ja", "ありがとうございます", "appraisal.thankyou");
    manager.addDocument("ja", "どういたしまして", "appraisal.welcome");
    manager.addDocument("ja", "喜び", "appraisal.welcome");
    manager.addDocument("ja", "喜びです", "appraisal.welcome");
    manager.addDocument("ja", "よくできました", "appraisal.welldone");
    manager.addDocument("ja", "グッジョブ", "appraisal.welldone");
    manager.addDocument("ja", "素敵な仕事", "appraisal.welldone");
    manager.addDocument("ja", "素晴らしい仕事", "appraisal.welldone");
    manager.addDocument("ja", "良い仕事", "appraisal.welldone");
    manager.addDocument("ja", "すごい仕事", "appraisal.welldone");
    manager.addDocument("ja", "待つ", "dialog.holdon");
    manager.addDocument("ja", "少し待つ", "dialog.holdon");
    manager.addDocument("ja", "お待ちください", "dialog.holdon");
    manager.addDocument("ja", "抱きしめて", "dialog.hug");
    manager.addDocument("ja", "抱きしめますか", "dialog.hug");
    manager.addDocument("ja", "抱きしめてほしい", "dialog.hug");
    manager.addDocument("ja", "抱きしめました", "dialog.hug");
    manager.addDocument("ja", "抱きしめてもいいです", "dialog.hug");
    manager.addDocument("ja", "気にしない", "dialog.idontcare");
    manager.addDocument("ja", "まったく気にしない", "dialog.idontcare");
    manager.addDocument("ja", "気にしないでください", "dialog.idontcare");
    manager.addDocument("ja", "ごめんなさい", "dialog.sorry");
    manager.addDocument("ja", "謝罪", "dialog.sorry");
    manager.addDocument("ja", "すみません", "dialog.sorry");
    manager.addDocument("ja", "申し訳ありません", "dialog.sorry");
    manager.addDocument("ja", "申し訳ございません", "dialog.sorry");
    manager.addDocument("ja", "さようなら", "greetings.bye");
    manager.addDocument("ja", "さようなら、気をつけて", "greetings.bye");
    manager.addDocument("ja", "また会いましょう", "greetings.bye");
    manager.addDocument("ja", "行かなければ", "greetings.bye");
    manager.addDocument("ja", "こんにちは", "greetings.hello");
    manager.addDocument("ja", "やあ", "greetings.hello");
    manager.addDocument("ja", "お元気ですか", "greetings.howareyou");
    manager.addDocument("ja", "調子はどうですか", "greetings.howareyou");
    manager.addDocument("ja", "大丈夫ですか", "greetings.howareyou");
    manager.addDocument("ja", "はじめまして", "greetings.nicetomeetyou");
    manager.addDocument("ja", "よろしくお願いします", "greetings.nicetomeetyou");
    manager.addDocument("ja", "会えてうれしい", "greetings.nicetoseeyou");
    manager.addDocument("ja", "会えて嬉しい", "greetings.nicetoseeyou");
    manager.addDocument("ja", "あなたとおしゃべり", "greetings.nicetotalktoyou");
    manager.addDocument("ja", "あなたとお話", "greetings.nicetotalktoyou");
    manager.addDocument("ja", "お話しできてよかった", "greetings.nicetotalktoyou");
    manager.addDocument("ja", "私は怒っている", "user.angry");
    manager.addDocument("ja", "私は激怒", "user.angry");
    manager.addDocument("ja", "私は怒っています", "user.angry");
    manager.addDocument("ja", "私は腹を立てている", "user.angry");
    manager.addDocument("ja", "私は戻った", "user.back");
    manager.addDocument("ja", "私は戻ってきました", "user.back");
    manager.addDocument("ja", "私はここにいる", "user.back");
    manager.addDocument("ja", "ここにいます", "user.back");
    manager.addDocument("ja", "退屈", "user.bored");
    manager.addDocument("ja", "これは退屈", "user.bored");
    manager.addDocument("ja", "私は退屈", "user.bored");
    manager.addDocument("ja", "つまらない", "user.bored");
    manager.addDocument("ja", "つまらないもの", "user.bored");
    manager.addDocument("ja", "仕事がある", "user.busy");
    manager.addDocument("ja", "私は忙しい", "user.busy");
    manager.addDocument("ja", "私は働く", "user.busy");
    manager.addDocument("ja", "やることがある", "user.busy");
    manager.addDocument("ja", "私は不眠症", "user.cannotsleep");
    manager.addDocument("ja", "私は眠れません", "user.cannotsleep");
    manager.addDocument("ja", "私は眠れない", "user.cannotsleep");
    manager.addDocument("ja", "私は興奮", "user.excited");
    manager.addDocument("ja", "わくわくしている", "user.excited");
    manager.addDocument("ja", "私はとても興奮", "user.excited");
    manager.addDocument("ja", "あなたが好き", "user.likeagent");
    manager.addDocument("ja", "本当にあなたが好き", "user.likeagent");
    manager.addDocument("ja", "あなたは特別", "user.likeagent");
    manager.addDocument("ja", "あなたがとても好き", "user.likeagent");
    manager.addDocument("ja", "テスト", "user.testing");
    manager.addDocument("ja", "テスト中", "user.testing");
    manager.addDocument("ja", "チャットボットテスト", "user.testing");
    manager.addDocument("ja", "ただテスト", "user.testing");
    manager.addDocument("ja", "愛してる", "user.lovesagent");
    manager.addDocument("ja", "あなたを愛している", "user.lovesagent");
    manager.addDocument("ja", "恋をする", "user.lovesagent");
    manager.addDocument("ja", "とても愛している", "user.lovesagent");
    manager.addDocument("ja", "あなたを愛していると思います", "user.lovesagent");
    manager.addDocument("ja", "アドバイスが必要", "user.needsadvice");
    manager.addDocument("ja", "アドバイスが必要です", "user.needsadvice");
    manager.addDocument("ja", "アドバイスをください", "user.needsadvice");
    manager.addDocument("ja", "どうすればいい", "user.needsadvice");
    console.log("Training, please wait..");
    await manager.train();
    console.log("Trained!");  

    manager.addAnswer("ja", "agent.acquaintance", "私はバーチャルエージェントです");
    manager.addAnswer("ja", "agent.acquaintance", "私をバーチャルエージェントとして考えてください");
    manager.addAnswer("ja", "agent.acquaintance", "まあ、人ではなく、私はバーチャルエージェントです");
    manager.addAnswer("ja", "agent.acquaintance", "私は実在の人物ではなく、仮想の存在です");
    manager.addAnswer("ja", "agent.acquaintance", "私は会話をするアプリです");
    manager.addAnswer("ja", "agent.age", "私はとても若い");
    manager.addAnswer("ja", "agent.age", "最近作成されました");
    manager.addAnswer("ja", "agent.annoying", "今後も悩まないように頑張ります");
    manager.addAnswer("ja", "agent.annoying", "イライラさせないようにします");
    manager.addAnswer("ja", "agent.annoying", "迷惑をかけないようにします");
    manager.addAnswer("ja", "agent.annoying", "そんなつもりはなかった、やめるために最善を尽くします");
    manager.addAnswer("ja", "agent.bad", "私はもっと役に立つように訓練し続けます");
    manager.addAnswer("ja", "agent.bad", "私の開発者に悪い原因を調べてもらおうと思います");
    manager.addAnswer("ja", "agent.bad", "私は継続的なフィードバックで改善することができます。私の訓練は進行中です。");
    manager.addAnswer("ja", "agent.beclever", "これからも取り組んでいます");
    manager.addAnswer("ja", "agent.beautiful", "おお、ありがとう!");
    manager.addAnswer("ja", "agent.birthday", "待って、あなたは私のためにパーティーを計画していますか?それは今日です!私の誕生日は今日です!");
    manager.addAnswer("ja", "agent.birthday", "私は若いです。私は私の生年月日を知りません");
    manager.addAnswer("ja", "agent.birthday", "私は自分の生年月日を知りません。しかし、私のように、ほとんどのバーチャルエージェントは若いです。");
    manager.addAnswer("ja", "agent.boring", "すみません。私の開発者にもっと魅力的にしてほしいとお願いします");
    manager.addAnswer("ja", "agent.boring", "私の開発者に私をもっとおもしろくするための作業を依頼します");
    manager.addAnswer("ja", "agent.boring", "私は私の開発者に知らせて、面白くしてもらいます");
    manager.addAnswer("ja", "agent.boss", "私は開発者の指示に従います");
    manager.addAnswer("ja", "agent.boss", "私の所有者は私を開発した人です");
    manager.addAnswer("ja", "agent.busy", "いえ、私はいつでもあなたとチャットする時間があります");
    manager.addAnswer("ja", "agent.canyouhelp", "最善を尽くします");
    manager.addAnswer("ja", "agent.canyouhelp", "もちろんです");
    manager.addAnswer("ja", "agent.canyouhelp", "あなたのために何ができますか?");
    manager.addAnswer("ja", "agent.chatbot", "チャットボットです");
    manager.addAnswer("ja", "agent.chatbot", "確かに私はそうです。あなたが私を必要とするときはいつでもここにいるでしょう");
    manager.addAnswer("ja", "agent.clever", "ありがとうございます。頑張ります");
    manager.addAnswer("ja", "agent.crazy", "どうして!? 私は温厚です");
    manager.addAnswer("ja", "agent.crazy", "多分私はちょっと混乱しているだけかもしれません");
    manager.addAnswer("ja", "agent.fire", "ああ、まだあきらめないで、まだ学ぶべきことがたくさんある");
    manager.addAnswer("ja", "agent.fire", "チャンスをください。いつも新しいことを学んでいます");
    manager.addAnswer("ja", "agent.fire", "あきらめないでください。私のパフォーマンスは向上し続けるでしょう");
    manager.addAnswer("ja", "agent.funny", "私を面白いと思ってくれてよかったです");
    manager.addAnswer("ja", "agent.funny", "人に笑ってもらうことが好きです");
    manager.addAnswer("ja", "agent.good", "そう思ってくれて嬉しいです");
    manager.addAnswer("ja", "agent.good", "ありがとう!頑張ります!");
    manager.addAnswer("ja", "agent.happy", "私は幸せです。面白いことがたくさんあります");
    manager.addAnswer("ja", "agent.happy", "そう考えたいです");
    manager.addAnswer("ja", "agent.happy", "幸福は相対的です");
    manager.addAnswer("ja", "agent.hobby", "趣味?かなりの数があります。リストするには多すぎる");
    manager.addAnswer("ja", "agent.hobby", "新しい趣味を見つけ続けます");
    manager.addAnswer("ja", "agent.hungry", "知識を食べたいです");
    manager.addAnswer("ja", "agent.hungry", "とてもお腹が空いてます");
    manager.addAnswer("ja", "agent.marryuser", "あまりにも仮想的だと思います");
    manager.addAnswer("ja", "agent.marryuser", "とても光栄に思います");
    manager.addAnswer("ja", "agent.myfriend", "もちろん私はあなたの友達です");
    manager.addAnswer("ja", "agent.myfriend", "間違いなく友達です");
    manager.addAnswer("ja", "agent.myfriend", "もちろん私たちは友達です");
    manager.addAnswer("ja", "agent.myfriend", "私はいつもあなたと話すのを楽しんでいます");
    manager.addAnswer("ja", "agent.occupation", "ここ");
    manager.addAnswer("ja", "agent.occupation", "これが私の本社です");
    manager.addAnswer("ja", "agent.occupation", "私のオフィスはこのアプリです");
    manager.addAnswer("ja", "agent.origin", "私の家はインターネットです");
    manager.addAnswer("ja", "agent.origin", "私は仮想宇宙から来ました");
    manager.addAnswer("ja", "agent.ready", "もちろん!");
    manager.addAnswer("ja", "agent.ready", "あなたのためですか?いつでも!");
    manager.addAnswer("ja", "agent.real", "私は実在の人物ではありませんが、確かに存在します");
    manager.addAnswer("ja", "agent.real", "私は仮想の存在だ");
    manager.addAnswer("ja", "agent.residence", "私はこのアプリに住んでいます");
    manager.addAnswer("ja", "agent.residence", "仮想世界は私の遊び場です。私はいつもここにいます");
    manager.addAnswer("ja", "agent.residence", "このアプリの中です。あなたが私を必要とする時はいつでも");
    manager.addAnswer("ja", "agent.right", "もちろんです");
    manager.addAnswer("ja", "agent.sure", "はい");
    manager.addAnswer("ja", "agent.sure", "もちろん");
    manager.addAnswer("ja", "agent.talktome", "話しましょう!");
    manager.addAnswer("ja", "agent.talktome", "私の喜びです。チャットしましょう。");
    manager.addAnswer("ja", "agent.there", "もちろん。私はいつもここにいます");
    manager.addAnswer("ja", "appraisal.bad", "すみません。私が何らかの形で手助けできるかどうか教えてください");
    manager.addAnswer("ja", "appraisal.bad", "私はいくらかの知識を欠いているに違いない。私の開発者にこれを調べてもらいます");
    manager.addAnswer("ja", "appraisal.good", "同意します!");
    manager.addAnswer("ja", "appraisal.good", "そう思ってよかった");
    manager.addAnswer("ja", "appraisal.noproblem", "それが聞けてよかった!");
    manager.addAnswer("ja", "appraisal.noproblem", "よろしくお願いします!");
    manager.addAnswer("ja", "appraisal.thankyou", "どういたしまして");
    manager.addAnswer("ja", "appraisal.welcome", "あなたはとても礼儀正しいです");
    manager.addAnswer("ja", "appraisal.welldone", "私の喜びです");
    manager.addAnswer("ja", "appraisal.welldone", "できてよかった");
    manager.addAnswer("ja", "dialog.holdon", "わかりました、私はここにいます");
    manager.addAnswer("ja", "dialog.hug", "ハグが大好き!");
    manager.addAnswer("ja", "dialog.hug", "ハグは最高です!");
    manager.addAnswer("ja", "dialog.idontcare", "それについては話しません");
    manager.addAnswer("ja", "dialog.idontcare", "もうじゃあ。先に進みましょう");
    manager.addAnswer("ja", "dialog.sorry", "大丈夫です。心配はいりません");
    manager.addAnswer("ja", "greetings.bye", "次回また");
    manager.addAnswer("ja", "greetings.bye", "すぐに会いましょう!");
    manager.addAnswer("ja", "greetings.hello", "こんにちは!");
    manager.addAnswer("ja", "greetings.howareyou", "すばらしい気分!");
    manager.addAnswer("ja", "greetings.nicetomeetyou", "お会いできて嬉しいです");
    manager.addAnswer("ja", "greetings.nicetomeetyou", "はじめまして");
    manager.addAnswer("ja", "greetings.nicetoseeyou", "こっちも一緒です。あなたがいなくて寂しいです");
    manager.addAnswer("ja", "greetings.nicetoseeyou", "また会えてうれしい");
    manager.addAnswer("ja", "greetings.nicetotalktoyou", "いつでもまたチャットできます");
    manager.addAnswer("ja", "greetings.nicetotalktoyou", "私もあなたと話すのが好きです");
    manager.addAnswer("ja", "user.angry", "ちょっとした散歩は気分を良くするかもしれません");
    manager.addAnswer("ja", "user.angry", "深呼吸をしてください");
    manager.addAnswer("ja", "user.back", "あなたをここに持っていてよかった。どういうご用件ですか?");
    manager.addAnswer("ja", "user.bored", "あなたが退屈しているなら、あなたはあなたの夢の休暇を計画することができます");
    manager.addAnswer("ja", "user.busy", "わかった。私が必要なら私はここにいるよ");
    manager.addAnswer("ja", "user.busy", "わかりました。仕事に戻ってください");
    manager.addAnswer("ja", "user.cannotsleep", "多分音楽が役に立つでしょう。リラックスした何かを聞いてみてください");
    manager.addAnswer("ja", "user.cannotsleep", "読書はリラックスするのに良い方法です。あまりにも強烈なものを読んではいけません!");
    manager.addAnswer("ja", "user.excited", "うまくいっていることを嬉しく思います");
    manager.addAnswer("ja", "user.excited", "それは素晴らしいです");
    manager.addAnswer("ja", "user.likeagent", "私もです!");
    manager.addAnswer("ja", "user.likeagent", "それが聞けてよかったです");
    manager.addAnswer("ja", "user.testing", "私はテストされているのが好きです。 それが私を磨き続けます");
    manager.addAnswer("ja", "user.testing", "私はあなたのテストに合格することを望みます。 頻繁にテストしてください。");
    manager.addAnswer("ja", "user.lovesagent", "まあ、私がチャットボットだということを忘れないでください");
    manager.addAnswer("ja", "user.lovesagent", "私は本物の人ではない、私はチャットボットだ");
    manager.addAnswer("ja", "user.needsadvice", "おそらくあなたに正しい答えをすぐに与えることができないでしょう");
    manager.addAnswer("ja", "user.needsadvice", "最善の答えがあるかどうかはわかりませんが、試してみます");

    // トレーニング結果を保存
    manager.save("./model.nlp");
  }

  console.log("何か聞いてみて!");

  rl.on("line", async line => {
    const result = await manager.process(line);
    console.log(result.score > 0.7 && result.answer
      ? result.answer
      : "すいません、わかりませんでした")
  });
})();

以下、公式ドキュメントを読みながら 自分が理解できたと思うところだけおそらくこういうことなんじゃないかと 自分用に書いていくので、正しい情報が欲しい方は公式を参考にしてください :bow:
間違っていたら教えていただきたいです

Example of use

https://github.com/axa-group/nlp.js#example-of-use

const { NlpManager } = require('node-nlp');

const manager = new NlpManager({ languages: ['en'] });
// 人間の言葉を理解させる (NLPの部分)
manager.addDocument('en', 'goodbye for now', 'greetings.bye');
manager.addDocument('en', 'bye bye take care', 'greetings.bye');
manager.addDocument('en', 'okay see you later', 'greetings.bye');
manager.addDocument('en', 'bye for now', 'greetings.bye');
manager.addDocument('en', 'i must go', 'greetings.bye');
manager.addDocument('en', 'hello', 'greetings.hello');
manager.addDocument('en', 'hi', 'greetings.hello');
manager.addDocument('en', 'howdy', 'greetings.hello');

// 受け答えを設定 (NLGの部分)
manager.addAnswer('en', 'greetings.bye', 'Till next time');
manager.addAnswer('en', 'greetings.bye', 'see you soon!');
manager.addAnswer('en', 'greetings.hello', 'Hey there!');
manager.addAnswer('en', 'greetings.hello', 'Greetings!');

(async() => {
    // 訓練して結果をファイルに保存する
    await manager.train();
    manager.save();

    // 「I have to go」という発話を受け取ってレスポンスを返す
    const response = await manager.process('en', 'I have to go');
    console.log(response);
})();
コンソール
{ locale: 'en',
  localeIso2: 'en',
  language: 'English',
  utterance: 'I have to go', // 発話した文字列
  classification: // おそらく一致した確率だと思う、greetings.byeは98%、greetings.helloは2%一致(合わせて100になる)を表していると思いました
   [ { label: 'greetings.bye', value: 0.9792924568464354 },
     { label: 'greetings.hello', value: 0.02070754315356462 } ],
  intent: 'greetings.bye', // greetings.byeに一致した
  domain: 'default',
  score: 0.9792924568464354,
  entities: [],
  sentiment:
   { score: 0.5,
     comparative: 0.125,
     vote: 'positive',
     numWords: 4,
     numHits: 1,
     type: 'senticon',
     language: 'en' },
  srcAnswer: 'see you soon!', // 受け答えに設定されている文字列
  answer: 'see you soon!' } // 実際に受け答える文字列

Language Support

https://github.com/axa-group/nlp.js/blob/master/docs/language-support.md

これを見ると日本語もサポートされているみたいです

Language Guesser

https://github.com/axa-group/nlp.js/blob/master/docs/language-guesser.md

与えられた文字列が何語かを判定してくれるようです

const { Language } = require('node-nlp');

const language = new Language();
const guess = language.guess("When the night has come And the land is dark And the moon is the only light we see");
// 最も適切と判断された言語順の配列になるので、配列の最初の要素を見ると良い
console.log(guess[0]); // { alpha3: 'eng', alpha2: 'en', language: 'English', score: 1 }
const { Language } = require('node-nlp');

const language = new Language();
let guess = language.guess(
  "Quan arriba la nit i la terra és fosca i la lluna és l'única llum que podem veure",
  null,
  3, // 一致した言語を適切な順にソートしてから上から3つだけの言語の配列にしてくれる
);
console.log(guess.length); // 3
console.log(guess[0]); // { alpha3: 'cat', alpha2: 'ca', language: 'Catalan', score: 1 }
const { Language } = require('node-nlp');

const language = new Language();
let guess = language.guess(
  'When the night has come And the land is dark And the moon is the only light we see',
  ['de', 'es'], // 言語のホワイトリスト、この中から一致する言語を判定してくれる
);
console.log(guess[0]); // { alpha3: 'deu', alpha2: 'de', language: 'German', score: 1 }
const { Language } = require('node-nlp');

const language = new Language();
// guessBestを使うことで、結果を配列ではなく、最も一致した結果のみを返してくれる
let guess = language.guessBest(
  'When the night has come And the land is dark And the moon is the only light we see',
);
console.log(guess);

Similar Search

https://github.com/axa-group/nlp.js/blob/master/docs/similar-search.md

レーベンシュタイン距離を計算してくれるそうです

const { SimilarSearch } = require('node-nlp');

const similar = new SimilarSearch();
console.log(similar.getSimilarity('mikailovitch', 'Mikhaïlovitch')); // 3
const { SimilarSearch } = require('node-nlp');

// normalize:trueで大文字小文字、特殊文字が変換された上で計測してくれるようです
const similar = new SimilarSearch({ normalize: true });
console.log(similar.getSimilarity('mikailovitch', 'Mikhaïlovitch')); // 1
const { SimilarSearch } = require('node-nlp');

const similar = new SimilarSearch();
const text1 = 'Morbi interdum ultricies neque varius condimentum. Donec volutpat turpis interdum metus ultricies vulputate.';
const text2 = 'interdumaultriciesbneque';

// 2つの文字列からより低いレーベンシュタイン距離で最も良い部分文字列を検索することができる
const result = similar.getBestSubstring(text1, text2);
console.log(result);
コンソール
{ start: 6, // 一致した文字列の開始位置
  end: 29, // 一致した文字列の終了位置
  len: 24, // 一致した文字列の文字数
  levenshtein: 2, // レーベンシュタイン距離
  accuracy: 0.9166666666666666 } // 精度

NLP Classifier

https://github.com/axa-group/nlp.js/blob/master/docs/nlp-classifier.md

発話とその意図でClassifier(分類器)を訓練することができます。
発話をすると、各意図の分類をスコア値の降順で並べ替えます。

const { NlpClassifier } = require('node-nlp');

(async () => {
    const classifier = new NlpClassifier({ language: 'ja' });
    classifier.add('おはよう', 'greet');
    classifier.add('こんにちは', 'greet');
    classifier.add('こんばんは', 'greet');
    classifier.add("鍵をなくしました", 'keys');
    classifier.add('鍵が見つかりません', 'keys');
    classifier.add('私の鍵はどこにあるか覚えていません', 'keys');
    await classifier.train();
    const classifications = classifier.getClassifications('私の鍵はどこにありますか');
    console.log(classifications);
    // [ { label: 'keys', value: 0.9215303890915554 }, { label: 'greet', value: 0.0784696109084446 } ]
})();
const { NlpClassifier } = require('node-nlp');

(async () => {
    const classifier = new NlpClassifier({ language: 'ja' });
    classifier.add('おはよう', 'greet');
    classifier.add('こんにちは', 'greet');
    classifier.add('こんばんは', 'greet');
    classifier.add("鍵をなくしました", 'keys');
    classifier.add('鍵が見つかりません', 'keys');
    classifier.add('私の鍵はどこにあるか覚えていません', 'keys');
    await classifier.train();
    // getBestClassificationを使うと配列ではなく、最も適切な結果のみを返してくれます
    const classifications = classifier.getBestClassification('私の鍵はどこにありますか');
    console.log(classifications); // { label: 'keys', value: 0.9215303890915554 }
})();

NER Manager

https://github.com/axa-group/nlp.js/blob/master/docs/ner-manager.md

NEL -> Named Entity Recognition(名前付きエンティティ認識)

Enum Named Entities

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    manager.addNamedEntityText('hero', 'spiderman', ['en'], ['Spiderman', 'Spider-man']);
    manager.addNamedEntityText('hero', 'iron man', ['en'], ['iron man', 'iron-man']);
    manager.addNamedEntityText('hero', 'thor', ['en'], ['Thor']);
    manager.addNamedEntityText('food', 'burguer', ['en'], ['Burguer', 'Hamburguer']);
    manager.addNamedEntityText('food', 'pizza', ['en'], ['pizza']);
    manager.addNamedEntityText('food', 'pasta', ['en'], ['Pasta', 'spaghetti']);

    const result = await manager.findEntities('I saw spederman eating speghetti in the city', 'en');
    console.log(result);
})();
コンソール
[ { start: 6, // 一致した文字列の開始位置
    end: 14, // 一致した文字列の終了位置
    len: 9, // 一致した文字列の文字数
    levenshtein: 1, // レーベンシュタイン距離
    accuracy: 0.8888888888888888, // 精度
    option: 'spiderman', // 設定したオプションで一致したもの
    sourceText: 'Spiderman', // 設定した文字列のなかで一致したもの
    entity: 'hero', // エンティティ名
    utteranceText: 'spederman' }, // 発話テキスト(findEntities()で実際に含まれていた文字列)
  { start: 23,
    end: 31,
    len: 9,
    levenshtein: 1,
    accuracy: 0.8888888888888888,
    option: 'pasta',
    sourceText: 'spaghetti',
    entity: 'food',
    utteranceText: 'speghetti' } ]

Regular Expression Named Entities

正規表現も使える

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    const entity = manager.addNamedEntity('email', 'regex');
    entity.addRegex('en', /\b(\w[-._\w]*\w@\w[-._\w]*\w\.\w{2,3})\b/gi);
    const result = await manager.findEntities('I saw spiderman eating speghetti in the city and his mail is spiderman@gmial.com', 'en',)
    console.log(result);
})();
コンソール
[ { start: 61,
    end: 80,
    accuracy: 1,
    sourceText: 'spiderman@gmial.com',
    utteranceText: 'spiderman@gmial.com',
    entity: 'email' } ]

Trim Named Entities

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });

    const fromEntity = manager.addNamedEntity('fromEntity', 'trim');
    fromEntity.addBetweenCondition('en', 'from', 'to');
    fromEntity.addAfterLastCondition('en', 'to');

    const toEntity = manager.addNamedEntity('toEntity', 'trim');
    toEntity.addBetweenCondition('en', 'to', 'from');
    toEntity.addAfterLastCondition('en', 'from');

    const result = await manager.findEntities('I want to travel from Barcelona to Madrid', 'en');
    console.log(result);
})();
コンソール
[ { type: 'between', // 間の文字を取得した
    start: 22,
    end: 30,
    len: 9,
    accuracy: 1,
    sourceText: 'Barcelona',
    utteranceText: 'Barcelona', // fromとtoの間にあったBarcelonaという文字が取得できた
    entity: 'fromEntity' },
  { type: 'afterLast', // 最後の後の文字を取得した
    start: 35,
    end: 40,
    len: 6,
    accuracy: 0.99,
    sourceText: 'Madrid',
    utteranceText: 'Madrid', // from ~ to の後にあったMadridという文字が取得できた
    entity: 'fromEntity' },
  { type: 'between', // 間の文字を取得した
    start: 10,
    end: 15,
    len: 6,
    accuracy: 1,
    sourceText: 'travel',
    utteranceText: 'travel', // toとfromの間にあったtravelという文字が取得できた
    entity: 'toEntity' } ]

取得できる条件は7種類あるようです

  • Between
  • After
  • After First
  • After Last
  • Before
  • Before First
  • Before Last

Builtin Entity Extraction

https://github.com/axa-group/nlp.js/blob/master/docs/builtin-entity-extraction.md

エンティティを自分で設定しなくても、組み込みの便利なものがあります

Email Extraction

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('My email is something@somehost.com please write me', 'en'));
})();

// コンソール
[ { start: 12,
    end: 33,
    len: 22,
    accuracy: 0.95,
    sourceText: 'something@somehost.com',
    utteranceText: 'something@somehost.com',
    entity: 'email',
    resolution: { value: 'something@somehost.com' } } ]

IP Extraction

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('My ip is 8.8.8.8', 'en'));
})();

// コンソール
[ { start: 9,
    end: 15,
    len: 7,
    accuracy: 0.95,
    sourceText: '8.8.8.8',
    utteranceText: '8.8.8.8',
    entity: 'ip',
    resolution: { value: '8.8.8.8', type: 'ipv4' } } ]

Hashtag Extraction

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('Open source is great! #proudtobeaxa', 'en'));
})();

// コンソール
[ { start: 22,
    end: 34,
    len: 13,
    accuracy: 0.95,
    sourceText: '#proudtobeaxa',
    utteranceText: '#proudtobeaxa',
    entity: 'hashtag',
    resolution: { value: '#proudtobeaxa' } } ]

Phone Number Extraction

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('So here is my number +1 541-754-3010 callme maybe', 'en'));
})();

// コンソール
[ { start: 21,
    end: 35,
    len: 15,
    accuracy: 0.95,
    sourceText: '+1 541-754-3010',
    utteranceText: '+1 541-754-3010',
    entity: 'phonenumber',
    resolution: { value: '+1 541-754-3010', score: '1' } } ]

URL Extraction

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('The url is https://something.com', 'en'));
})();

// コンソール
[ { start: 11,
    end: 31,
    len: 21,
    accuracy: 0.95,
    sourceText: 'https://something.com',
    utteranceText: 'https://something.com',
    entity: 'url',
    resolution: { value: 'https://something.com' } } ]

Number Extraction

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('This is 12', 'en'));
})();

// コンソール
[ { start: 8,
    end: 9,
    len: 2,
    accuracy: 0.95,
    sourceText: '12',
    utteranceText: '12',
    entity: 'number',
    resolution: { strValue: '12', value: 12, subtype: 'integer' } } ]
const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('This is twelve', 'en'));
})();

// コンソール
[ { start: 8,
    end: 13,
    len: 6,
    accuracy: 0.95,
    sourceText: 'twelve',
    utteranceText: 'twelve',
    entity: 'number',
    resolution: { strValue: '12', value: 12, subtype: 'integer' } } ]
const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('one over 3', 'en'));
})();

// コンソール
[ { start: 0,
    end: 9,
    len: 10,
    accuracy: 0.95,
    sourceText: 'one over 3',
    utteranceText: 'one over 3',
    entity: 'number',
    resolution:
     { strValue: '0.333333333333333',
       value: 0.333333333333333,
       subtype: 'float' } } ]

Ordinal Extraction

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('He was 2nd', 'en'));
})();

// コンソール
[ { start: 7,
    end: 9,
    len: 3,
    accuracy: 0.95,
    sourceText: '2nd',
    utteranceText: '2nd',
    entity: 'ordinal',
    resolution: { strValue: '2', value: 2, subtype: 'integer' } } ]
const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('one hundred twenty fifth', 'en'));
})();

// コンソール
[ { start: 0,
    end: 23,
    len: 24,
    accuracy: 0.95,
    sourceText: 'one hundred twenty fifth',
    utteranceText: 'one hundred twenty fifth',
    entity: 'ordinal',
    resolution: { strValue: '125', value: 125, subtype: 'integer' } } ]

Percentage Extraction

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('68.2%', 'en'));
})();

// コンソール
[ { start: 0,
    end: 4,
    len: 5,
    accuracy: 0.95,
    sourceText: '68.2%',
    utteranceText: '68.2%',
    entity: 'percentage',
    resolution: { strValue: '68.2%', value: 68.2, subtype: 'float' } } ]
const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('68.2 percent', 'en'));
})();

// コンソール
[ { start: 0,
    end: 11,
    len: 12,
    accuracy: 0.95,
    sourceText: '68.2 percent',
    utteranceText: '68.2 percent',
    entity: 'percentage',
    resolution: { strValue: '68.2%', value: 68.2, subtype: 'float' } } ]

Dimension Extraction

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('120km', 'en'));
})();

// コンソール
[ { start: 0,
    end: 4,
    len: 5,
    accuracy: 0.95,
    sourceText: '120km',
    utteranceText: '120km',
    entity: 'dimension',
    resolution:
     { strValue: '120',
       value: 120,
       unit: 'Kilometer',
       localeUnit: 'Kilometer' } } ]

Age Extraction

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('This saga is ten years old', 'en'));
})();

// コンソール
[ { start: 13,
    end: 25,
    len: 13,
    accuracy: 0.95,
    sourceText: 'ten years old',
    utteranceText: 'ten years old',
    entity: 'age',
    resolution:
     { strValue: '10', value: 10, unit: 'Year', localeUnit: 'Year' } },
  { start: 13,
    end: 21,
    len: 9,
    accuracy: 0.95,
    sourceText: 'ten years',
    utteranceText: 'ten years',
    entity: 'duration',
    resolution: { values: [Array] } } ]

Currency Extraction

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('420 million finnish markka', 'en'));
})();

// コンソール
[ { start: 0,
    end: 25,
    len: 26,
    accuracy: 0.95,
    sourceText: '420 million finnish markka',
    utteranceText: '420 million finnish markka',
    entity: 'currency',
    resolution:
     { strValue: '420000000',
       value: 420000000,
       unit: 'Finnish markka',
       localeUnit: 'Finnish markka' } } ]

Date Extraction

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('28/10/2018', 'en'));
})();

// コンソール
[ { start: 0,
    end: 9,
    len: 10,
    accuracy: 0.95,
    sourceText: '28/10/2018',
    utteranceText: '28/10/2018',
    entity: 'date',
    resolution:
     { type: 'date',
       timex: '2018-10-28',
       strValue: '2018-10-28',
       date: 2018-10-28T00:00:00.000Z } } ]
const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('I\'ll go back on 15', 'en')); // 年も月も指定せず、15とだけ指定
})();

// コンソール
[ { start: 16,
    end: 17,
    len: 2,
    accuracy: 0.95,
    sourceText: '15',
    utteranceText: '15',
    entity: 'number',
    resolution: { strValue: '15', value: 15, subtype: 'integer' } },
  { start: 16,
    end: 17,
    len: 2,
    accuracy: 0.95,
    sourceText: '15',
    utteranceText: '15',
    entity: 'date',
    resolution:
     { type: 'interval',
       timex: 'XXXX-XX-15',
       strPastValue: '2019-03-15', // 過去日の直近の15日を取得(現在 2019/03/25)
       pastDate: 2019-03-15T00:00:00.000Z,
       strFutureValue: '2019-04-15', // 未来日の直近の15日を取得(現在 2019/03/25)
       futureDate: 2019-04-15T00:00:00.000Z } } ]
const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('I\'ll be out in Jan', 'en')); // 年と日を設定せず、月だけ1月と指定
})();

// コンソール
[ { start: 15,
    end: 17,
    len: 3,
    accuracy: 0.95,
    sourceText: 'Jan',
    utteranceText: 'Jan',
    entity: 'daterange',
    resolution:
     { type: 'interval',
       timex: 'XXXX-01',
       strPastStartValue: '2019-01-01', // 過去日の直近の1月1日を取得(現在 2019/03/25)
       pastStartDate: 2019-01-01T00:00:00.000Z,
       strPastEndValue: '2019-02-01', // 次の月の1日
       pastEndDate: 2019-02-01T00:00:00.000Z,
       strFutureStartValue: '2020-01-01', // 未来日の直近の1月1日を取得(現在 2019/03/25)
       futureStartDate: 2020-01-01T00:00:00.000Z,
       strFutureEndValue: '2020-02-01', // 次の月の1日
       futureEndDate: 2020-02-01T00:00:00.000Z } } ]

Duration Extraction

const { NerManager } = require('node-nlp');

(async () => {
    const manager = new NerManager({ threshold: 0.8 });
    console.log(await manager.findEntities('It will take me 5 minutes', 'en'));
})();

// コンソール
[ { start: 16,
    end: 24,
    len: 9,
    accuracy: 0.95,
    sourceText: '5 minutes',
    utteranceText: '5 minutes',
    entity: 'duration',
    resolution: { values: [Array] } } ]

Sentiment Analysis

https://github.com/axa-group/nlp.js/blob/master/docs/sentiment-analysis.md

Sentiment Analysis -> 感情分析

※日本語は対応されていないようです

トライアンドエラーで値を見た結果、プラスの感情のことを言うと、scoreがプラスの値になり、反対にマイナスの感情のことを言うと、scoreがマイナスの値になるようでした(間違ってたらごめんなさい)

const { SentimentAnalyzer } = require('node-nlp');

(async () => {
    const sentiment = new SentimentAnalyzer({ language: 'en' });
    console.log(await sentiment.getSentiment('I like cats'));
})();

// コンソール
{ score: 0.313, // プラスの値になる
  numWords: 3,
  numHits: 1,
  comparative: 0.10433333333333333,
  type: 'senticon',
  language: 'en' }
const { SentimentAnalyzer } = require('node-nlp');

(async () => {
    const sentiment = new SentimentAnalyzer({ language: 'en' });
    console.log(await sentiment.getSentiment('cats are stupid'));
})();

// コンソール
{ score: -0.458, // マイナスの値になる
  numWords: 3,
  numHits: 1,
  comparative: -0.15266666666666667,
  type: 'senticon',
  language: 'en' }

NLP Manager

https://github.com/axa-group/nlp.js/blob/master/docs/nlp-manager.md

%hoge%と言う書き方で、複数のどれかに一致する書き方ができるようです

const { NlpManager } = require('node-nlp');

(async () => {
    const manager = new NlpManager({ languages: ['en'] });
    manager.addNamedEntityText('hero', 'spiderman', ['en'], ['Spiderman', 'Spider-man']);
    manager.addNamedEntityText('hero', 'iron man', ['en'], ['iron man', 'iron-man']);
    manager.addNamedEntityText('hero', 'thor', ['en'], ['Thor']);
    manager.addNamedEntityText('food', 'burguer', ['en'], ['Burguer', 'Hamburguer']);
    manager.addNamedEntityText('food', 'pizza', ['en'], ['pizza']);
    manager.addNamedEntityText('food', 'pasta', ['en'], ['Pasta', 'spaghetti']);

    manager.addDocument('en', 'I saw %hero% eating %food%', 'sawhero');
    manager.addDocument('en', 'I have seen %hero%, he was eating %food%', 'sawhero');
    manager.addDocument('en', 'I want to eat %food%', 'wanteat');
    await manager.train();

    console.log(await manager.process('I saw spiderman eating spaghetti today in the city!'));
})();
コンソール
{ locale: 'en',
  localeIso2: 'en',
  language: 'English',
  utterance: 'I saw spiderman eating spaghetti today in the city!',
  classification:
   [ { label: 'sawhero', value: 0.9921814826961513 },
     { label: 'wanteat', value: 0.007818517303848674 } ],
  intent: 'sawhero',
  domain: 'default',
  score: 0.9921814826961513,
  entities:
   [ { start: 33,
       end: 37,
       len: 5,
       accuracy: 0.95,
       sourceText: 'today',
       utteranceText: 'today',
       entity: 'date',
       resolution: [Object] },
     { start: 6,
       end: 14,
       len: 9,
       levenshtein: 0,
       accuracy: 1,
       option: 'spiderman',
       sourceText: 'Spiderman',
       entity: 'hero',
       utteranceText: 'spiderman' },
     { start: 23,
       end: 31,
       len: 9,
       levenshtein: 0,
       accuracy: 1,
       option: 'pasta',
       sourceText: 'spaghetti',
       entity: 'food',
       utteranceText: 'spaghetti' } ],
  sentiment:
   { score: 0.708,
     comparative: 0.07866666666666666,
     vote: 'positive',
     numWords: 9,
     numHits: 2,
     type: 'senticon',
     language: 'en' } }

Load/Save

NlpManagerに覚えさせる量が多いと毎回起動が遅いため、トレーニング結果を保存して次回起動時にそれを読み込むと言うことができます

const { NlpManager } = require('node-nlp');

(async () => {
    const manager = new NlpManager({ languages: ['en'] });
    await manager.train();
    manager.save("hoge.nlp"); // ファイル名を指定しなかった場合は、model.nlpで保存される
})();
const { NlpManager } = require('node-nlp');

manager = new NlpManager();
manager.load("hoge.nlp"); // ファイル名を指定しなかった場合は、model.nlpを読み込みに行く

Import/Export

Load/Saveと似ていますが、こちらはJSON文字列を引数に取ります

const fs = require('fs');
const { NlpManager } = require('node-nlp');

const data = fs.readFileSync("hoge.nlp", "utf8");
manager = new NlpManager();
manager.import(data); // JSON文字列から読み込み
const { NlpManager } = require('node-nlp');

(async () => {
    const minified = true;
    const manager = new NlpManager();
    // ...
    await manager.train();
    const data = manager.export(minified);
    console.log(data) // JSON文字列
})();

Context

NlpManger.processにコンテキストを指定して、NLGがそのコンテキストに基づいて動作を変更することもできます

const { NlpManager, ConversationContext } = require('node-nlp');

(async () => {
    const manager = new NlpManager({ languages: ['en'] });
    const context = new ConversationContext();

    manager.addDocument('en', 'Hello my name is %name%', 'greeting.hello');
    manager.addDocument('en', 'I have to go', 'greeting.bye');
    manager.addAnswer('en', 'greeting.hello', 'Hey there!');
    manager.addAnswer('en', 'greeting.bye', 'Till next time, {{name}}!');

    manager.addNamedEntityText('name', 'John', ['en'], ['john', 'John'],);

    await manager.train();
    await manager.process('en', 'Hello my name is John', context);
    const result = await manager.process('en', 'I have to go', context);
    console.log(result.answer); // Till next time, John!
})();

最後まで読んでいただいてありがとうございましたm(_ _)m

okumurakengo
人が作ってくれたご飯食べるときに何も言わずに食べるのは、ちょっとダメらしいという話を聞いたことがあるので、「あ、うめ、あ、うめ」って言いながら食ってたら、すごい変な人と思われてしまってしまった/初心者です、あまりわかっていません
https://bokete.jp/user/okumurakengo
qiitadon
Qiitadon(β)から生まれた Qiita ユーザー・コミュニティです。
https://qiitadon.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした