使用带有 watson-developer-cloud 包的 Watson 问答服务时如何获得完整答案?

How to get the full answers when using the Watson Q&A service with the watson-developer-cloud package?

我正在使用 watson-developer-cloud npm 模块调用 IBM Watson 问答 API。我调用服务的代码如下:

question_and_answer_healthcare.ask({
  text: 'What are the benefits of taking aspirin daily?'}, function (err, response) {
  if (err)
    console.log('error:', err);
  else {
    console.log(JSON.stringify(response, null, 2));
  }
});

在打印的回复中,我得到了一系列答案,其中仅列出了所使用的证据,但没有列出实际答案。这是一个示例答案元素:

{
    "id": 0,
    "text": "373C41A4A1E374B1BE189D07EF707062 - Taking Aspirin Every Day : Taking Aspirin Every Day : The Basics : What are the benefits of taking aspirin daily?",
    "pipeline": "Descriptive,TAO",
    "confidence": 0.96595,
    "entityTypes": []
}

如何获得完整的答案文本?

TL;DR 当您提交问题时,您 POST 在 question object 中 questionText。在那个question object中,添加formattedAnswer并将其设置为true

例如

{
    "question" : {
        "questionText" : "This is your question",
        "formattedAnswer" : true,
        ...

使用此选项时,您可以检索 returned 答案的完整格式 HTML,如下所示:

response[0].question.answers.forEach(function(answer, index) {
  console.log(answer.formattedText);
})

您需要从 HTML 中解析出您希望向用户显示的必要信息。

(API 文档参考:https://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/apis/#!/question-and-answer/question )

背景

Watson QA API 正在 return 处理它认为与您的问题匹配的文档部分的 ID 和标题。这就是您看到的返回的文本。其格式为 <ID> - <TITLE>

这种格式适合 machine-to-machine 使用,例如,如果您打算从某个地方查找答案。

但是如果您想要一个可以显示给用户的答案,formattedAnswer 标志可以满足您的要求。它告诉 API 到 return 文档该部分的内容,而不仅仅是 ID 和标题。

API 响应有效负载还包括使 Watson 对其 return 的答案充满信心的支持证据。您通常也可以在那里找到答案的文档部分 - 但我建议最好不要依赖它。如果您想要答案的内容,formattedAnswer 标志是有据可查的、可靠的 will-always-be-there 获取方式。

在您的特定情况下,由于您使用的包装器库不允许您设置它,我想这会给您留下 returning supporting-evidence 的解决方法而不是答案,或自己构建 QA API 的 POST 请求。

注意:如果您的问题是关于 healthcare Watson QA beta 语料库的,则以下技术有效。但是,在某些情况下,返回的证据和答案不一致。以下应被视为使用 formattedText 选项的解决方法,不应将其视为万无一失的方法。

使用 0.9.20 版本的 watson-developer-cloud 包时,您不能在 HTTPS 请求正文中设置任何可选输入。因此,您应该使用以下方法来获得您的答案:

问题的完整答案文本不位于 response[0].question.answers[] 数组中,而是位于证据列表中每个条目的 response[0].question.evidencelist[X].text 属性中。您会在 response[0].question.evidencelist[X].value 字段中找到相关的置信度。为了在您的场景中检索这些值,您可以像下面的完整示例一样解析它:

var watson = require('watson-developer-cloud');
var question_and_answer = watson.question_and_answer({
  version: 'v1',
  dataset: 'healthcare',
  username: 'YOUR USERNAME'
  password: 'YOUR PASSWORD'
});

question_and_answer.ask({
  text: 'What are the benefits of taking aspirin daily?'}, function (err, response) {
    if (err)
      console.log('error:', err);
    else {
      // Print the answer with the highest confidence
      console.log(response[0].question.evidencelist[0].text);

      //Print all returned answers
      response[0].question.evidencelist.forEach(function(answer, index) {
        console.log(index, '. ', answer.text);
      })
    }
});