【问题标题】:Issue with accents and encoding with Bing Spell Check API v7Bing Spell Check API v7 的重音和编码问题
【发布时间】:2018-01-04 00:21:40
【问题描述】:

所以我尝试在 PHP 中使用 Bing 的拼写检查 API,但我遇到了一个问题,即重音符号和其他特殊字符没有被正确解码,从而产生了许多原始文本中没有的错误并弄乱了偏移量。

我的实现非常简单 - 它很大程度上基于他们在文档中提供的示例。我不确定我是否应该做一些不同的事情,或者他们如何解码这些特殊字符是否存在问题(这似乎极不可能 - 我搞砸的可能性更大......!)

代码如下:

$host = 'https://api.cognitive.microsoft.com';
$path = '/bing/v7.0/spellcheck?';

$data = array (
    'mkt' => $lang,
    'mode' => 'proof',
    'text' => urlencode($text)
);

$encodedData = http_build_query($data);
$key = 'subscription key redacted for obvious reasons';

$headers =  "Content-type: application/x-www-form-urlencoded\r\n" .
            "Ocp-Apim-Subscription-Key: $key\r\n";

if (isset($_SERVER['REMOTE_ADDR']))
    $headers .= "X-MSEdge-ClientIP: " . $_SERVER['REMOTE_ADDR'] . "\r\n";

$options = array (
    'http' => array (
        'header' => $headers,
        'method' => 'POST',
        'content' => $encodedData
    )
);
$context  = stream_context_create ($options);
$result = file_get_contents ($host . $path, false, $context);

if ($result === FALSE) {
    # Handle error
}

$decodedResult = json_decode($result, true);

例如,如果我尝试对以下字符串进行拼写检查:

机构

$encodedData 变成如下:

mkt=fr-CA&method=proof&text=d%25E2%2580%2599institutions

我从 API 得到的结果如下:

array(2) {
  ["_type"]=>
  string(10) "SpellCheck"
  ["flaggedTokens"]=>
  array(1) {
    [0]=>
    array(4) {
      ["offset"]=>
      int(8)
      ["token"]=>
      string(14) "99institutions"
      ["type"]=>
      string(12) "UnknownToken"
      ["suggestions"]=>
      array(2) {
        [0]=>
        array(2) {
          ["suggestion"]=>
          string(15) "99 institutions"
          ["score"]=>
          float(0.93191315174102)
        }
        [1]=>
        array(2) {
          ["suggestion"]=>
          string(14) "99 institution"
          ["score"]=>
          float(0.6518044080768)
        }
      }
    }
  }
}

如您所见,解码似乎有问题,因为 % 被编码了两次,并且显然只解码了一次。现在,如果我在 $data 中设置 'text' 的值时删除了 url_encode(),它可以很好地用于撇号,但它不适用于重音。例如下面的字符串:

责任

被 API 解释为

责任

返回错误。

这很可能是我忽略的一些简单的事情,但我已经为此苦苦挣扎了很长一段时间,如果我能得到任何帮助,我将不胜感激。

谢谢,

- 埃米尔

[ 编辑 ] 好吧,一如既往......当有疑问时,假设你错了。 API 建议更改常规字母的所有重音符号,因为即使指定的语言是法语,它仍然会以英语给出建议,而不是返回空数组。至于似乎没有被解码的口音,嗯......我正在 var_dump-ing 没有任何 doctype 集的数据,所以它当然会在没有正确编码的情况下显示。对此感到抱歉 - 最后,只需删除 urlencode() 就可以了!

【问题讨论】:

    标签: php microsoft-cognitive bing-api


    【解决方案1】:

    根据docs

    API 支持两种校对模式,ProofSpell。默认模式是证明。 Proof 拼写模式提供最全面的检查,但仅在 en-US(英语-美国)市场中可用。对于所有其他市场,将模式查询参数设置为拼写。 Spell 模式会发现大多数拼写错误,但不会发现 Proof 捕获的一些语法错误(例如,大写和重复的单词)。

    【讨论】:

    • 因此,例如,如果文本中包含重音的人名,即使是英文(en-US),API 也无法正常工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多