nlp.js [Help] Slot Fill in middle of text

brtdzjyr  于 2个月前  发布在  其他
关注(0)|答案(6)|浏览(32)

我有两个实体:

entities: {
  frase: {
    trim: [
      {
        position: "betweenLast",
        leftWords: [
          "falar"
        ],
        rightWords: [
          "na"
        ]
      },
      {
        position: "afterLast",
        words: [
          "falar"
        ]
      }
    ]
  },
  voz: {
    trim: [
      {
        position: "betweenLast",
        leftWords: [
          "na voz do",
          "na voz da",
          "na voz de"
        ],
        rightWords: [
          "falar"
        ]
      },
      {
        position: "afterLast",
        words: [
          "na voz do",
          "na voz da",
          "na voz de"
        ]
      }
    ]
  }
}

当我说这个短语:“falar testando, 1 2 3 na voz do chaves”时,槽位正常工作。
但我遇到了一个问题:当用户输入以下句子时:“Minha secretária pediu um aumento, mas não posso dar. Me descreva 5 motivos para falar isso para ela de forma bem delicada.”它却进入了那个槽位,而正确的应该是进入None。
如何修复这个槽位,使其仅在以“falar”开头时接受?

xghobddn

xghobddn1#

请分享实体数组中的确切返回值。此外,这句话属于哪两个插槽?
还使用了哪个版本的nlp.js?请提供更多信息和详细信息。

rslzwgfq

rslzwgfq2#

另外:你知道在修剪规则中,它们都是“为自己而立”,所以这不是一个“组合”,意味着在你的情况下,有两个实体,它们都有两个选项可以匹配(它们有点像“或”连接)。要在那里添加一个“与逻辑”(这确实可能是一个很酷的想法),这将更多地是一个功能请求。
我期望(我没有尝试过!)你的句子有以下结果:

  • frase - betweenLast规则 ... 没有匹配,因为没有“na”
  • frase - afterLast规则 ... 应该与“isso para ela de forma bem delicada.”的内容匹配
  • voz永远不应该匹配,因为你把“几个词”放进了一个应该匹配单个词的字符串中。目前这些实际上是在那里检查的“标记”,而不是字符串

所以,如果结果和我预期的一样,那么这个库就按照设计工作了。
此外,允许在lef/rightwords中使用“短语”(也称为按定义顺序排列的多个单词)也是一个功能请求。

t40tm48m

t40tm48m3#

请分享一下实体数组中的确切返回值?同时,这句话属于哪两个槽位?

还请问使用了哪个版本的nlp.js?请提供更多信息和详细说明。

nlp.js版本:"@nlpjs/basic": "^4.25.0",
语料库:

{
    "name": "Intents",
    "locale": "pt-BR",
    "data": [
        {
            "intent": "DalleIntent",
            "utterances": [
                "uma imagem",
                "gerar uma imagem",
                "uma imagem de",
                "uma foto",
                "uma foto de",
                "me dá uma imagem",
                "me dá uma imagem de",
                "me dá uma foto",
                "me dá uma foto de",
                "quero uma imagem",
                "gere uma imagem",
                "gere uma foto",
                "imagem"
            ],
            "answers": [
                "Tudo bem, estou gerando uma imagem!",
                "Aguarde enquanto crio a sua imagem."
            ]
        },
        {
            "intent": "HelloIntent",
            "utterances": [
                "oi",
                "olá",
                "ei",
                "alô",
                "oie",
                "oi tudo bem"
            ],
            "answers": [
                "Olá, como posso te ajudar?"
            ]
        },
        {
            "intent": "InWorldIntent",
            "utterances": [
                "falar com chucky"
            ],
            "answers": [
                "Agora você está conversando com o Chucky!"
            ]
        },
        {
            "intent": "FalatronIntent",
            "utterances": [
                "falar @frase na voz do @voz",
                "falar @frase na voz da @voz",
                "falar @frase na voz de @voz"
            ],
            "answers": [
                "Tudo bem, estou gerando o seu áudio do/da {{voz}}: {{frase}}.",
                "Aguarde enquanto crio o seu áudio do/da {{voz}}: {{frase}}."
            ],
            "slotFilling": {
                "voz": {
                    "mandatory": true,
                    "question": "De qual voz?"
                },
                "frase": {
                    "mandatory": true,
                    "question": "Qual o texto?"
                }
            }
        },
        {
            "intent": "None",
            "utterances": [
                ""
            ],
            "answers": [
                "Desculpe, mas não entendi o que disse. Repita, por favor."
            ]
        },
        {
            "intent": "SairIntent",
            "utterances": [
                "sair",
                "cancelar"
            ],
            "answers": [
                "Tudo bem, até mais!"
            ]
        },
        {
            "intent": "HelpIntent",
            "utterances": [
                "ajuda",
                "quero ajuda",
                "preciso de ajuda"
            ],
            "answers": [
                "Claro, irei te ajudar! \n - Se você deseja gerar uma imagem, só escrever: gere uma imagem <conteúdo> / quero uma imagem <conteúdo>. \n - Se você deseja que eu crie uma imitação do Chaves por exemplo, é só escrever: falar <texto da imitação> na voz do chaves (só substiruir o chaves por algum outro personagem). \n - Se deseja qualquer outra coisa, é só esrever mesmo!"
            ]
        },
        {
            "intent": "IaraDigitalIntent",
            "utterances": [
                "quem é iara",
                "me conta sobre iara"
            ],
            "answers": [
                "Iara Digital é uma agência baseada em São Paulo que acredita no poder das experiências centradas em voz.  O nosso nome vem do folclore Tupi-Guarani brasileiro. Iara é uma sereia que vive nas águas do Rio Amazonas.  Quando ela vê um homem na floresta, ela começa a cantar para encantá-lo. Uma vez sob o feitiço de Iara, o homem larga qualquer coisa para viver com ela embaixo da água para sempre."
            ]
        }
    ],
    "entities": {
        "frase": {
            "trim": [
                {
                    "position": "betweenLast",
                    "leftWords": [
                        "falar"
                    ],
                    "rightWords": [
                        "na"
                    ]
                },
                {
                    "position": "afterLast",
                    "words": [
                        "falar"
                    ]
                }
            ]
        },
        "voz": {
            "trim": [
                {
                    "position": "betweenLast",
                    "leftWords": [
                        "na voz do",
                        "na voz da",
                        "na voz de"
                    ],
                    "rightWords": [
                        "falar"
                    ]
                },
                {
                    "position": "afterLast",
                    "words": [
                        "na voz do",
                        "na voz da",
                        "na voz de"
                    ]
                }
            ]
        }
    }
}

我的示例代码:

const { dockStart } = require('@nlpjs/basic');

(async () => {
    const dock = await dockStart();
    const nlp = dock.get('nlp');
    await nlp.train();
    const response = await nlp.process('pt', 'Minha secretária pediu um aumento, mas não posso dar. Me descreva 5 motivos para falar isso para ela de forma bem delicada.');

    console.log(JSON.stringify(response));
})();

conf.json文件:

{
    "settings": {
        "nlp": {
            "forceNER": true,
            "languages": [
                "pt"
            ],
            "corpora": [
                "./intents.json"
            ]
        }
    },
    "use": [
        "Basic",
        "LangPt"
    ]
}

返回值:

{
  "locale": "pt",
  "utterance": "Minha secretária pediu um aumento, mas não posso dar. Me descreva 5 motivos para falar isso para ela de forma bem delicada.",
  "languageGuessed": false,
  "localeIso2": "pt",
  "language": "Portuguese",
  "nluAnswer": {
    "classifications": [
      {
        "intent": "FalatronIntent",
        "score": 0.465536644040642
      },
      {
        "intent": "None",
        "score": 0.2582708877945899
      },
      {
        "intent": "InWorldIntent",
        "score": 0.22199608769066007
      },
      {
        "intent": "IaraDigitalIntent",
        "score": 0.05419638047410807
      }
    ]
  },
  "classifications": [
    {
      "intent": "FalatronIntent",
      "score": 0.465536644040642
    },
    {
      "intent": "None",
      "score": 0.2582708877945899
    },
    {
      "intent": "InWorldIntent",
      "score": 0.22199608769066007
    },
    {
      "intent": "IaraDigitalIntent",
      "score": 0.05419638047410807
    }
  ],
  "intent": "FalatronIntent",
  "score": 0.465536644040642,
  "domain": "default",
  "optionalUtterance": "Minha secretária pediu um aumento, mas não posso dar. Me descreva 5 motivos para falar @frase",
  "sourceEntities": [
    
  ],
  "entities": [
    {
      "type": "trim",
      "subtype": "afterLast",
      "start": 87,
      "end": 122,
      "len": 36,
      "accuracy": 0.99,
      "sourceText": "isso para ela de forma bem delicada.",
      "utteranceText": "isso para ela de forma bem delicada.",
      "entity": "frase"
    }
  ],
  "slotFill": {
    "localeIso2": "pt",
    "intent": "FalatronIntent",
    "entities": [
      {
        "type": "trim",
        "subtype": "afterLast",
        "start": 87,
        "end": 122,
        "len": 36,
        "accuracy": 0.99,
        "sourceText": "isso para ela de forma bem delicada.",
        "utteranceText": "isso para ela de forma bem delicada.",
        "entity": "frase"
      }
    ],
    "currentSlot": "voz"
  },
  "srcAnswer": "De qual voz?",
  "answers": [
    {
      "answer": "Tudo bem, estou gerando o seu áudio do/da {{voz}}: isso para ela de forma bem delicada.."
    },
    {
      "answer": "Aguarde enquanto crio o seu áudio do/da {{voz}}: isso para ela de forma bem delicada.."
    }
  ],
  "answer": "De qual voz?",
  "actions": [
    
  ],
  "sentiment": {
    "score": 6,
    "numWords": 22,
    "numHits": 7,
    "average": 0.2727272727272727,
    "type": "afinn",
    "locale": "pt",
    "vote": "positive"
  }
}
9udxz4iz

9udxz4iz4#

好的,我的假设是正确的,匹配的内容是什么,上面的描述就是。

l0oc07j2

l0oc07j25#

感谢@Apollon77/
你还有其他使用trim的例子吗?

rsl1atfo

rsl1atfo6#

也许https://github.com/axa-group/nlp.js/blob/master/docs/v4/ner-manager.md#trim-entities可以提供更多上下文。

相关问题