2

我正在使用 watson-developer-cloud npm 模块调用 IBM Watson Question and Answer 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": []
}

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

4

2 回答 2

4

TL;DR当您提交问题时,您会questionTextquestion对象中发布一个。在该question对象中,添加formattedAnswer并将其设置为true.

例如

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

使用此选项时,您可以检索返回答案的完整格式化 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 将返回它认为与您的问题匹配的文档部分的 ID 和标题。这就是你看到的文字回来了。它的格式是<ID> - <TITLE>

这种格式适用于机器对机器的使用,例如,如果您打算从某个地方查找答案。

但是,如果您想要一个可以显示给用户的答案,该formattedAnswer标志会为您提供。它告诉 API 返回该文档部分的内容,而不仅仅是 ID 和标题。

API 响应负载还包括使 Watson 对其返回的答案充满信心的支持证据。您也经常可以在文档部分找到答案 - 但我建议最好不要依赖它。如果您想要答案的内容,则formattedAnswer标志是记录在案的、可靠的、永远存在的方式来获得它。

在您的特定情况下,由于您使用的包装库不允许您设置它,我想这会给您留下返回支持证据而不是答案的解决方法,或者自己为 QA API 构建 POST 请求。

于 2015-07-05T20:35:36.320 回答
2

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

使用 watson-developer-cloud 包的 0.9.20 版本时,您不能在 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);
      })
    }
});
于 2015-07-07T03:12:42.933 回答