アプリの見た目
試しに「上京しました。」と入力して送信すると。 ↓
こんな感じのviewが帰ってきます。パーソナリティはポンコツbabyだそうです。
## APIの利用手順
下記ページへ移動
「コンソールへ移動」をクリック
*GCPへの登録をしていない方は、「無料で開始」というボタンが表示されるので、
手順に従って利用を開始してください。確かクレジットカードの登録が必要だったと思いますが、
有料サービスを使用しなければ基本無料で使用できます。
「APIとサービス」にカーソルを合わせて、ライブラリをクリックします。
検索フォームが出てくるので「Natural Language API」等で検索して、
「Cloud Natural Language API」をクリック
「有効にする」をクリックしAPIの使用を有効にします。
画面遷移ができれば有効化は完了です。
*左側の「割り当て」からAPIの発行回数を制限できます。心配な人は制限を付けておきましょう。
続いてAPIを発行します。
先ほどの手順でクリックしたライブラリの下に「認証情報」というリンクがあるので、クリックします。
「認証情報を作成」をクリックするとタブが出てくるので、「APIキー」をクリック。
APIキーが作成されます。作成されたキーを使用します。
APIキーは大事に扱ってください。github等のパブリックスペースに公開すると悪用される可能性があります。
(今回の画像で使用した僕のAPIキーは念のため削除済みです。)
実装コード
APIを使用している部分 ↓
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"]に値を設定して使用。
最終的なコード ↓
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
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/