はてなを退職しました
正式には2017年10月15日付での退職ですが、9月29日が最終出社日でした。
はてなには2012年4月に新卒で入社して5年半、濃密な時間を過ごさせてもらいました。大変お世話になりました、ありがとうございました。
はてなでの5年
はてなでは、アプリケーションエンジニアとして5年半過ごしました。はてなブログやはてなブックマーク、Mackerel、Miiverse、BrandSafe はてな、家電会議、PINGAなどなど、C向け自社サービスから、B向け自社サービス、受託まで、多くのサービス開発に関わりました。はてなのエンジニアの中でも関わったサービス数は多い方でいろいろと経験させてもらいました。
最初の2年くらいは、はてなブログ、Miiverse、はてなスペース、Mackerelと、いくつかのプロジェクトに関わり、エンジニアとして少しずつ成長させてもらいました。この2年でコードの品質やWebの知識など、多少はまともなエンジニアになれたんじゃないかと思います。
その次は、はてなブックマークで2年くらいテックリード*1(当時はそういう役割はなかったけど)として開発しました。ちょうど10周年のタイミングだったので、10周年企画をやり、そのいくつかを担当しました。中でも、トピック機能や関連記事機能は開発していて楽しかったですし、YAPC(前夜祭)やはてなエンジニアセミナーでも発表してよい経験になったなと思います。
- はてなブックマーク10周年 - はてなブックマーク
- YAPC::Asia Tokyo 2015の前夜祭で発表しました - skozawa's blog
- Hatena Engineer Seminar #5で関連記事レコメンドエンジンの開発について話しました - skozawa's blog
最後のほうは、家電会議のリリースをしたり、PINGAのリニューアルをしたり、BrandSafe はてなのリニューアルをしたりしました。
- 新サービス「家電会議」を公開しました - はてなブックマーク開発ブログ
- リニューアルのお知らせ - ピンガのスタッフブログ
- PythonによるBrandSafe はてなのリニューアル - Hatena Developer Blog
他には、シニアエンジニアをさせてもらい、特に何かをしたわけではないですが、エンジニアのキャリアを考えたり、組織について考えたり、少し違う角度からエンジニアについて考えれたのはよかったです。
はてなに入ったときはまだ上場前で、今より人数も半分くらいだったので、そこからだんだん会社っぽくなっていくところを中からみれたのは良かったなと思います。といっても、上場で変わったことはそんなになく、総じて働きやすい環境で、周りの人たちも優秀だし、技術に対する理解もある会社なので、はてなで働けて良かったなと思いますし、Webアプリケーションエンジニアにとって魅力ある会社だと思います。
次の5年
5年というのを1つの大きな区切りと考えていた(博士 前期+後期の期間という意味合い)ので、昨年末あたりから、次のことを考え始めました。
5年前を振り返って、やりたいことが変わったかというと、あまり変わっていなくて、研究成果(最新である必要はない)をサービスにいれてエンドユーザに届けたい、それにより新しい価値が提供できるといいなと思っています。あと最近は、テキスト・データとユーザの行動・思想をつなげることに興味があったり、文章の質や面白さに興味があります。
これをはてなで出来ているかというと、少しは出来ていますが、専門性(自然言語処理)を活かすよりは、純粋なWebアプリケーションエンジニアとして働くほうが貢献度が高いので、やりたいこととビジネスモデルがあまりマッチしていないなーという気がしていました(あくまで主観ですが)。アプリケーションエンジニアとして、はてなに貢献していくイメージはある程度つきますし、数年後には今の状況も変わりそうにも見えるので、はてなに残るという選択肢もありましたが、自分なりの1つの区切りだったのでわがままを言って、別の環境に行かせてもらうことにしました。
ということで、次ですが、2017年10月16日より Gunosyのデータ分析部で働かせてもらいます。
「情報を世界中の人に最適に届ける」という理念や、データ駆動でありデータ分析が強いこと、また最近ではクリックベイト対策などの研究開発もしていることなど、はてなとはまた違った環境なので、いろいろと楽しみです(もちろん新しい環境への不安もありますが)。
PyCon JP 2017に参加した
PyConJP 2017に参加してきた。トークを応募していたので、本当はトークできたらよかったけど、落ちてしまったので、聴講のみの参加。
聞いてある程度覚えているものを。
- OpenAPIを利用したPythonWebアプリケーション開発
- slide
- OpenAPIとツール、事例について紹介していて、Swagger使うと便利ですという話だった。bravado-core というライブラリだと、フレームワークに依存せずにOpenAPIを使えてよいとのことだった。
- あんまりここらへんのツール使えてないから、とりあえずフレームワーク依存でもいいから、flask-restful-swagger-2.0 とかあるようなので使ってみたい。今から使うのが、2.0でいいのかはわからないけど。
- SREエンジニアがJupyter+BigQueryでデータ分析基盤をDev&Opsする話
- slide
- データ分析基盤とデータ分析の文化についての話。いろんな要望に応えていったら、システムが複雑になり、エンジニアチームの負荷も大きくなってしまったので、モデルとビューをちゃんと分離して、分析基盤を作った。ビューは部署ごとに適切なものを用意。
- 今回のPyConJPで自分が聞いたなかでは一番面白い発表だった。現実と向き合いつつ、着実に分析基盤とそれを活用する文化を作っていくすごくいい話だった。
PyConJPは3年ぶり2度目の参加。思ってたより初心者向けの解説的な発表が多かった気がする。
言語処理学会に参加した
筑波大学であった、言語処理学会第23回年次大会に参加してきた。参加したのは2日目と3日目。
聞いてある程度メモをとれたものを残しておく。徐々にメモするの疲れてきて3日目のはあまりメモとれてない。
- 『現代日本語書き言葉均衡コーパス』への情報構造アノテーションの構築
- クラウドソーシングによる関係知識のアノテーション
- XとYにおける活性化関係(促進、抑制)をアノテーションする。Xを固定して、Xに対して促進する、促進させる、抑制する、抑制されるという4つの関係となる、体言もしくは用言を文書中から選択してアノテーションする。クラウドソーシングを利用してアノテーションするが、分類のようなタスクとは異なり、完全一致ではないため、ダミーの質問を利用した単純なクラウドワーカーの見極めができないため、別のページに遷移させて、アノテーションの文字単位の一致度をみて閾値以上のアノテーターには正解のパスフレーズを提示するというアプローチをしている。
- 部分一致とか、複数解が許容されるようなタスクになると、当たり前だけどクラウドソーシング使うのも結構大変なんだなと感じた。体言、用言混ぜてやっていたけど、一旦、体現だけにして問題を簡単にしてやってみてもよかったのかなと思った。
- PDFAnno: PDFドキュメントのための言語アノテーションツール
- Simple PPDB: Japanese
- 難易度を付与した大規模な辞書を生成。難易度が4段階、6段階で付与されている辞書の語を使う。難易度を3段階に簡単化して学習データとし、頻度、文字種、単語長、CBOWなどを素性として利用して7割程度の精度で57万語に対して難易度を付与した。この辞書と既存の言い換え表現辞書を利用して、文を平易化した。言い換え表現辞書にノイズがあるため、誤ることもあるが、言語モデルと併用すればよくなる予定とのこと
- 公開されているらしいし、大規模な難易度辞書は使ってみたい。初心者単語はほとんど既存の辞書にカバーされているらしく、辞書外の単語の性能は高くないとのことだった。既存の辞書の難易度って教科書とか教育がベースになってると思うけど、特定分野の難易度の判定もできるのかが気になる。
- データ拡張による感情分析のアスペクト推定
- 分類問題にLSTM, CNNなどを適用しようとするときに、データサイズが少ない問題をデータ拡張により解決しようとした場合に、どのような拡張の仕方がよいかを実験したもの。類似度、シソーラス、ルールベースを試し、データサイズを同じにした場合はシソーラスの性能がよかったという結果。
- ルールベース、シソーラスだと文脈は壊れないが、拡張される数には限度がある、一方、類似度は文脈は壊れるが、ルールベース、シソーラスよりもサイズを大きくできる。実験ではルールベースに合わせて、3.5倍くらいのサイズでやってシソーラスが良い結果となっていたが、類似度で10倍のデータサイズにしたほうが結果がよくなっていた。文脈守ってちゃんと作るよりも、多少文脈壊れてでもとにかくデータサイズ増やしたほうがよいということなのかな...もちろん、解きたい課題とアルゴリズムによるんだろうけど。サイズごとの性能をグラフ化し、サチり具合みれるとよかったなと思った。
- キーワードに基づくニューラル文生成のためのリランキング
- 動詞1つと名詞2つの3つのキーワードから文を生成する。Encoder-Decoderだと未知語に対応できないので、Propositional Unknownモデルを利用。生成した文をJaccard係数でランキングすると、同じ単語を複数出力する文を高く評価してしまうので、重複単語を考慮したランキング手法を使う。
- 必ず3つのキーワードを含むという制約にしてはダメなのかなと思ったけど、言い換えてよい文が生成されるならよいのかな。キーワードから文生成できると要約とかでも使えそうでよさそうだなと思った。
- テーマをもつ観光地グループの自動生成
- 観光地+都市名、観光資源+都市名で検索し、固有名詞を抽出、共起頻度を計算することにより観光のテーマを抽出する。テーマとテーマに関連する観光地グループを生成。
- 手動でNGワード用意したり、表記揺れに対応したりしていて大変そうではあったけど、こういうのをブクマの地域ページでできるといいのかなと感じた。
- Sentiment Analysis with Eight Dimensions for Emotional Chatbots
- りんなとの会話を感情分析した話。感情は8カテゴリ。8カテゴリ1000語(顔文字も含む)を用意し、Character-level RCNNで学習。
- りんなに対する発言と、りんなの発言を感情分析していた、割合をちゃんと覚えてないけど、りんなの発言にも怒りが1割程度あらわれていて、りんなは優しいとは限らないらしい。
- 賛否表明パターンと行列分解に基づく賛否モデリング
- レビューテキストの書き手の評価視点に対する評価点の推定
- 日本語における筆者の性格推定の取組み
- Twitterの発言から性格を推定する。正確はビッグファイブ理論というのが有名らしくそれを利用している。
- すでに公開されているのでやってみると面白そう。
- 単語分かち書き辞書 mecab-ipadic-NEologd の実装と情報検索における効果的な使用方法の検討
- neologdにどうやって新しい単語を追加しているかという話。ベンチマーク問題を作成して、性能を測りつつコスト調整をしながら、新しく単語を追加したときに既存の単語分割がおかしくならないように調整しながら追加をしている。検索ではneologdだけを使うのではなくて、他の辞書も使ったインデックスも用意して重みづけをしつつ検索する。
- 辞書情報と単語分散表現を組み込んだリカレントニューラルネットワークによる日本語単語分割
- RNNによるBIOタギングをして単語を分割する。RNNの学習時にunigram, bigramといった表層情報だけでなく、対象の文字から始まる(終わる)単語を辞書から検索して素性として利用する。
- 分散表現を用いた語の上位下位関係の学習―Lexical Memorizationの緩和―
- 上位語の頻度にばらつきがあるのと、関係性を学習してくれず、特定の上位語を学習してしまう問題に取り組む。 上位語の頻度が偏らないようにして学習 。
- Lexical Memorization 知らなかったけど、本質的な課題を解こうとしていて面白かった。ちゃんと論文読んでみよう。
- 定量調査のための意見調査コーパス構築への取り組み
- 不満買取センターを作って、不満を書いとる。単語レベルだとわかりづらいので、格関係を取り出し、不満調査のサポートをする
- 今後ビジネスにつなげていくらしい。どのくらいのお金かかったのか聞けばよかったな。
- 招待講演 : 認知言語学---言語科学の静かなる革命
2年ぶりの参加、久々の学会だったけど楽しかった。文生成の現状をあまり知らなかったので、Encoder-Decoderやその派生のモデルについて知れたのはよかった。気になるものの論文を事前に読んでいけるとよかったけど、できなかったので、気になったものについては論文も軽く読んでみよう。
来年は岡山での開催、微妙な距離感。
論文メモ: Linguistic Benchmarks of Online News Article Quality
ACL2016 の論文 Linguistic Benchmarks of Online News Article Quality を読んだのでメモ。
自分がやってみたいと思ってることに近いことをやっていて面白い。
概要
オンラインニュースの質を測れるかを検討した論文。質という1つの指標で表すのではなく、質に関係する14の指標を用意して評価する。14の指標に対して、専門家がニュースに対して5段階評価でそれぞれ点数をつけたコーパスを作成。14の指標と質との関係を分析し、ベンチマークとして質を予測できるかを調査。
質を測るための指標
5カテゴリ、14の指標を用意。
- Readability: 読みやすさ
- Fluency: 流暢さ、文が意味的につながっているか
- Conciseness: 簡潔さ、冗長でないか
- Informativeness: 情報量
- Descriptiveness: 描写性、タイトルが内容をどの程度表しているか、釣りタイトルじゃないか
- Novelty: 新規性、平均的な読者が知らない情報が含まれているか
- Completeness: 網羅性、適切な情報量か、満足できる情報量か
- Referencing: 参照性、外部ソースへの参照がどの程度か
- Style
- Formality: 形式性、ガイドラインに沿っているか、句読点や文法のルールに従っているか
- Richness: 豊かさ、語彙が多様で面白いものか
- Attractive: 魅力的なタイトルか
- Topic
- Technicality: 専門性
- Popularity: 需要、記事の内容に興味がある読者の数
- Sentiment
- Subjectivity: 主観性
- Sentimentality: 感情性、どの程度ポジティブ、ネガティブか
- Polarity: 極性、ポジティブかネガティブか
コーパス作成
Yahoo! Newsから記事をクロールしてきて、15ジャンル1043記事を収集し、その中からサンプリングして561記事を抽出。561記事に対して、10人の専門家が14の指標と質に対して5段階評価する。1記事は専門家の中の1人と著者の中の1人によって評価される。アノテーションの質を保つため、1日10記事までに制限。一致率は62.1%、1ポイント差以内は65.5%、2ポイント差以内は96.6%
分析結果など
分析結果として、completeness は質と相関性が高い、Polarityは相関性が低いことが分かる。
Generalised Linear Methodを利用して、14の指標を使って質を予測した結果、Completeness, Fluency, Richnessが質に影響が大きかった
感想
最近、文章の面白さについて考えていたけど、結構自分が考えていた要素と似ていて、おもしろかったし、ちゃんと研究したくなった。関連研究にも面白そうなの多いし、読んでみたい。あとは、アノテーションの質のために、1日10記事までに制限するのはおもしろいなと思った。
2017年目標
今年の目標を考えた。
- 手を動かす、行動する
- 去年は考えることが多い1年だった。それはそれで視野を広げられた気がするのでよかったけど、何もできなかった感がどうしても出てくるので、今年はもう少し実行性を高めていきたい。中長期的にやりたいことももう少し整理しつつ進めていきたい。
- 自己投資
- もともと物欲とかあまりないこともあって、特に何も考えずに過ごすとあまりお金を使うことがないんだけど、もったいない気もしてるので、食やら娯楽やら環境やら、自分のためになりそうとか、楽しめそうものには意識的にお金を使っていくようにしたい。関係ないけど、そろそろ引っ越したい気がする。
- 次の5年
- 今後の5年を考える。考えるといっても既に大体の方向性は決まっているので、どういうタイミングで、どういう環境で何をやるべきかみたいなことを考えつつ、環境を整えていきたい。
今年1年は重要な気がしてるのは頑張りたい。
2016年振り返り
2016年を振り返る。
目標
- 中・長期的な計画を立てて実行する
- 全く実行できなかった
- やりたいと思ってることと似ていることをやっている論文 ( Linguistic Benchmarks of Online News Article Quality ) は見つけたのでもう少しちゃんと読みたい
- アルゴリズムの参考にならないかなーといくつか本は読んでた
- 日々のことを記録する
- だいたい週1で記録することができた
- 1年振り返ってみて、クリエイティブなことが全くできてないことが分かって反省、来年は頑張ろう。
- 新しいことをする
- 特に何かできたわけではないけど、なんとなく興味範囲は広がったのでよしとする。
振り返り
1年通してモチベーションなかなか上がらないし、ぱっとしない1年だった。今年はエンジニアとしてはほとんど成長できなかった気はするけど、組織やらビジネスやら、少し周辺のことを色々考えて幅を広められた気がする。それにしても一度糸が切れてしまうと、それを元に戻すのは難しいんだなと感じる年末だった。
さて、もうすぐ今の仕事をして5年になる。院生として自然言語処理の研究を5年、WebエンジニアとしてWebサービス開発を5年。ちょうど次のことを考えるいいタイミングなのかなと思ってぼやぼや考えてる。同じ道を進むか、前の道に戻るか、少し角度を変えてみるか、はたまた全然違うことをしてみるか。何かしらテーマを持ちつつ進みたいなーと思いつつ、どういう方向性があるか考えてるものの特に決まってないので来年また考える。
エンジニアの立ち居振る舞い: ボトルネックを作らないように
僕が意識しているエンジニアの立ち居振る舞いは、チーム開発におけるボトルネックをなるべく発生させないようにすること。
エンジニア、デザイナー、企画、ディレクターなどがいるチームで開発していると、エンジニアリングやサービス仕様の側面で困りごとが発生することがある。
例えば、
- チームのエンジニアが仕様や設計について困っている。
- チームのエンジニアがレビュー待ちでタスクが進めづらくなっている。
- デザイナーの開発環境でエラーがでたり、gitの操作で困っている。
- 企画、ディレクターなどがエンジニアリングに関して相談がある。
比較的チームに長く在籍していて、サービス仕様などに詳しいということもあるけど、こういったエンジニアリングにおける困りごとをなるべくすばやく解決できるようにして、待ち時間を短く、チームの開発効率を上げようとしている。あとは、一人でできるタスクよりも複数人が関わるタスクを優先するとか。
他にも、Githubやslackとかに何となく書かれた質問に対してもすばやく回答して、メンバーが困っている時間をなるべく少なくするようにしてる。タスクを進めるうえでボトルネックなくスムーズにタスクを進められることは気持ちよく仕事をする大事なポイントの一つな気がしていて、質問に対して30秒後に回答が返ってくるのと、1時間後に回答が返ってくるのではタスクの進みやすさも違ってくる気がする。
特定の行動や習慣というわけではないかもしれないけど、普段意識していることでした(エンジニアとしてというよりエンジニアディレクターとしてというほうが少し強いかもしれない)