描述问题
我想从这个包中制作一个聊天机器人,但它无法正确识别实体。我尝试了很多解决方案,但都没有用。如果有人能帮忙解决这个问题,我将非常感激。
重现问题
重现问题的步骤:
- 安装node.js。我使用的是
v20.0.0
- 安装最新版本的
node-nlp
。我使用的是v4.27.0
- 现在你可以运行以下代码:
const { NlpManager } = require("node-nlp");
const manager = new NlpManager({ languages: ["en"], forceNER: true });
manager.addNamedEntityText('hero', 'spiderman', 'en')
manager.addDocument("en", "My name is %name%", "saveName");
manager.addDocument("en", "I will be traveling on %date%", "saveDate");
manager.addDocument("en", "I saw %hero%", "sawHero");
manager.addAnswer("en", "saveName", "Nice talking to you {{name}}");
manager.addAnswer("en", "saveDate", "Have safe journey on {{date}}");
manager.addAnswer("en", "sawHero", "Really you saw {{hero}}!");
(async () => {
await manager.train();
manager
.process("en", "My name is John")
.then((response) => console.log(response.answer))
.then(() => manager.process("en", "I will be traveling on 04 June"))
.then((response) => console.log(response.answer))
.then(() => manager.process("en", "I saw spiderman"))
.then((response) => console.log(response.answer));
})();
- 上述代码的输出如下:
Nice talking to you {{name}}
Have safe journey on 04 June
Really you saw spiderman!
预期行为
Nice talking to you John
Have safe journey on 04 June
Really you saw spiderman!
- 如果我删除了
manager.addNamedEntityText('hero', 'spiderman', 'en')
这一行,那么输出将会是:
Nice talking to you John
Have safe journey on 04 June
Really you saw {{hero}}!
预期行为
Nice talking to you John
Have safe journey on 04 June
Really you saw spiderman!
所以主要问题在于,当我不传递namedEntity
时,它完全无法识别实体。我不太确定它是如何识别到date
的。我想实现类似于date
的功能,以便在其他变量的情况下也能识别实体。由于我不了解文本中的实体,所以无法添加命名实体。如果有人有其他解决这个问题的方法,那将是非常有帮助的。
9条答案
按热度按时间jfewjypa1#
请尝试以下代码:
nlp.slotManager.addSlot('travel', 'fromCity', true, { en: 'From where you are traveling? {{fromCity}}' });
nlp.addDocument('en', 'I want to travel from @fromCity to @toCity', 'travel')
nlp.addNerRuleOptionTexts('en', 'fromCity', ["Israel", "USA"]);
nlp.addNerRuleOptionTexts('en', 'toCity', ["Israel", "USA"]);
nlp.addAnswer('en', 'greetings.hello', 'Greetings!');
await nlp.train();
const response = await nlp.process('en', 'I want to travel from Israel to USA');
console.log(response.entities[1].utteranceText);
4zcjmb1e2#
感谢您的回复@MarketingPip,但在这种情况下,您已经定义了
fromCity
和toCity
的列表。现在NLP只会查找这两个城市,但如果我传递其他内容会怎样?那会起作用吗?wydwbb8l3#
@Jayesh-Patidar,你能发布非工作呼叫的完整响应对象吗?
kx1ctssn4#
感谢您的回复@MarketingPip,但在这种情况下,您也定义了
fromCity
和toCity
的列表。现在NLP只会查找这两个城市,但如果我传递其他内容会怎样?那会起作用吗?非常感谢您!很抱歉我应该再提供一个例子来帮助澄清未定义的被认定实体的情况。
我现在正在使用手机 - 我不能确认,但我认为/回忆起文档中应该有某种符号/方法可以在语料库中填写一个“空槽”。
您必须深入挖掘/或者当我稍后在电脑上时,我会深入研究我的随机代码片段宝箱,看看是否有与我上面提供的最后一个示例类似的其他东西。👆
0mkxixxg5#
@Apollon77 Below are the responses for my code
Input:
My name is John
Input:
I will be traveling on 04 June
Input:
I saw spiderman
You can clearly see when I passed input as
My name is John
then it is not able to extract entities. I want to extract the nameJohn
from then text and return it in response in place of{{name}}
.Thank you
ui7jx7zq6#
@Jayesh-Patidar - 这里有你需要的完整工作示例。
希望这对你有帮助。
Ps:你可以使用正则表达式匹配提取插槽。但是匹配任何内容,例如
(.*)
-会让库表现得有些奇怪。s1ag04yj7#
感谢您的回复。很抱歉回复晚了。
我尝试了您的解决方案,但这次它运行正常,提取了
fromCity
和toCity
实体。但是现在假设我们已经为这个意图找到了答案,其中包含这些实体,那么它就不会在答案中加载实体。之前添加答案的语法对于命名实体来说是正常的。
您能在这里帮助我吗?
hfsqlsce8#
出于某种原因,我似乎无法在我这边实现这个功能。尽管我会尝试使用正则表达式匹配等方法进行替换(虽然这不太方便),但这可能只是一个临时解决方案,直到你从这个仓库的维护者那里得到答案。例如:@axa-group
根据你的需求和适当的正则表达式调整这段代码!
我很想帮助你更多,但请记住我不是这个项目的贡献者或维护者。希望我们能从他们那里得到更多的输入。
也许在这里加个标签/提及会有帮助 - @jesus-seijas-sp
祝你好运,周末愉快,@Jayesh-Patidar。 ✌️
6bc51xsx9#
感谢你的帮助 @MarketingPip。在等待他人回复的同时,我会尝试你提供的解决方案。