A3RT Text Summarization API を Ruby から呼び出す

2018年6月27日水曜日

t f B! P L
文書要約API

A3RT Text Summarization API を Ruby から呼び出す

はじめに

リクルートテクノロジーズが提供している、
文章要約を行うAPIを Ruby on Rails から呼び出すサンプルコードです。

使い方は、以下のサンプルコードをコピーし、
exec() 関数に、要約を行う文書を渡して呼び出すと、
要約結果を文字列の配列で取得できます。

サンプルコード


require 'net/http'
require 'uri'
require 'json'

  # ご自身のAPIキーを書き換えてください
  CLIENT_ID = "xxxxxxxxxxxxxxxxxxxxxx"

  ##
  # 文書要約 API の実行
  # @param sentence 解析対象のテキスト
  # @result 文書の要約結果 (ex: ["センテンス"])  
  def exec(sentence) 

    # APIのURL
    url = URI.parse("https://api.a3rt.recruit-tech.co.jp/text_summarization/v1")
    
    separation = "。"

    # 文章数を取得
    line_count = get_line_count(sentence, separation)
    if line_count <= 1
      # 文章数が1以下の場合、APIでエラーとなるため、
      # 指定された sentence をそのまま要約結果とします
      return [sentence]
    end

    # リクエストパラメータを設定
    post_data = { 
      'apikey' => CLIENT_ID,      #APIキー
      'sentences' => sentence,    #要約する文章
      'linenumber' => 1,          #抽出文章数
      'separation' => separation  #文章の切れ目の文字
    }

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

    # JSON文字列をパースし、要約結果を返却
    result = JSON.parse(res.body)
    return result['summary']
  end

  ###
  # 指定された sentence の文章数を取得します。
  # @param sentence   要約する文章
  # @param separation 文章の切れ目の文字
  # @return 文章数
  def get_line_count(sentence, separation)
    sentence.count(separation)
  end

  ### 
  # POSTリクエストを送信し、そのレスポンスを取得する
  def post_request(url, data, use_ssl = true) 
    req = Net::HTTP::Post.new(url.request_uri)
    req.set_form_data(data)

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

注意事項

Text Summarization API は、要約する文書の文章数が、
抽出文章数よりも少ない場合、API エラーとなります。

このサンプルでは抽出文章数を"1"としている為、
渡された文書の文章数が1つの場合、
引数の値をそのまま要約結果として返すようにしています。

※ ちなみに文章の切れ目は、"。"です。


試してみる

str = <<"EOS"
日本における焼きそばは家庭料理や飲食店のメニューとして一般的である。
さらに屋外であっても鉄板一枚あれば調理可能なことや調理手順が簡単な事から、
縁日の露店、学園祭などイベントの模擬店・売店、スナックコーナーなど様々な場所で売られている。
EOS

p exec(str)

↓ 実行結果

["日本における焼きそばは家庭料理や飲食店のメニューとして一般的である"]

文書からキーワードを探して、最も特徴的な文章を返すようになっているみたいです。

最後に

文書によっては、要約結果が微妙な時がありますが、
今後、学習してどんどん賢くなったら、
音声認識で文字起こしてから、文書を要約すれば、
簡単に議事録とかが作成できる時代が来るかもですね。。。

スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ