3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

railsでGCP Natural Language APIを使ってクソアプリを作ってみた。

Last updated at Posted at 2021-07-31

アプリの見た目

スクリーンショット 2021-07-30 21.40.59.png
試しに「上京しました。」と入力して送信すると。 ↓
スクリーンショット 2021-07-30 21.45.11.png
こんな感じのviewが帰ってきます。パーソナリティはポンコツbabyだそうです。

## APIの利用手順

下記ページへ移動

スクリーンショット 2021-07-31 21.10.00.png
「コンソールへ移動」をクリック
*GCPへの登録をしていない方は、「無料で開始」というボタンが表示されるので、
手順に従って利用を開始してください。確かクレジットカードの登録が必要だったと思いますが、
有料サービスを使用しなければ基本無料で使用できます。
スクリーンショット 2021-07-31 21.15.41.png
スクリーンショット 2021-07-31 21.27.39.png
「APIとサービス」にカーソルを合わせて、ライブラリをクリックします。
スクリーンショット 2021-07-31 21.50.35.png
検索フォームが出てくるので「Natural Language API」等で検索して、
「Cloud Natural Language API」をクリック
スクリーンショット 2021-07-31 21.55.04.png
「有効にする」をクリックしAPIの使用を有効にします。
スクリーンショット 2021-07-31 22.08.43.png
画面遷移ができれば有効化は完了です。
*左側の「割り当て」からAPIの発行回数を制限できます。心配な人は制限を付けておきましょう。

続いてAPIを発行します。
スクリーンショット 2021-07-31 22.13.56.png
先ほどの手順でクリックしたライブラリの下に「認証情報」というリンクがあるので、クリックします。
スクリーンショット 2021-07-31 22.18.42.png
スクリーンショット 2021-07-31 22.22.30.png

「認証情報を作成」をクリックするとタブが出てくるので、「APIキー」をクリック。

スクリーンショット 2021-07-31 22.44.02.png
APIキーが作成されます。作成されたキーを使用します。
APIキーは大事に扱ってください。github等のパブリックスペースに公開すると悪用される可能性があります。
(今回の画像で使用した僕のAPIキーは念のため削除済みです。)

スクリーンショット 2021-07-31 22.34.37.png
「キーの制限」から使用するAPIを指定できます。

実装コード

APIを使用している部分 ↓

post.rb
def get_sentiment
    require 'net/http'
    require 'uri'
    require 'json'
  # textに入れた文章が評価されます。
    text = self.post

  # ENV["GOOGlE_API_KYE"]に取得したAPIキーを入れます。
    uri = URI.parse("https://language.googleapis.com/v1beta1/documents:analyzeSentiment?key=#{ENV["GOOGlE_API_KYE"]}")
    request = Net::HTTP::Post.new(uri)
    request.content_type = "application/json"
    request.body = ""
    request.body = {
                      document:{
                        type:'PLAIN_TEXT',
                        content: text
                      }
                    }.to_json

    req_options = {
      use_ssl: uri.scheme == "https",
    }

    response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
      http.request(request)
    end

    json = JSON.parse(response.body)
  # scoreに文章のポジティブ度が入ります。
    score =  json['documentSentiment']['score']*100
  # magnitudeに文章の感情の強さみたいなものが入ります。
    magnitude = json['documentSentiment']['magnitude']*100
    sentiment = {score: score.to_i, magnitude: magnitude.to_i}
  end

dotenv-rails等を使用して、ENV["GOOGlE_API_KYE"]に値を設定して使用。

最終的なコード  ↓

post.rb
class Post < ApplicationRecord
  validates :post, presence: true, length: { minimum: 3, maximum: 20 }

  def set_sentiment_with_title
    sentiment = self.get_sentiment
    self.magnitude = sentiment[:magnitude]
    if sentiment[:score] > 50
      title = ["ポンコツbaby", "ハッピー能天気バカ","so funy", "おしゃべりクソ野郎", "無駄話うそ太郎", "元気の押し売り", "言い訳クソメガネ", "ラッキー幸せ人間", "好感度おばけ"]
      self.sentiment = "ポジティブ"
      self.score = sentiment[:score]
    elsif sentiment[:score] > 0
      title = ["おたんこなすび", "おまぬけ勘違いさん","おたんこなすび", "おしゃべりクソ野郎", "無駄話うそ太郎", "あほ", "言い訳クソメガネ", "クレイジー日本代表", "優しき偽善者"]
      self.sentiment = "ポジティブ"
      self.score = sentiment[:score]
    elsif sentiment[:score] >= -50
      title = ["ポンコツbaby", "インテリくそ陰キャ","人間性皆無自己中人間", "おたんこなすび", "詐欺師", "ぴえん越えてぱおん", "だめだこりゃ", "元気出せよ💓", "あほ"]
      self.sentiment = "ネガティブ"
      self.score = sentiment[:score]*-1
    else
      title = ["ポンコツbaby", "インテリくそ陰キャ","人間性皆無自己中人間", "後ろ向きネガティブごみ人間", "ダイアモンド不愉快", "ぴえん越えてぱおん", "人間失格", "元気出せよ💓", "堕天使"]
      self.sentiment = "ネガティブ"
      self.score = sentiment[:score]*-1
    end
    self.personality_title = title[rand(10)-1]
  end

  def set_bournus
    return if self.random_int2 < 100

    if self.personality2 == "香ばしさ"
      self.personality_title = "香ばしき漢"
    elsif self.personality2 == "神に愛され度"
      self.personality_title = "神に愛されし者"
    elsif self.personality2 == "尊さ"
      self.personality_title = "愛され地下アイドル"
    elsif self.personality2 == "足の臭さ"
      self.personality_title = "足クサおじさん"
    elsif self.personality2 == "強者の風格"
      self.personality_title = "範馬勇次郎"
    else
      self.personality_title = "パーリィーぴーぽー"
    end
  end

  def set_int_with_personality
    index1 = ["センス", "知性", "努力", "主人公度", "地頭力", "おもしろさ"]
    index2 = ["香ばしさ", "神に愛され度", "尊さ", "足の臭さ", "強者の風格", "人望"]
    self.random_int1 = rand(rand(200))
    self.personality1 = index1[rand(7)-1]
    self.random_int2 = rand(rand(200))
    self.personality2 = index2[rand(7)-1]
  end

  def get_sentiment
    require 'net/http'
    require 'uri'
    require 'json'

    text = self.post

    uri = URI.parse("https://language.googleapis.com/v1beta1/documents:analyzeSentiment?key=#{ENV["GOOGlE_API_KYE"]}")
    request = Net::HTTP::Post.new(uri)
    request.content_type = "application/json"
    request.body = ""
    request.body = {
                      document:{
                        type:'PLAIN_TEXT',
                        content: text
                      }
                    }.to_json

    req_options = {
      use_ssl: uri.scheme == "https",
    }

    response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
      http.request(request)
    end

    json = JSON.parse(response.body)
    score =  json['documentSentiment']['score']*100
    magnitude = json['documentSentiment']['magnitude']*100
    sentiment = {score: score.to_i, magnitude: magnitude.to_i}
  end

end
hitokoto_controller.rb
class HitokotoController < ApplicationController
  def new
    @post = Post.new
  end

  def create
    @post = Post.new(post_params)
    @post.set_sentiment_with_title
    @post.set_int_with_personality
    @post.set_bournus
    if @post.save
      redirect_to hitokoto_path(@post)
    else
      flash[:notice] = "ばぶばぶ(3文字以上20文字以下でちゅよ)"
      render "hitokoto/new"
    end
  end

  def index
    @posts = Post.all.limit(7).order(id: "DESC")
  end

  def show
    @post = Post.find(params[:id])
  end

  def post_params
    params.require(:post).permit(:post)
  end
end

設定した値を使って条件分岐によって、色々な値が出るように記述。
製作期間2〜3日の文字通りクソアプリです。
コントローラーの名前はちょっと失敗しています。可読性悪くて申し訳ないです。

公式の使用方法で実装した方が、APIからより詳細な値が帰ってきます。
https://cloud.google.com/natural-language/docs/quickstart-client-libraries?hl=ja
今回はgithubに公開しつつ、デプロイするという手順を時間をかけずに実装したため、簡易的な実装になっております。

アプリの詳細

viewを含めたコードはgithubに公開してます。
https://github.com/kosimaru1997/hitokoto
今回作成したクソアプリ
https://ohitokoto.herokuapp.com/

3
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?