Stimulator

機械学習とか好きな技術話とかエンジニア的な話とかを書く

UbuntuにPythonのWebスクレイピングと自然言語処理環境を作るメモ

- はじめに -

Webから文章を取得して、自然言語処理かけた後に機械学習にかけるみたいな事はままある。

大体Docker使えば良いんだけど、そうじゃないんだよなという時のための個人的なメモ。

Ubuntu 16.04でPython3.xなら大体インストールできるはず。


 

- スクレイピング周り -

lxmlなるHTML解析パーサに関連したパッケージを入れた後に下記を導入する

  • joblib 並列稼働
  • selenium ブラウザ操作
  • cchardet 文字コード推定
  • requests HTTP通信
  • BeautifulSoup4, lxml HTML解析
sudo apt-get install -y libxml2-dev libxslt1-dev
sudo pip install joblib selenium cchardet requests BeautifulSoup4 lxml

 
以下参考に使いたいheadlessブラウザを導入し動作チェックをしておく。

・PhontomJS:
PythonでWebスクレイピングする時の知見をまとめておく - Stimulator

wget -O /tmp/phantomjs-2.1.1-linux-x86_64.tar.bz2 https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
cd /tmp
bzip2 -dc /tmp/phantomjs-2.1.1-linux-x86_64.tar.bz2 | tar xvf -
sudo mv /tmp/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/
phantomjs --version

 
・headless Chrome:
headless chromeをPythonのseleniumから動かして引数を考えた (Ubuntu 16.04) - Stimulator

wget https://chromedriver.storage.googleapis.com/2.29/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/local/bin/
sudo apt-get install libappindicator1
sudo touch /etc/default/google-chrome
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb

 
・headless Firefox:
Firefox headlessモードをUbuntuとPythonとSelenium環境で動かす - Stimulator

sudo apt-add-repository ppa:mozillateam/firefox-next
sudo apt-get update
sudo apt-get install firefox
wget https://github.com/mozilla/geckodriver/releases/download/v0.18.0/geckodriver-v0.18.0-linux64.tar.gz
tar -zxvf geckodriver-v0.18.0-linux64.tar.gz
sudo cp ./geckodriver /usr/local/bin


 

- 自然言語処理周り -

Mecab

事前にhttp://taku910.github.io/mecab/#download から最新リリースのmecab-hoge.tar.gzをダウンロードしてscpしておく

tar xvf mecab-*.tar.gz
cd mecab-*
 ./configure --prefix=$HOME/local --with-charset=utf8 --enable-utf8-only
make
make install

bashrcに書く

export PATH="$HOME/local/bin:$PATH"

 
・IPAdic

事前にhttp://taku910.github.io/mecab/#download から最新リリースのmecab-ipadic-hoge.tar.gzダウンロードしてscpしておく

tar xzvf mecab-ipadic-*.tar.gz
cd mecab-ipadic-*/
./configure --with-charset=utf8 --with-dicdir=$HOME/local/lib/mecab/dic/ipadic
make
make install

 
・neologdなるIPAdicの拡張辞書

git clone https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd/
sudo bin/install-mecab-ipadic-neologd -n -u


 

- Python周り -

MeCabPythonバインディングや前処理モジュールのneologdn、正規化の分散表現にしたい場合やBoWとかも使いたいだろうからgensim、Word2vec、sklearnを入れてひとまず下準備おわり。

sudo pip install mecab-python3
sudo pip install neologdn
sudo pip install numpy
sudo pip install scipy
sudo pip install gensim
sudo pip install cython
sudo pip install word2vec
sudo pip install scikit-learn
sudo pip install git+https://github.com/miurahr/pykakasi

厄介なのはpykakasiくらい。
(pipで普通にインストールするとビルドで死ぬ)


neologdn参考:mecab-neologd 前処理用 Python モジュール neologdn 公開しました - Debug me
pykakasi参考:Django Python 漢字・ひらがな・カタカナをローマ字に変換する~pykakasi - Djangoroidの奮闘記


 

- おわりに -

多分これでなんとかなると思います(自分宛て)。


 

Slack botをGASでつくる方法で一番楽そうなやつ

- はじめに -

正直今時AWS LambdaがSlackサポートしていてポチポチやってスクリプト数行でbotが出来るし、フレームワークも充実しているので、何故今更GASなのかと思ったらブラウザバックした方が良い。
hubotもAWSも実質サーバ代がかかるけど `GASは無料` で `Google Driveの中身を触れる` くらいしかメリットがない。

投稿するだけなら以下の記事のようにIncoming Webhooksだけ設定して適当な所からPOSTするので良い
vaaaaaanquish.hatenablog.com


 
それでもGoogle Apps Scriptで簡単に応答するbotが作りたいんじゃいという記事。

Slackにbotもどきを導入する方法はいくつかあるが、今回目指すのは以下のようにbotがリプライできて、リプライ内容に対してbotが返信してくれる状態。
f:id:vaaaaaanquish:20170927155852p:plain:h170:w300

結論からいうとSlackにAppでbot追加するのと、Outgoing WebHooksを組み合わせるのが現状最善手っぽい。


 

- Slack側の色々 -

Slackにbotらしきものを導入する方法はいくつかある。

Custom Integrations には Bots や Outgoing WebHooks、Incoming Webhooksが用意されているし、公開AppにはHubot連携等のbot作成フレームワークとの連携Appがいくつかある。

本記事では簡単に「独自App追加」と「Outgoing WebHooks」だけでSlack botを実現する。

 

Slackにbotを追加して投稿する設定

SlackのAppページから新しいAppを作成
https://api.slack.com/apps

f:id:vaaaaaanquish:20170927162923p:plain:h200:w400

アプリ名と登録したいチャンネルを選んでCreate App
f:id:vaaaaaanquish:20170927163027p:plain:h200:w200

画面が遷移しApp管理画面に移る
 
左タブからBot Userを選択、適当な名前でbotを追加し、Always Show My BotをOnにしてSave。
f:id:vaaaaaanquish:20170927163157p:plain


このBotから投稿できるよう、左タブからIncoming Webhooksを選択。
f:id:vaaaaaanquish:20170927163716p:plain:h300:w300

認証画面が出るのでここで投稿したいチャンネルを選んでAuthorize。
f:id:vaaaaaanquish:20170927163815p:plain:h200:w250

 
Botの投稿URLが生成されるのでコピーしておく。
f:id:vaaaaaanquish:20170927164040p:plain:h250:w300


ちなみにこの時点でコンソール等からURLに対してPOSTしてやれば試せる(まあ試さなくても大体できてる)。

curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/~~~

あとこの時点で、botデフォルトのicon等が設定でき、左タブのSettings>Basic Informationに飛んで下の方にスライドしていくと設定する箇所がある。

 

GASからSlackにPOST

GASが入ってない場合は新規でアプリの追加すれば、Google Drive上から右クリックメニュー>その他>Google Apps Scriptが選択出来るようになる。
f:id:vaaaaaanquish:20170927165029p:plain:w300:h300

GASでSlackする記事を見ると、大抵soundTrickerさんが作ったLibraryを使った方法が出て来るが、Slack APIのTokenが必要な事と拡張できないので使わない。

もしライブラリを使うなら以下が導入で分かりやすいかも。
Slack BotをGASでいい感じで書くためのライブラリを作った
GASとSlackではじめるチャットボット〜初心者プログラマ向け〜
初心者がGASでSlack Botをつくってみた - CAMPHOR- Tech Blog

 
先程取得したbotのURLを指定してGASのコードをコピペして、test関数をGASエディタの上部バーの再生ボタンっぽいやつで実行。

function postSlack(text){
  var url = "https://hooks.slack.com/services/T~~~~";
  var options = {
    "method" : "POST",
    "headers": {"Content-type": "application/json"},
    "payload" : '{"text":"' + text + '"}'
  };
  UrlFetchApp.fetch(url, options);
}

function test(){
  postSlack("これはテストです");
}


f:id:vaaaaaanquish:20170927165343p:plain
注意するとしたらpayloadは {"text": "hoge"} という内容のStringであるという事くらいか。

Slackの投稿フォームで@を押した際に出るサジェストにbotが追加されている事も確認する。

 

SlackからGASでリプライを受け取る

本来なら上記のAppでリプライを受け取れたり出来れば良いのだが、現状できなさそう。
一般的な Browse Apps > Custom Integrations > Outgoing WebHooks を使って受け取りを行う。

 

GAS側の設定


GASはdoPost()なるイベントハンドラがデフォルトで用意されているので、doPostを適当に書けばHTTPメソッドでPOSTされた内容を受け取る事ができる。GETされる場合はdoGETもある。
先程のコードに以下を追記する。

function doPost(e) {
  var message = "こんにちは " + e.parameter.user_name + "さん";
  postSlack(message)
}

Slackから受け取った内容からuser_nameを見て返すというシンプルなコード。
Slackの場合だとe.parameter.textで投稿内容を取得できますが今回はスルー。

 
上記を追記し保存したら、GASをWebアプリケーションとして公開する。

GASエディタ画面の上部から公開を選択、ウェブアプリケーションとして導入する。
f:id:vaaaaaanquish:20170927172638p:plain:h200:w200

プロジェクトバージョンを新規作成して、アプリケーションの実行者を自分に、全員が実行できるよう設定して公開する。
f:id:vaaaaaanquish:20170927173148p:plain:h200:w200

最初だけ許可の確認があるかもしれないので許可。

こんな感じで公開されたURLが出て来るので保存しておく。
f:id:vaaaaaanquish:20170927173413p:plain


GASの一番面倒くさいところは、この「プロジェクトとして公開する」ところにある。

ウェブアプリケーションとしてAPIのような形で公開していく場合、スクリプトの保存に加えて、上記の「ウェブアプリケーションとして導入」「プロジェクトバージョンを新しく作成」「公開」の手順を毎回踏む必要がある。
(スクリプトの保存だけして新バージョンとして公開してなかった〜という事が多々発生する)

僕は適当にバージョン1、バージョン2、…と命名しているけど、大体どっかで破綻してしまうので何かいい方法が欲しい…

 

Slack側の設定

自分のSlackチーム名を確認してappsに飛ぶ

https://自分のSlackチームドメイン.slack.com/apps

検索窓があるので Outgoing WebHooks を検索。
f:id:vaaaaaanquish:20170927171320p:plain

Add ConfigurationするとWebhock Integrationボタンがある画面に遷移するのでIntegration。

f:id:vaaaaaanquish:20170927174105p:plainf:id:vaaaaaanquish:20170927174139p:plain

 
それっぽい設定画面に遷移したら少し下にスクロールして、Integration Settingを行いSaveする。
f:id:vaaaaaanquish:20170927180319p:plain:h200:w350

URLは上部GAS側の設定時に取得したウェブアプリケーションのURL。

Trigger Wordは、Slack上の投稿の先頭を見て引っ掛ける単語で、カンマ区切りで設定できる。

test,bot,@,&

みたいに複数設定できるのだが、例えば@だと

@hoge こんにちは

が取得できない。
理由は@hogeとした場合、リプライやコマンド形式となり、リンクになるから。

リプライをcatchしたい時は、実際Botへリプライして右クリックでリンク取得し、URL末尾のIDを<@ >で挟む。
f:id:vaaaaaanquish:20170927181412p:plain

上記だとhttps://hogehoge.slack.com/team/U78NAL1QQ になるので <@U78NAL1QQ> をtrigger wordに設定しておけば良い。


詳しくは以下。
https://api.slack.com/docs/message-formatting


ちゃんとSaveする。


 
上記設定した上でBotに向けてリプライを飛ばせば返答が得られる。
f:id:vaaaaaanquish:20170927181858p:plain



 

- おわりに -

多分GAS使うならこれが一番楽です。

App上でOutgoing WebHooksも作れたら本当はもっと楽ですが…

一番ラクなのはGASを使わずにAWSに課金してLambdaでポチポチやる事だと思います(Python書けるし…)

あと少しだけGASで運用してたbotに関する記事を投稿すると思います。


 

簡易にSlackへPostする方法とPythonスクリプト

- はじめに -

Python機械学習スクリプトを回して終了した際にSlack通知欲しい場合がある。

SlackへPostする方法はいくつかある。

多分Incoming WebHooksで設定するのが一番楽。

数分でできるメモ


 

- Slack側の設定 -

自分が参加しているhogehogeチャンネルのcustomize-integrationsへ飛ぶ
https://hogehoge.slack.com/apps/manage/custom-integrations


Incoming WebHooksを選択
f:id:vaaaaaanquish:20170927153404p:plain


Add Configurationで新規設定作成
f:id:vaaaaaanquish:20170927153439p:plain


通知したいチャンネルやDMを選ぶ
f:id:vaaaaaanquish:20170927153546p:plain


次に進んだ所で表示されたURLにメッセージをPOSTするだけ
f:id:vaaaaaanquish:20170927153642p:plain


 

- Pythonスクリプト -

適当にrequestsモジュールとか使う
入って無ければpipで入れる

pip install requests
import requests
import json
post_url = "https://hooks.slack.com/services/T04………"

def post_slack(name, text):
    requests.post(
        post_url,
        data=json.dumps(
            {"text": text,
             "username": name,
             "icon_emoji": ":python:"}))

post_slack("自動ポスト", "これはテストです")


icon_emojiなどはよしなに。
これでこんな感じ。
f:id:vaaaaaanquish:20170927153921p:plain


 

- おわりに -

機械学習スクリプト終わった時みんなどうやって知るんだろ。

これ以上、特筆すべき事項はありません。


 

WebDBForum2017で登壇しました

- はじめに -

9月18日から9月20日までの3日間、お茶の水女子大学で開催されていたWebDBフォーラム2017に参加し、会社員として登壇した。

WebDB Forum 2017 第10回Webとデータベースに関するフォーラム

登壇では、自社のサービスについてと機械学習プロジェクトについて話した。

企業ブースに基本的には居る形でしたが、聴講もしたので少なめではありますが個人的に気になった発表をまとめておく。


 

- 登壇と自社ブース -

登壇では、機械学習関連の話をつらつらとした。

自社内でのプロジェクトの紹介に加えて、「機械学習はGarbage in, Garbage outであること」「学習データ作りと学習データを作る人の知識ドメインが重要であること」「支えるインフラや現行する基礎技術、周囲の理解、人が必要であるということ」などを加えて話した。

Garbage in, Garbage Out: How Purportedly Great Machine Learning Models Can Be Screwed Up By Bad Data [2017, Black Hat USA, Hillary Sanders]
機械学習: ダメなデータからはダメな結果しか生まれない – Naked Security
あなたの会社は本当に機械学習を導入すべきなのか? - bohemia日記


「明確な目的と現行するルールベースな基盤、それなりのインフラ環境がないと、いくら良いDBがあってもデータサイエンティストも雇う意味がないよ」辺りが伝われば良かったかなと思う。

あと自慢も含めて弊社はそれらが出来てますよという話しをした。

登壇資料は許可が出れば公開します。

※許可が出たので一部加筆修正の上で公開しました
speakerdeck.com


 

- 気になった発表 -

少ないが機械学習関連はとりあえず見た。

幾つか感想。

 

Learning from Bandit Feedback

招待講演。
最近流行りのバンディットアルゴリズムの説明とその例が紹介されていた。
(Maarten de Rijkeサンの英語発表だったので所々聞きそびれた…)

前回参加したSIGIR 2017でも 検索等でのバンディットアルゴリズムを利用したA/Bテストですごい売り上げ変わりますみたいな発表がなされていたし、PyConのrejectカンファレンスでもリクルートの方がバンディットの話をしていた。

完全にブーム。

講演では検索の他に、広告の配置や商品分類での例が示されていて、結果としてユーザ体験も売り上げもグッと最適化されるよねという感じだった。すごいぞバンディット。


 

「LIFULL HOME'Sデータセット」提供を通じた不動産テック分野のオープンイノベーション

LIFULLの清田さんの発表。

部屋データセット公開してますという話から、部屋の画像からDeep Learningで部屋構造を解析するとか。

情報学研究データリポジトリ LIFULL HOME'Sデータセット

大体SlideShareでLIFULLさんが公開してるいつものという感じ。
以下とか。
LIFULL HOME'Sにおける不動産物件画像解析

 
2日目のレセプションで清田さんと少し話す機会があり、不動産テックはユーザが長続きしにくい(引越しや購入で一区切り)だったり、フィードバックがなかなか得られない等が起因して難しい分野ではあると言っていた。

だが、その分少しの工夫や技術が環境を変えていくので面白い分野ではあるなと思った。

Deep Learningで部屋の解析情報をheatmapにして表示するやつとかすごい面白いなあと思いながらいつも見ている。あれ、どれくらいのデータが必要なんだろうか…


 

深層学習を用いた電子カルテ医療情報の多角的解析

論文:https://ipsj.ixsq.nii.ac.jp/ej/index.php?active_action=repository_view_main_item_detail&page_id=13&block_id=8&item_id=183361&item_no=1

電子カルテ医療情報から退院時の「転帰」の分類
(転帰:疾患・怪我などの治療における症状の経過や結果)

医療情報は数値と文字列なのでword2vec
(一応one-hotはダメという先行研究があるらしいが分散表現にした理由は質疑含めあまり良く理解できなかったが、一応Most Simillerで似た病名が出てきたりしていた)

MGFSとTop-Kを使って特徴選択 (各特徴のスコア算出 -> このスコアを使いながら多角的分析)
LSTM -> LSTM -> Softmaxで分類

特徴選択におけるMGFSとTop-Kの結果で評価し、その特徴量が分類においてどう重要かというのが一部分かっていた(この特徴量は他特徴量と混ぜると良いとか)。

SVMと比較して分類精度も向上していた
SVMの先行研究が多いのかな

Deepの結果の分析は割とこれから来るはずなので発展に期待


 

Dragon: A Distributed Object Storage @Yahoo! JAPAN

色んな検討の結果、フルスクラッチで独自のオブジェクトストレージ作りましたという話

多分この人↓
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring


ストレージをRAID通さずに個々に動作させて作るとか、AWSAPIをラッピングしているのでPythonで言うところのboto3のようなAWS謹製のパッケージから呼べる仕組みであるとか。

上のスライドと違っていた所では、速度等を丁寧に比較したグラフが幾つか示されていて良かった。

久々に「RAIDは遅いんで〜」と言ってる人を見た

「Dragon」と名付けているらしいけど、そういう文化なのかなYahoo…


 

LTとか他色々

色んなデータの話があって、Wikipediaを人手と機械学習クラスタリングした結果(「拡張固有表現+Wikipedia」データ ランゲージ・クラフト)や、色んな国が出してるオープンデータをちゃんと整形してまとめて地図と組み合わせてAPIとして公開(Spaada | 高精度エリアレポーティングサービス — microbase)とか。

あと一般社団法人 データサイエンティスト協会なるものがあることを知った。


 

− おわりに −

カンファレンスの規模感としては小さめに思えたが、中の人達や教授は「だいぶ巨大なコミュニティになった」と言ってたのでそうなのかも。
(大体300人くらいの参加者だし、人工知能なんとか系のカンファレンスはブームでデカくなり過ぎたので、あんまり体感で比較は良くない)


データベース界隈もビッグデータ機械学習の波が来ているらしく、登壇もポスターも機械学習テーマが相当数居たし、機械学習系の見知った人も居て挨拶した。

3日目が一番テクノロジーショーケースが盛り上がったっぽいんだけど、見れてないので残念。
まあ他の所で似た発表聞けるんだろうけど…


あとはブロックチェーンの話とか野球の分析(今回何故か3つくらいあった)辺りは、今まで適当に聞いてたので深めに聞けてよかった。


SIGIRの時も書いたけど、機械学習フレームワークでめっちゃ敷居下がったにも関わらず、目的設定やモデル設計、チューニングは経験がないと出来ないので、ちょっと他分野になったら手に余ってる感じがあった。
そういった所もフラットになっていくと更に面白そう。


登壇は結構好評だったのでありがたさです。
挨拶して頂いた方、また機会があればよろしくお願いします。
最近イベント系の感想記事多すぎてクソブログになりつつあるのでちゃんと勉強しよ。

お茶大って略すのはじめてしりました
f:id:vaaaaaanquish:20170918101558j:plain:h400:w300


 

SIGIR 2017に参加した

- はじめに -

先月、4日間に渡って東京の京王プラザホテルで開催されたSIGIR 2017に会社員として参加した。

SIGIR2017 – The 40th International ACM SIGIR Conference on Research and Development in Information Retrieval

参加に10万程必要な高額な学会であるが、弊社からは3人参加。

後の社内勉強会で情報もシェアしたので、個人的に気になったものを少ないけどいくつか出しておく。
(書くのが遅くなってしまい忘れた部分が多いので普段より少なめです…)


 

- Session -

大まかに見ると「Embbeding」と「Deep Learning」のお祭りという感じだった。
TF-IDFやword2vecは “Classical method” になっていた。

GloVe、Seq2Seq、Attention、CNN、End-2-End、Encoder-Decoder辺りがやっぱりホットワード。機械学習カンファレンスかというくらい機械学習の話を聞いた気がする。

あとはちらほらSolrの話を聞いた
 

Deep Learning for Extreme Multi-label Text Classification

Deep Learning for Extreme Multi-label Text Classification

Targetは巨大なラベルコレクションからクラスにラベルサブセットを割当るタスク
(例えばWikipediaなら「ポテト」に対して
「ナス属」「根菜」「南米産の作物」…)

こういったタスクは、ラベルコレクションが巨大になると所謂分類では難しいので、ラベル間の相関とかを利用しながらラベル付けしていく手法が良いのではという発表。


Extreme Multi-label Text Classificationでは、現状以下のような手法がある。

  • target-embeddingとtree-based ensemble
  • Deep Learning
  • max-margin method

SLEEC[K Bhatia, NIPS 2015] のようにラベルを線型部分空間投影で有効数削減して、減らしたラベルをmainラベルとしてラベル付け、それらに付随するtailラベルをpairwise distancesで求める方法(target-embedding)。

MSのFastXML [MSR, Y Prabhu, KDD 2014] のように木構造(RF)でginiなどを使わずnDCG(normalized discounted cumulative gain)を直接最適化していく方法(tree-based ensemble)。
Github: https://github.com/Refefer/fastxml, https://github.com/fastxml/fastxml

DeepNetを工夫したFastText [Facebook, 2016]、Kim-CNN [Y Kim, EMNLP2014]、Bow-CNN [Rie Johnson, ACL2015]辺りの手法(この辺はググると解説記事が出てくる)。

PD-Sparse [IEH Yen, 2016]などにおける、ラベルごとに重み行列を設定し線形分類器を回してmax-marginを出していく方法(この辺: http://www.cs.utexas.edu/~xrhuang/PDSparse/)。


既存の中でもword2vecで生成したベクトルをCNNに突っ込むCNN-Kimを工夫した「XML-CNN」を提案しますという内容だった。図で示すと以下。

f:id:vaaaaaanquish:20170917125344p:plain:w350:h400
社内勉強会で使ったプレゼン、各論文から引用

やっていたことは以下

  • Dynamic max pooling
  • sigmoid output layer
  • Hidden Bottleneck Layer

普通のMax poolingだと長い文章列にはあまり良くないので、レイヤーをさらにチャンクに分割して動的にMaxPooling。
OutputにSoftmax使うのは重いし学習に良くない(最近割と話題になりつつある)。
隠れ層を追加して圧縮すれば精度も上がって出力のsigmoidの計算も早い。


ResultはWiki-500KとかAmazon-670Kで挑戦しているが、どの既存手法よりも精度良く出ており割と効果はありそうだった。

シンプルな改善なので、機械学習実務レベルだと既にやられていそうだなあと思いつつ、今後こういった「ビックデータにおける自然言語における自動ラベル付け」というのはビジネスにおいても非常に重要になりそうだし聞いてよかった。

 

Max-Margin Based Embeddings for Entity Retrieval

MEmbER

エンティティ検索において、SemanticWebのような構造表現(Structured ER)も語彙表現(Document-centric ER)もどちらも大事だし使いたいという内容。

A Three-Way Model for Collective Learning on Multi-Relational Data [Nickel ,ICML11]でいうところのknowledge graphベースなRESCAL。その拡張のTransE [Antoine Bordes, NIPS, 2013]。(yamaguchi先生記事: TransE [NIPS'13] を実装(と実験再現)した - でかいチーズをベーグルする)
あと古典的なINEXやTREXをDocument-centric ERとして紹介。

word2vecやGloVeといったWord Embeddingの紹介をして、TransEとGloVeを合わせたEECSモデル [S Jameel, 2016]の拡張を提案。

f:id:vaaaaaanquish:20170917132217p:plain:h250f:id:vaaaaaanquish:20170917132340p:plain:h250
社内勉強会資料、各論文から引用

数式を見て分かるようにkernelを使っており、分離平面ごとに検証。
計算時間が増加してもquadなkernelを使ったほうが大体結果が良いという内容だった。

また、エンティティ検索結果として見栄えの良いものが出ていただけでなく、ある程度短めな文章で検索した場合にも結果が得られている所が印象的だった。


 

- Poster -

ポスターセッションは大体見た
ここでもDeepNetとベクトル化の手法が多々あった

Cross-Device User Linking: URL, Session, Visiting Time, and Device-log Embedding

Cross-Device User Linking

タスクとしては、ユーザが複数デバイスから見たWebページ情報から同一人物化どうか判定するというもの。

f:id:vaaaaaanquish:20170917135710p:plain
論文から引用

Embeddingの方法としてURL Embeddingを使っていてちょっと面白いなと思った。
Graph EmbeddingやらNode Embeddingやら本当にIR系だと有益そうだしブーム。

 

SogouT-16: A New Web Corpus to Embrace IR Research

https://www.thuir.cn/group/~yqliu/publications/sigir2017Luo-SogouT.pdf

中国でWebページのデータセット(HTMLやCSS)を公開しているよというポスター

f:id:vaaaaaanquish:20170917140204p:plain:w300:h300

セッションでも「中国の複数の動画サイトをまとめたWebサービスがあってそこからデータ集めたよ」みたいなのがあって、中国スゲーってなった。

分析屋としてというよりは、個人でスクレイピングの色々をやっているので、スクレイピング周りの研究が進むためにもこういったデータセットの普及が進んでほしいなと思った。


 

- おわりに -

ニューラルネットなら色んな特徴量投げ込める上、分類からRankNetのようなモデルもあるので研究の幅は広がっていそうだが、実際に「Deep」とタイトルにあるセッションを聞きに行くと「実は4層のネットワークでより深いのはこれから〜」みたいなのが多々あり、フレームワークによって誰でも触れられるものになったとは言えDeep Learningを持て余してる人の方が多いというのが現状っぽいなと思った。

CNNで特徴量生成器を作ろうというのは実務だとマシンリソースから総合的にマイナスになったりするし、入力に自由が効くというのは別にNNじゃなくても〜とちょっと思う場面もあった。Cross-Convolutionは確かに便利だけど。

あとアウトプットにおけるワードクラウドの多さがすごかった。それっぽさ。


日本開催である事と機械学習ブームもあってか参加者は882人(前年比53%UP)らしく、Yahoo!楽天KDDI、スマートニュース、Cookpadといった機械学習系でも割と尽力している企業の日本人と沢山話す機会があった。後は中国を筆頭にアジア系の方々。

Banquetでは、寿司職人がその場で握るブースがあったり、開幕は鏡開きでスタート、かき氷、綿あめのブースといった和意識な内容でなかなか楽しかった。しましま先生にも挨拶することができた。
いつもの:しましまのSIGIR2017まとめ - Togetterまとめ

パっとググった感じだと、ちゃんと技術踏まえて行ってきた感想記事を上げてるのは以下くらいだった。

 
プレゼンはまだ聞けたけど、ポスターで質問したいという時に英語力が低すぎて「オーイェーアハーン」くらいしか言えないのでつらかった。
せめて自分の疑問を言語化できるくらいにはなろう…
 
あとカンファレンスの感想をブログに書くならその週のうちに書かないと死ぬ。
はっきりわかった。来週はWebDBに参加、登壇するので頑張ろう。

検索とMLのブームにおいていかれないように努力したい
f:id:vaaaaaanquish:20000101090031j:plain:w400:h300


 

PyCon JP 2017に参加しました - 後半 #pyconjp

- はじめに -

PyCon JP 2017の2日目(正確にはtutorial含め3日目)を聴講してきた

https://www.pycon.jp/


1日目は昨日PyCon reject Conference含めて投稿した



 

- Keynote -

https://pycon.jp/2017/ja/talks/keynote/

Pandasのコミッタの堀越真映さんの登壇

Pandasの概要と、Pandasコミッタになるにはという話
OSSと一緒でプロダクトの方向性を決められたり、issueを解決できたり、ユーザビリティを気にかけられると推薦でコアメンバーになれるとの事(1年は活動必要らしい)
また、コミュニティの品質なども気にかけられると良い

Pythonの話というよりOSSという概念やコミュニティの説明という感じだった
もっと気軽にOSSやっていこうよというのは本当だし良いセッションだった


 

- Reactive Programming on AWS Lambda in Python -

https://pycon.jp/2017/ja/schedule/presentation/6/


Lambdaに関するデプロイやapexを使ったデプロイまで
https://github.com/apex/apex

boto3は流石に知ってたけど、ログ用のalogとかデプロイのZappaとかは知らず、Lambda力もうちょっと上げれるなってなった
https://github.com/keitheis/alog
https://github.com/Miserlou/Zappa
仕事の方でも自動デプロイ進めたいなあ…

あとcoconutsとPythonクイックソートの比較とかやっていて、大胆なcoconuts宣伝だな…ってなった


 

- The theory of Serverless development by Python -

https://pycon.jp/2017/ja/schedule/presentation/30/

よくあるサーバーレスの大まかな説明(FaasとSaaS)
結局サーバーレスもオンデマンドなコンテナが動いてる訳だからオーバーヘッド気にしましょうとか、イベント駆動便利よとか。あとはAWSの説明
 
会社に入ってからAWSでマイクロサービス(ピタゴラスイッチ)してたけど、本来1つのサーバとMySQLで完結していたものが分散するわけで、やっぱり監視の問題とか運用コストがそれなりにあって、どっちが良いのかぶっちゃけみんな悩んでるんじゃないのという感想だった。単純計算で評価しにくいしTPO


 

- 機械学習におけるデータの再現性について -

https://pycon.jp/2017/ja/schedule/presentation/34/

資料はアレされている


機械学習のデータを再現性を保ってどうやって保存するか、そのためのフレームワーク公開してますという話

akagiというらしくクックパッドでも使われているとか
GitHub - ayemos/akagi: Codenize your datasources.
先行だとGit LFSとかData Version Controlとかがあるとの事で、どれも使ってみたい


僕はbohemiaサンの以下の記事が今年随一好きで、データの取り扱いってすごく大事なんだよと声を大にして言いたい
あなたの会社は本当に機械学習を導入すべきなのか? - bohemia日記
これもうちょっと広まってえらいひとまで認知されて欲しいし、akagiに期待というアレ

再現性を重視しすぎると時系列でどんどんデータの入力分布が変化していく場合につらくなってくるので、この辺は色んなパターンがあると良さ


僕はAWSのRDSのスナップショットやEC2のAMI取っておいたり、Jupyterにコツコツ残していくオタクなのでツール作りはすげえなと思います


  

- ディープニューラルネット確率的プログラミングライブラリEdward -

https://pycon.jp/2017/ja/schedule/presentation/36/

機械学習界隈Twitterで見ない日はない@yutakashinoサンの話


Edwardの話だったはずが大半が基本的なNNとベイズと、Deep LearningとBayesian Deep Learningの大まかな概要みたいな話だった気がする。一番基本的なNNの更新式とかベイズ則の式から、各ベイズ推定のアルゴリズムが出てきて、PyConというより機械学習勉強会みたいな感じだった

Edwardが出てきたのは終了前5分だった

マジでPythonの話は出てこなかったけれど、30分で全部話した(話しきったとは言っていない)とは思えないくらいスライドが充実しているので、機械学習屋は復習がてら見ると良さげ

ベイズ推定周辺を5分で説明で説明してて笑った

そういえばだけど、NIPS 2016のやつ http://bayesiandeeplearning.org/ は結構話題になったけど後続が出てきてるのか気になる
後で暇があれば調べて追記したい


 

- Pythonをとりまく並行/非同期の話 -

https://pycon.jp/2017/ja/schedule/presentation/35/


いわゆる並行は並列を包含しているイメージで、どっちとりましょうかという話

Python3.2から追加のfutures便利でthreadinf, multiprocessingより使いやすいらしい
じゃあ幾つか例を示して行きましょうという感じで、スライドがとても良いので必見
非同期ライブラリの紹介も丁寧で、futuersからasyncioの解説も分かりやすかった
ここ最近聞いた非同期の話では随一丁寧でステキ

個人的にも非同期処理の取り扱いに悩んでおり非常に良かった
思わずトークアワード投票しました


 

- 早稲田大学グローバルソフトウェアエンジニアリング研究所 -

せっかくなので大学のトークセッション聞いた
Pythonと教育、Pythonプログラミング初学者における環境と特徴分析しました」という内容
プログラミングは教育効果の定量的な評価が乏しいからそういう研究を進めたいとの事

6属性に分類していて

  • ゲーム感覚に遊んで覚えるソフトウェアタイプ
  • Scratchみたいなビジュアル言語・環境
  • 電源不要のアンプラグなツール
  • ボドゲみたいなタンジブルツール
  • マインドストームみたいな物理ロボット
  • その他

でそれぞれ評価して、評価軸も扱いやすさやどういう所を重視しているかみたいな基軸で丁寧に取っていた
研究が進むとプログラミング教育も進むかも

Blockly とか コードガールこれくしょん とかが紹介されててあ〜ってなった

Pythonは傾向として「Webでできる」「協力、連携が意識されている」「問題解決型かつ自由度が高い」ものがおおいらしい

逆にクリエイティビティ系(ゲームを作って動かすまでやってみようみたいなアレ)がソフトウェアとして固まっているものは少ないと言っていた
う〜ん、確かに思いつかない。大体クリエイティブになるともうMinecraftの自動化するとか、GUIゲーム作るとかに一気に飛んでるイメージはありますね

今後の論文発表等に期待


 

- おわりに -

今回はまさかのshima__shima先生のツイートを偶然見て、チケットを譲って頂く形に。深く感謝
来年は登壇で参加できるといいなあ

 
あと前年度はモノタロウ社がPython2系を盛り上げましたが今年は…
エンジニア一同衝撃 Python子ども向けワークショップにやってきた小2開発者のさりげない一言 #pyconjp - Togetterまとめ

 



( ;∀;) イイハナシダナー

 
個人的にはReject Conferenceの方が実務寄りというか現場感あって面白かったように感じたけど、広く聴講してもらうというのは難しいんだなあと。
というかRejectよりPythonの話をしない発表も幾つかあったし、全然採用基準わからんってなった。

ご飯も美味しく非常に良い2日間でした

 
厚さで人も○せる犬
 

ベイズ統計モデリング: R,JAGS, Stanによるチュートリアル 原著第2版

ベイズ統計モデリング: R,JAGS, Stanによるチュートリアル 原著第2版



 

PyCon JP 2017に参加しました - 前半 #pyconjp

- はじめに -

PyCon JP 2017の1日目(正確にはtutorial含めると2日目)を聴講してきた

https://www.pycon.jp/

2日目も出るけど話長くなりそうなので分割

先日、PyCon JP Reject Conferenceなるものにも参加してきたので冒頭で少しだけ触れておく


  

- PyCon JP Reject Conference -

PyCon JPにリジェクトされた内容を飲みながら発表しようという会(非公式)

https://techplay.jp/event/630686

倍率高かったもののリジェクトの理由を当人に聞いていくと大体以下のどれかだった

  • Proposalを適当に書く
  • Pythonの話をしない
  • ニッチすぎる内容にした

中でも「Proposalを書いてる時がやる気の頂点」みたいな話が「わかる」ってなった
あと「みなさんモチロン○○使ってますよね!」と聞いてシーンとなるやつはリジェクトされるんだなあって感じだった(いや、PyConJPも十分ニッチな発表あったけど…)

ニッチな分、今後使うか分からないけど面白い知見が得られてよかった
Recruitの機械学習の話とかErrbotの話は今後も使えそう

あと、登壇者が私の会社の後輩と同じ研究室という現象があって、世間狭いし下手な事言わないようにしないとなって思った
私も来年PyCon出たいと思っているけど、来年もリジェクト沢山出そうだしまたやってほしい

詳しくはTogetter
PyCon JP Reject Conference 2017 - Togetterまとめ


 

- 野球を科学する技術 -

https://pycon.jp/2017/ja/schedule/presentation/15/

なんかもう界隈では有名人らしい人っぽかった

bradfordなる分析基盤をDockerにして公開したという話
(マネー・ボールのチャド・ブラッドフォードから命名したらしい)

中身はscrapyやそれらを回すためのAirflow、MySQLやらの紹介で、スクレイピングの話沢山聞けるかなと思ったけどscrapyのいつもの図が出て終わったのでちょっと残念だった

scrapyのデフォルト設定は攻撃レベルなので危険という話をしていたのは良かった
これもうちょっと広まって欲しい

scrapyならべつにAirflow使わずScrapy Cloudにモデルアップロードして回すのとコスト変わらないのではと思いつつ、自前のSQLとかお手製の色々を使いたい部分もあるだろうし、この辺はTPOだなって感じだった。Reject Conferenceでもluigiの話があって、「luigiのユニットテストつらくない?」って思ったんだけど、やっぱ結論AirflowやluigiはTPOだなって。金に余裕があるならAWS


wOBAやwRAAなる野球の分析のための指標の紹介もあって、これは理にかなっていそうだし知見にはなったけど、人生で使うことはn…

割とWikipediaが丁寧だった
https://ja.wikipedia.org/wiki/WOBA_(野球)

アメリカ野球学会(SABR)が色々やっているらしく、歴史も長いので参考になりそう
https://ja.wikipedia.org/wiki/セイバーメトリクス


 

- Using machine learning to try and predict taxi availability -

https://pycon.jp/2017/ja/schedule/presentation/55/

シンガポールは政府がタクシーの位置スナップショット情報や空席情報をAPIとして公開してるらしく、それらを使って分析しましたという話。
シンガポールスゲー…(日本はなかなかこういうの発展しない感)

ここで見れる
data.gov.sg


色々はGithubで公開されていたので気になれば
GitHub - hari-allamraju/pycon-talk-taxidata: Repo for my talk on machine learning with taxi data at PyCon APAC 2017 and PyCon JP 2017
script等へのリンクもある

実分析する中でのRDDとDataFrameでやった比較をしていて「JVM上ならDF早いよ!」という主張だった。好み〜


 

- Kivyによるアプリケーション開発のすすめ -

https://pycon.jp/2017/ja/schedule/presentation/20/

スライド:PyconJP2017 Kivyによるアプリケーション開発のすすめ

私は機械学習で画像の学習データ見る基盤程度にGUIアプリ作ってたレベルで、PyQtしか使ったことなく気になって見た

色んなGUIが紹介されてて、iOSもPython3系対応中らしい

一通り聞いたけど、まあPyQtで良いかなあという感じ…
ライトユーザだからKV languageがネックだけど、ちゃんとアプリとして動かしてくとなるとファイルが分割されてる方が嬉しい事あるだろうなと思う

KV languageはCSSみたいなもんでビュー画面作る色々って紹介されていて、動的なコーディングツールもあるらしい
kviewer:kivy/kviewer.py at master · kivy/kivy · GitHub
(kviewerでググるサイボウズのkintone連携サービスが出てきて、命名も大変だなって…)


最後にちょっとデモがあったけど、アニメーションはカッコよかった!(手前味噌)


 

- Why you should do text analysis with Python -

https://pycon.jp/2017/ja/schedule/presentation/5/

まとめると、「自然言語正規表現、パースから生成、機械学習まで全部Pythonでやりたい!機械学習の発展もあるしチャットボット作ったりできて人の仕事も減るから自然言語処理やろうぜ!APIとかフレームワークのおかげで機械学習使うだけならSuper Easyになったし!」みたいな感じ(わかる)

データはどっから取ってくる?オープンデータ、APIスクレイピング、アプリのフィードバック、ebooks…色んな所にあるよね。テキストデータは時に「garbage in garbage out」だから前処理しないとダメだよね。MLならこんなライブラリ使うと良いよね。
という話が展開されていた


 

- Pythonによる文章自動生成入門 -

https://pycon.jp/2017/ja/schedule/presentation/21/

スライド:Pycon jp2017 20170908_doc_ota

登壇者曰く、論文読みながら聞いてくれみたいな感じだった


後ろは立ち見、通路に座って聞く人まで出る程の盛況さ
最近話題だしタイトルがキャッチーだったからなという印象

スライドの最初辺りで「GANとかで出た結果の著作権に関する議論はあまり出ていない」と出ていたけど、「機械学習 著作権」みたいなレベルの日本語でもググったら沢山資料出て来るし、色んな学会で議論されている内容なので機械学習屋としてはそこだけ修正したかった
権利周りはナイーブだし、真面目にやってる人達が居てちゃんと議論を進めていますよい


発表自体はほぼ学会発表で、オリジナリティのある文章を生成するためにn-gramで”文章の言い換え”を色々検証して評価してもらったという話だった
”言い換え”は「品詞の変換」「能動態、受動態の変換」「2つ以上の単語を1つにまとめる」の3種類と定義していた

何となくだけど、日本語の言い換えって「比喩」とか「描写」とかのレイヤーもあってワンパンとはいかなそう
(Pythonの話はほぼ0だったし、同日にテキストアナリティクスシンポジウムあったのでそちらの方が活発に議論できて良かったのでは…)

最後の文章自動生成のためのGANというのはすごい気になったので、研究的な意味では今後の進展をウォッチしていきたい


  

- 健康診断と懇親会 -

4時から病院に行く用事があって一度渋谷に行ったので4時台のプレゼンは聞けず

LTワンチャンあるかなと思ったけど、帰ってきたらクロージングで懇親会の時間に

- おわりに -

最近機械学習の話ばっかり聞いてたし、Pythonの話聞きたいなと思ってたけど結局データ分析とか機械学習の話を聞いてた。明日はもうちょっとPythonの話を聞ければいいな

「お久しぶりです〜」みたいな会話が所々でなされていたり、登壇者が界隈で有名とかだと称えるツイートが見られたけど、コミュ障には無理ってなった。もう少し顔を広げる努力をしたい…

 
あとモノタロウのPython2系話についてはみんなこれ読んで欲しい
エンジニア一同衝撃 Python子ども向けワークショップにやってきた小2開発者のさりげない一言 #pyconjp - Togetterまとめ

 
最後にまだこれ金曜の平日なのに結構会場混み混みで電源も厳しく「明日一体どうなるんだ…」という気持ちでいっpy