企業動向にアンテナを張るためにQiita Organizationのキュレーションサイトを作った。

Qiita Organization の登録企業に関するはてブエントリのキュレーションサイトを作りました。
[Qiita orgs Curation](http://qration.org)といいます。


![Screen Shot 2016-02-16 at 23.24.53.png](https://qiita-image-store.s3.amazonaws.com/0/51303/18ba4c08-380b-53cb-5aa1-f4ef0dabf7c7.png)

# 提供する機能

1. Qiita Organization 登録企業関連のはてブエントリを一覧表示します。
1. 企業HP、QiitaOrganization、はてブ検索へのリンク
1. ブクマ数の少ないエントリも表示されるので網羅的に企業動向を知ることができます。

将来的な転職を見据えて日々様々な企業の動向をキャッチするために作成しました。
以降、本エントリではなぜこのようなサイトを作ろうと考えたのか、どのように作ったのかを述べたいと思います。

# Qiita Organization を使って企業動向にアンテナを張りたい

## Qiita Organization とは
[Qiita Organization](http://qiita.com/organizations)は会社単位でメンバーの投稿をまとめて表示できるサービスです。
Qiita Blogのエントリによると2013年4月に始まったようです。

[Qiita Organizationの提供を開始しました](http://blog.qiita.com/post/46921129641/qiita-organization)

それからおよそ１年後、[2014年2月のエントリ](http://blog.qiita.com/post/75676990724/difference-between-team-and-organization)では登録されている企業数について次のように言及されています。

> 現在では、25社以上の企業が登録されています。

それからさらに２年が経った現在では200を超える企業がQiita Organizationを利用するまでに広がり、[Organization一覧](http://qiita.com/organization)もかなり縦に長いページになりました。
今回開発作業をしていた約一ヶ月間の間でも２０以上の企業が新たに追加されました。この勢いを見ると今後も増え続けていくように思えます。

　　　　　　　　　　　　　　　　　　![Screen Shot 2016-02-16 at 21.42.53.png](https://qiita-image-store.s3.amazonaws.com/0/51303/2c82ff43-02e2-da80-b7c5-188513ee09d2.png)

企業がQiita Organizationを使う理由は例えば次のようなものでしょうか。

- 技術を対外的にアピールするため
- エンジニアのアウトプットを促進するため

実際、企業の中には社内の開発ブログからQiitaに移行したところもありますし、日本のITエンジニア界で広く認知されたサービスとなったQiitaだからこそ、という流れだと思います。

## 転職を考えるエンジニアにとってのQiita Organization

個人的な事情を書くのもなんですが、僕はそのうち転職をしようと考えています。そのことを現実的に考えていくにつれ、Qiita Organizationがほかにない価値を持った情報源であると意識するようになりました。というのも、

- どんな技術を使っているのか
- どれくらいのレベルの高さなのか
- どんなエンジニアが所属しているのか
- 活発に活動しているか

といった企業HPや転職サイトなどでは得られないけっこうリアルな情報を得られるからです。
またQiita Organizationを利用していること自体、個人的にはけっこう良い印象だったりします。

## 不満に感じること

一方でQiita Organizationは企業を探すための場としては作られていません。

[一覧ページ](http://qiita.com/organizations)から得られる情報は企業名と大まかな事業内容のみです。
検索機能もなく、200を超える企業のページを逐一開いて確認していくのは不毛な作業です。

Qiita運営側としてはOrganizationに対してランキングを付けたり、
特定の企業を目立たせるような見せ方はできないという事情があるのかもしれません（それでも検索機能はつけて欲しいですが）。
また、Qiita Organizationのストック数をランキングにしたサイトもありますが、有名でイケイケな企業が目立つ傾向が強く、僕が求めている「どんな企業があるのか」という情報は得られそうにありません。

つまりは、Qiita Organizationの情報量に対して、**「この企業面白そうだな」と思わせる入り口がほとんどないのはもったいない**ということです。

# Qiita orgs Curation とは

そこで今回作ったのが「[Qiita orgs Curation](http://qration.org)」というWebサービスです。

Qiita orgs Curation (以下QOC)は、「Qiita Organizationの企業動向を日々網羅的にキャッチするためのキュレーションサイト」です。エントリの収集先としては定番のはてなブックマークさんを使用させていただきました。

機能はシンプルで、日々ブックマークされるエントリのうち、Qiita Organizationの企業に関連するものを一覧表示します。
気になる企業があったら、企業名の部分をクリックしてみてください。
企業情報を示すダイアログが出現しそこから企業サイト、Qiita Organizationのページ、はてブ検索に飛ぶことが可能です。

## 機能の実現方法

### Qiita Organizationのスクレイピング

定期的にQiita Organizationの一覧ページをスクレイピングし、企業情報を集めます。新しい企業が追加されていたら企業名から検索用キーワードとして追加します。

### はてなブックマークのスクレイピング

企業名やサービス名などをもとにはてなブックマークのエントリをスクレイピングします。
はてブの検索ページURLのデフォルトは次のようになっています。

http://b.hatena.ne.jp/search/text?q=<検索ワード>

このURLをちょっと変えてやることで、

- 検索対象が「タグ」か「本文」か「タイトル」か
- エントリの表示順が「新着」か「人気」か
- ブックマーク数の下限はいくつか

などの検索パラメータを指定できるようになっています。
また検索結果自体にもエントリを拾う手がかりとなる様々な情報（日付やカテゴリ、ブクマ数）があります。
検索ワードを含めたこれらのパラメータを調整し、企業に関連していて、できるだけ有用なエントリを、できるだけ多く集める必要があります。

## 実現までの障害

QOCを開発する上で重要だと考えたのが次の点です。

- 企業に関係するエントリは確実に拾う
- 企業に関係ないエントリは確実に弾く

これは単純に企業名で検索して引っかかったエントリを表示すればいいというわけではもちろんなく、検索ワード(＝企業名)が次のパターンの場合は関連性がないエントリを拾う危うさがあります。

1. 社名が一般名詞
2. BtoCで有名なWebサービス名が社名になっている
3. はてブの罠

2.はクックパッドが挙げられます。関連しているとはいえレシピのブックマークはスクレイピングの対象として弾く必要があります。
3.はさらにいくつかのパターンに分けられます。

3-1. 検索ワードの一部に基づいた検索結果が表示される

はてブ検索で確実にその企業に関するエントリを拾いたいとなれば、パターン1,2を考慮して、検索ワードは「株式会社〇〇」といった形になります。
しかし「株式会社〇〇」で検索しても表示される結果が単に「株式会社」で検索した結果となることがあるようです。
おそらく検索結果が１件もない場合、検索ワードの一部だけで検索した結果を返すようになっている...？と想像しています。

3-2. 検索ワード自体に関係ないエントリが引っかかる

「株式会社〇〇」で検索したエントリにもかかわらず、実際のページを覗いてみたら一言も「株式会社〇〇」に言及されていない、ということもあります。
原因は、エントリの情報はブックマークされた時点のものがはてなのDBに保存されているためのようです。
そのため、ブックマークされた時点でそのエントリの「こんな記事も読まれています」的なスペースや広告スペースに「株式会社〇〇」という文字があるとそれも引っかかってしまう可能性がある、ということです。

以上のパターンを避け、確実に関連するエントリのみを拾うためには、その分スクレイピングの条件をきつくする必要があります。

例えば検索ワードは「株式会社〇〇」の形にし「〇〇」の部分だけでは検索しないようにする、検索対象の文字列がタイトルや本文に実際に含まれているかを調べたりすることが挙げられます。
また後述しますが、関連性の低いエントリは往々にしてブクマ数１のものが多い傾向にあるようです。そのため検索パラメータとしてブクマ数の下限を上げるのは効果が高いです。

しかしきつい条件にすればするほど、僕がQOCを作った当初の動機の実現からは遠ざかってしまいます。つまり、**いろいろな**企業の情報を網羅的に得られる場を作る、ということです。

はてブエントリは、やはり有名でイケイケ人気企業に関連するものの方が多い傾向にあります。
きつい検索条件でエントリを弾きすぎると結局、そういった企業の関連エントリばかりが残ってしまいます。かといって条件をゆるくすると関連のないエントリまで引っかかりコンテンツが汚染されてしまいます。両者の間でちょうどいい感じの絞り込みをするスクレイピングプログラムをつくる必要がありました。

　　　　　　　　　　　![Screen Shot 2016-02-16 at 21.40.27.png](https://qiita-image-store.s3.amazonaws.com/0/51303/32d80cf0-6616-e106-aff0-aff14a27c7d6.png)

## 現状の問題点

- 関係ないエントリをやっぱり拾ってしまう

「関連性のないエントリを弾く」という点が現時点ではまだまだ発展途上です。そのためQOCで表示されるエントリが実際にはその企業と関係のないものであるものが紛れ込むことがあります。
タイトルだけを見て実際の記事が読まれないことも多いキュレーションではまずい動作です。

- はてブの日付と実際の日付は一致しない

はてブエントリとしての日付はあくまでもそのエントリが初めてブックマークされた日付になるようです。
だから何年前の記事であろうとそれが今日初めてブクマされ、スクレイピングに引っかかると、QOCにはあたかも最新のエントリのように表示されてしまうことになります。

- タイムリー性が低い

はてブと同期しているわけではないので定期スクレイピングが行われるまで情報が更新されません。
はてブの人気エントリになっているのにQOCに表示されていないと悲しい気持ちになります。
QOCにその日の目ぼしいエントリが揃い始めるのは昼過ぎくらいになるのでそれ以降に見るとちょうどいいです。

- ブクマ数１のカオスさ

上記の通り現状のQOCには関連性のないエントリが混入することがありますが、その内訳はブクマ数１のエントリが圧倒的に多いです。
だったらブクマ数１のエントリをすべて弾けばいいのかといえば全くそうでもなく、中にはちゃんと企業と関連した最新のエントリも混じっているわけです。
現状玉石混交という感じになっていますが、現在の自分が書けるプログラムよりも人間の頭の方が関連するかどうかの判断はずっと優れているのでそのままにしています。ブクマ数１のエントリ群は目を細めて見てください。

# 今後

個人的には学習のアウトプット先として地道にクオリティを上げていきたいと考えています。
とりあえず自然言語処理とか機械学習にも手を出してみたいです。

# システム構成

## 全体像

　　　　　　　　　![Screen Shot 2016-02-16 at 21.43.23.png](https://qiita-image-store.s3.amazonaws.com/0/51303/de5e027f-228c-bb6b-6129-a3b9808cb0da.png)

## レポジトリ

- バックエンド：[https://github.com/seihmd/q-o-c](https://github.com/seihmd/q-o-c)
- フロントエンド：[https://github.com/seihmd/q-o-c_client](https://github.com/seihmd/q-o-c_client)

## VPSで動かすまでのメモ

[Linux初心者がVPS借りてWebサービスをホストするまでのこまごましたことメモ](http://qiita.com/seihmd/items/a0e7f8948d2be9356c62)