LoginSignup
3
4

More than 5 years have passed since last update.

YahooAPIで重要語やキーフレーズ抽出をする @Rails4

Posted at

Yahooが提供するキーフレーズ抽出APIをRailsアプリケーション内で叩いて、文章から重要な単語を抜き取ります。

最終的なイメージは、

「"今日はお昼に代官山でハンバーガーを食べた。おいしかった"」
=> [
  {"Keyphrase"=>"ハンバーガー", "Score"=>"100"}
  {"Keyphrase"=>"代官山", "Score"=>"79"}
  {"Keyphrase"=>"お昼", "Score"=>"44"}
]

このようなかたちで取得します。

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

コード

services/yahoo_keyphrase_service.rb
class YahooKeyphraseService
  attr_reader :endpoint_uri, :query

  def initialize(sentence)
    @endpoint_uri = "https://jlp.yahooapis.jp/KeyphraseService/V1/extract?appid=#{ENV['YAHOO_APP_ID']}"
    @query        = {sentence: sentence}
  end

  def execute
    http_client = HTTPClient.new
    response    = http_client.post(endpoint_uri, body: query)
    results     = Hash.from_xml(response.body)['ResultSet']['Result']
    results     = [results] if results.instance_of?(Hash)
    results
  end
end

お察しの良い方はこのコードだけ見たらわかると思います。外部APIにあまり慣れていない方は以下のステップを読んで実行してみてください。

ステップ

  1. アプリケーションIDの入手
  2. 環境変数の設定
  3. YahooAPIにアクセスする用のクラスを作成
  4. YahooAPIへのリクエスト

上記のようなステップで解説していきます。

アプリケーションIDの入手

https://e.developer.yahoo.co.jp/register
こちらのリンクからアプリの作成ができます。
道なりにすすんでいくと アプリケーションIDシークレットキー が入手できるのでメモっておいてください。

環境変数の設定

環境変数の管理はdotenvを使って行います。

group :development, :test do
  gem 'dotenv-rails'
end

と書いてbundle installしてください。

app直下に.envファイルを作成して、

YAHOO_APP_ID      = 'hogehogehoge'
YAHOO_APP_SECRET  = 'hogehogehoge'

環境変数を設定します。

YahooAPIへのアクセス用のクラスを作成

外部APIへのアクセスはRailsではサービス層で行うことが多いのでサービス層を導入します。

config/application.rb
module HogeApp
  class Application < Rails::Application
    config.autoload_paths += Dir["#{config.root}/app/services"]
  end
end

application.rb内でオートロードするように書いてサービス層の導入をします。

次に、app直下にservicesディレクトリを追加してそのディレクトリにクラスを作ります。
こうするとアプリ内でモデルクラスのようにクラスを呼べるようになります。

そうしたら、servicesディレクトリ下にYahooKeyphraseServiceというクラスを作成します(名前はなんでもいいですがわかり易い名前で)。ファイル名はyahoo_keyphrase_service.rbとかですね。

yahoo_keyphrase_service.rb
class YahooKeyphraseService
end

これでコンソールを開いてクラスを呼び出せたらここまではOKです。

YahooAPIへのリクエスト

今回のhttpリクエストはgemのhttpclientを使います。

gem 'httpclient'

と記述してbundle installをしてください。

準備がととのったら先程作成したサービスクラスの中身をを書いていきます。

yahoo_keyphrase_service.rb
class YahooKeyphraseService
  attr_reader :endpoint_uri, :query

  def initialize(sentence)
    @endpoint_uri = "https://jlp.yahooapis.jp/KeyphraseService/V1/extract?appid=#{ENV['YAHOO_APP_ID']}"
    # endpoint uriの設定。ENV['YAHOO_APP_ID']で先程設定したアプリケーションIDを呼び出している
    @query        = {sentence: sentence}
    # 初期化時に引数に渡した文章をクエリとしてセットしている。sentenceの中に今回キーフレーズ抽出したい文章が入る。
  end

  def execute
    http_client = HTTPClient.new
    response    = http_client.post(endpoint_uri, body: query)
    # POSTメソッドでリクエスト
    results     = Hash.from_xml(response.body)['ResultSet']['Result']
    # XMLで返ってくるので、from_xmlメソッドでハッシュに変換。
    results     = [results] if results.instance_of?(Hash)
    # ヒットしたキーフレーズがひとつだと配列にならないのであとあとのことを考えて配列にしておく。
    results
  end
end

jsonで返すこともできますが、文字コードを変換しなくてはいけないので今回はXMLの形式で取得しています。

これでコンソールを開いてメソッドを実行すると、、、

pry(main)> YahooKeyphraseService.new("今日はお昼に代官山でハンバーガーを食べた。おいしかった").execute
=> [{"Keyphrase"=>"ハンバーガー", "Score"=>"100"}, {"Keyphrase"=>"代官山", "Score"=>"79"}, {"Keyphrase"=>"お昼", "Score"=>"44"}]

このような形で0~100の重要度のスコア付きでキーフレーズが取得できます。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4