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


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

最終的なイメージは、

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

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


[公式ドキュメント](http://developer.yahoo.co.jp/webapi/jlp/keyphrase/v1/extract.html)はこちら

# コード
```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を使って行います。

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

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

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

```.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を使います。

```Gemfile
gem 'httpclient'
```

と記述してｂundle 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の重要度のスコア付きでキーフレーズが取得できます。