トップ «前の日記(2018-08-26) 最新 次の日記(2018-08-30)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2018-08-28

_ BingスペルチェックAPIを試しているんだが……

Bing Spell Check APIで日本語もチェックできる(ただし、mode=spellのみ)というので試しているのだが、全然、わけがわからなくて閉口している。

次のようなクラスでテストしてみる。

# coding: utf-8
require 'net/http'
require 'uri'
require 'json'
  
class BingSpellChecker
  KEY1 = '登録して得られたキー'.freeze
  # マーケットはja-JP、言語はja、モードはspell(proofモードは対応していないので英語チェックになるらしい)
  URL = 'https://api.cognitive.microsoft.com/bing/v7.0/spellcheck?mkt=ja-JP&setLang=ja&mode=spell'.freeze
 
  @@uri = nil
 
  def initialize(logger = Rails.logger)
    @logger = logger
    unless @@uri
      @@uri = URI.parse(URL)
    end
  end
 
  def check(text)
@logger.debug @@uri.request_uri
    req = Net::HTTP::Post.new(@@uri.request_uri,
                              'Content-Type' => 'application/x-www-form-urlencoded',
                              'Ocp-Apim-Subscription-Key' => KEY1)
    req.set_form_data('text' => text)
    resp = Net::HTTP.start(@@uri.host, @@uri.port, use_ssl: @@uri.scheme == 'https') do |h|
      h.request(req)
    end
    # 最初mode=proofで試していたがまったく日本語は無視されているのでマーケットとして
    # 何を認識しているのか確認するためにレスポンスヘッダをログした名残
    resp.each_header do |nm, val|
      @logger.debug "#{nm}=#{val}"
    end
    r = JSON.parse(resp.body)
    @logger.debug JSON.pretty_generate(r)
    if resp.code == '200'
      []   # 実際は応答データを元に都合が良いStructのインスタンス配列にしているが省略
    else
      return resp.code
    end
  end
end

たとえば、次の文を送ると、まあ検出されるのだが嬉しくない。

にぽんごが間違えている。
結果のJSON:
{
  "_type": "SpellCheck",
  "flaggedTokens": [
    {
      "offset": 4,
      "token": "が間違えて",
      "type": "UnknownToken",
      "suggestions": [
        {
          "suggestion": "が 間違えて",
          "score": 1
        }
      ]
    }
  ],
  "correctionType": "High"
}

分かち書きしろと? というか「にぽんご」はOKなのかなぁ。

で、気を取り直して、もう少し長い文章にしてみる。

にぽんごむずかしい。そもそもにぽんごむつかしいから、にぽんごが間違えている。
結果のJSON:
{
  "_type": "SpellCheck",
  "flaggedTokens": [
  ]
}

OKになってしまった……というか試していると複文は何をしても(と言っても限界はあるが)OKとなる。そういうものなのか? 確かにサンプルは1文だしなぁ。

追記:どうも本当に1単語のスペルチェックみたいだ。「グローパル」でかけたら「グローバル」と出てきた……。カンマで区切ると複数単語も行ける(「デシプリン,風鈴火山」→「ディシプリン,風林火山」)が、使形態素解析して名詞だけ拾ってとかしないと使えないのか……

だんだん嫌になってきたが、「問題は、グローパル基準です。」は文だけどグローパルを正しく指摘するが、「問題は、グローパル基準にあります。」だと指摘されないとか、結局mode=proofがサポートされていない以上、正しく単語を抽出してチェックできない、ということみたいだ。将来に期待、かな(APIは使いやすいのでとても良いのだが残念)


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|

ジェズイットを見習え