Yahooが提供するキーフレーズ抽出APIをRailsアプリケーション内で叩いて、文章から重要な単語を抜き取ります。
最終的なイメージは、
「"今日はお昼に代官山でハンバーガーを食べた。おいしかった"」
=> [
{"Keyphrase"=>"ハンバーガー", "Score"=>"100"}
{"Keyphrase"=>"代官山", "Score"=>"79"}
{"Keyphrase"=>"お昼", "Score"=>"44"}
]
このようなかたちで取得します。
公式ドキュメントはこちら
コード
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にあまり慣れていない方は以下のステップを読んで実行してみてください。
ステップ
- アプリケーションIDの入手
- 環境変数の設定
- YahooAPIにアクセスする用のクラスを作成
- 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ではサービス層で行うことが多いのでサービス層を導入します。
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とかですね。
class YahooKeyphraseService
end
これでコンソールを開いてクラスを呼び出せたらここまではOKです。
YahooAPIへのリクエスト
今回のhttpリクエストはgemのhttpclientを使います。
gem 'httpclient'
と記述してbundle installをしてください。
準備がととのったら先程作成したサービスクラスの中身をを書いていきます。
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の重要度のスコア付きでキーフレーズが取得できます。