Ruby on Rails で Yahoo のテキスト解析 APIを使う

2018年6月25日月曜日

Rails Ruby Yahoo 文書構成

t f B! P L

Ruby on Rails で Yahoo のテキスト解析 APIを使う

Rubyで Yahooのテキスト解析APIを呼び出すサンプルコードを作ってみました。
引数にチェックを行う文書を渡すと、指摘結果を JSONデータで返すサンプルです。

公式ドキュメントはこちら

日本語形態素解析

  ##
  # 日本語形態素解析の実行
  # @param sentence 解析対象のテキスト
  # @return 形態素解析の結果
  # [
  #   {
  #     Surface: "庭"    //形態素の表記
  #     reading: "にわ"  //形態素の読みがな
  #     pos: "名詞"      //形態素の品詞
  #   }
  #   , 
  #   ...
  # ]
  def exec(sentence) 

    # URLおよびクエリパラメタ設定
    url = URI.parse("https://jlp.yahooapis.jp/MAService/V1/parse")    
    url.query = [
      "appid=" + URI.encode(CLIENT_ID),
      "results=ma",
      "sentence=" + URI.encode(sentence)
    ].join("&")

    # getリクエスト送信
    res = get_request(url, true);
  
    # エラーの場合、nilを返却
    return nil if res.code != "200"

    # xml解析する
    words = []
    doc = REXML::Document.new(res.body)
    # - word要素分繰り返し
    doc.elements.each("//ma_result/word_list/word") do |el|
      # - wordタグ内の各要素を読み取って、hashに格納
      words << ["surface", "reading", "pos"].inject({}) do |h, nm|
        child_el = el.get_elements(nm)[0]
        h[nm] = child_el.nil? ? nil : child_el.text 
        h
      end
    end

    return words
  end

  ##
  # GETリクエストを送信し、そのレスポンスを取得する
  # @param url リクエストURL
  # @return レスポンス
  def get_request(url, use_ssl = true)

    req = Net::HTTP::Get.new(url.request_uri)

    # getリクエスト送信
    res = Net::HTTP.start(url.host, url.port, :use_ssl => use_ssl) do |http|
      http.request(req)
    end
    res
  end

校正支援API

require 'net/http'
require 'uri'
require 'rexml/document'  

  ##
  # 校正支援APIの実行
  # @param sentence 解析対象のテキスト
  # @return 文書校正の指摘結果JSON
  # [
  #   {
  #     StartPos: 2,    //対象文字列開始位置(先頭からの文字数)
  #     Length:5        //対象文字列長(対象文字数)
  #     Surface: "NNN"  //対象表記
  #     ShitekiWord:    //言い換え候補文字列。複数の候補が返される際には、間に読点がはさまれます
  #     ShitekiInfo:    //指摘の詳細情報。リクエストパラメータ no_filterの説明で挙げた指摘内容のうち、どれか1つを表示します
  #   }
  #   , 
  #   ...
  # ]
  def exec(sentence) 

    # API呼び出し用の URL を作成
    url = URI.parse("https://jlp.yahooapis.jp/KouseiService/V1/kousei")
    # CLIENT_ID の部分は、ご自分で取得した IDをセットしてください。
    url.query = [
      "appid=" + URI.encode(CLIENT_ID),
      "sentence=" + URI.encode(sentence)
    ].join("&")

    # getリクエスト送信
    res = get_request(url, true);
  
    # エラーの場合、nilを返却
    return nil if res.code != "200"

    # 校正支援APIからは XMLでレスポンスが返ってくるため、
    # xmlの結果を jsonに変換する
    kosei_list = []
    doc = REXML::Document.new(res.body)
    # - word要素分繰り返し
    doc.elements.each("//ResultSet/Result") do |el|
      # - Resultタグ内の各要素を読み取って、hashに格納
      kosei_list << ["StartPos", "Length", "Surface", "ShitekiWord", "ShitekiInfo"].inject({}) do |h, nm|
        child_el = el.get_elements(nm)[0]
        h[nm] = child_el.nil? ? nil : child_el.text 
        h
      end
    end

    # 結果をハッシュで返却
    return kosei_list
  end
スポンサーリンク

QooQ