Twitterで機械学習
今日からはじめるLens
API
実装
ユーザーのタイムラインや検索結果を取得出来る
Twitter 検索を利用
def initialize_client # configuration option を通す
Twitter::REST::Client.new do |config|
config.consumer_key = $consumer_key
config.consumer_secret = $consumer_secret
config.access_token = $access_token
config.access_token_secret = $access_token_secret
end
end
def build_twitter_search_query
client = initialize_client
client.search(
"##{keyword}",
# 日本
:locate => "ja",
# 最新のツイートと人気のツイート
:result_type => "mixed",
# リツイートを除く
:exclude => "retweets",
# URL やハッシュタグ、メディアなどが含まれているツイートを取得
:include_entity => true
)
end
Google が提供する機械学習の画像認識 API
物体検知
有害コンテンツ検知
顔検知
テキスト検知
etc..
画像に含まれる物体を検知し、乗り物から動物まで多数のカテゴリの中から分類
description
が anime
または cartoon
のものをツイートする
description
の粒度が細かいため# anime, cartoon と判定された画像をツイートする
def tweet_anime_image(image, value, client)
# cloud vision api を叩いて一番スコアの高い属性を取得
description = response_parse(get_cloud_vision_response(image))
if description == 'anime' || description == 'cartoon'
puts "これは #{description} です"
puts value.media_uri.to_s
media = open(value.media_uri.to_s)
# 画像と属性をツイート
client.update_with_media("これは #{description} です", media)
end
end
今日から始めるLens
Java でいうところの getter/setter を抽象化した概念
不変性を保ちつつ、ネストしたデータ構造に対するアクセスを Lens の合成で表現できるようにしたもの
Haskell の Lens にインスパイアされた Scala ライブラリ
Monocle is an Optics library where Optics gather the concepts of Lens, Traversal, Optional, Prism and Iso. Monocle is strongly inspired by Haskell Lens.
case class
たちがいるとするcase class Street(name: String)
case class Address(street: Street)
case class Company(address: Address)
case class Employee(company: Company)
val employee = Employee(Company(Address(Street("Monocle Street"))))
Street
の name
を変更して新しいインスタンスを生成したい…!copy
メソッドを使う
val e2 = employee.copy(
company = employee.company.copy(
address = employee.company.address.copy(
street = employee.company.address.street.copy(
name = employee.company.address.street.name.toUpperCase
)
)
)
)
)
case class Street(var name: String)
case class Address(var street: Street)
case class Company(var address: Address)
case class Employee(var company: Company)
employee1.company.address.street.name.toUpperCase
GenLens
を使う@Lenses
アノテーションを使うval _name = Lens[Street, String](_.name)(n => s => s.copy(name = n))
val _street = Lens[Address, Street](_.street)(s => a => a.copy(street = s))
val _address = Lens[Company, Address](_.address)(a => c => c.copy(address = a))
val _company = Lens[Employee, Company](_.company)(c => e => e.copy(company = c))
GenLens
import monocle.macros.GenLens
val _name = GenLens[Street](_.name)
val _street = GenLens[Address](_.street)
val _address = GenLens[Company](_.address)
val _company = GenLens[Employee](_.company)
@Lenses
アノテーションLens[Stree, String]
などが自動で生成
import monocle.macros.Lenses
@Lenses case class Street(name: String)
@Lenses case class Address(street: Street)
@Lenses case class Company(address: Address)
@Lenses case class Employee(company: Company)
各 Lens
の定義先はコンパニオンオブジェクト内である
マクロパラダイスのプラグイン追加が必要
マクロ自体はまだ実験段階な機能
val e2 = employee.copy(
company = employee.company.copy(
address = employee.company.address.copy(
street = employee.company.address.street.copy(
name = employee.company.address.street.name.toUpperCase
)
)
)
)
val e2 = (company ^|-> address ^|-> street ^|-> name).modify(_.toUpperCase)(employee)