Cos類似度とDoc2Vecってどっちが良いの？

[ベーシック Advent Calendar 2016](http://qiita.com/advent-calendar/2016/basicinc) 10日目は、
17卒内定者の[@enta0701](http://qiita.com/enta0701)です。

今年の9、10月ごろ、`Cos類似度`という単語を知りました。
[４日目の記事](http://qiita.com/s-mori/items/1a32537ca46e578f0a16)にもありますが、レコメンドシステムなんかにも使えるそうです。

なにやら面白そうな匂いがしたので、実際に文書同士の類似度計算を
Cos類似度と、ググっていたときに頻繁にでてきた`Doc2Vec`で試してみようと思います。


##Cos類似度とは
２つのデータにおいて、特にn次元のベクトル同士を比較する際に扱われるそうです。
数式で書くとこんな感じ。

$$
similarity = cos\theta = \frac{A \cdot B}{||A|| ||B||}
$$

内積ですね。
この値が1に近いほど類似度が高く、0に近いほど類似度が低いことを表します。

Cos類似度を使って文書を比較する際には、文章中の単語に重み（特徴）付けをする[TF-IDF](https://ja.wikipedia.org/wiki/Tf-idf)と一緒に使うことが一般的なようです。

簡単に説明すると、

$$
TF = \frac{ある単語tが、ある文書d中に現れる回数}{文書d中の全ての単語数}
$$
$$
IDF = \log{\frac{比較する文書の総数N}{ある単語が現れた文書数df}}
$$

TFとIDFの積によって重み付けをすることで、
`ある特定の文書で複数回出てくる単語は重要（だろう）`ということになります。
※単語の意味を理解しているわけではない。


##Doc2Vecとは
Doc2Vecを理解するには、Word2Vecを知る必要があります。

[米googleの研究者が開発したWord2Vecで自然言語処理(独自データ)
](http://qiita.com/okappy/items/e16639178ba85edfee72)

>「Word2Vec」は、米グーグルの研究者であるトマス・ミコロフ氏らが提案した手法であり、いくつかの問題について従来のアルゴリズムよりも飛躍的な精度向上を可能にした自然言語処理の手法。

>Word2Vecは、その名前の表す通り、単語をベクトル化して表現するする定量化手法である。例えば日本人が日常的に使う語彙数は数万から数十万といわれるが、Word2Vecでは各単語を200次元くらいの空間内におけるベクトルとして表現する。

>その結果、今まで分からなかったり精度を向上するのが難しかった単語同士の類似度や、単語間での加算・減算などができるようになり、単語の「意味」を捉えられるようになった。

単語間で計算や、プログラム上で意味を扱えるなんてすごい！
本の文章から単語を理解し頭の中で映像を作ることが、人間だけでなくコンピュータでも出来そうですね。


さて、Word2Vecでは、単語の意味をベクトルとして扱えることが分かりました。
これを元に、文書(Document)を単語の集合体としてベクトル計算可能にしたものがDoc2Vecです。


##試してみた
ここからは実際にコードを書いて、文書間の類似度を出してみたいと思います。
比較対象は、[ferret](https://ferret-plus.com/)の「最新のエントリー」から記事5件と、類似度が本当に正しい（それっぽい）かを判断するために、5件のうちのどれかから関連記事を1件、合計6件の記事をデータとして使用します。

また、文章量による変化もみたいので、`記事タイトル`と`本文`に分けて試してみます。

※2016年12月8日 午後11時12分 時点
※URLは事前に取り除きました。

###環境
- Mac（OS X El Capitan 10.11.6）
- Python 3.3.0


###準備
`titles.txt`に6記事の各タイトルを、`documents.txt`には6記事の本文を、
それぞれ`|`を区切り文字として（コピペして）入れておきます。
６件の記事は順に記事A〜Fとし、記事Eの関連記事が記事Fです。

```titles.txt
知りたい情報にすぐたどり着ける！Yahoo!・Googleの便利な検索術を解説|
実際何が違うの？IoTとM2Mの定義の解説＆事例紹介|
「“α Plaza”オープン」 プロフェッショナルをはじめとした全てのαユーザーの創作活動をワンストップで支援|
ピツニーボウズとLOCUSが対話式パーソナライズド動画ソリューションで協業を開始|
Facebookが10月にリリースした新サービス！法人版の社内SNS「Workplace」を使う3つのメリット|
今年Facebookから発表された新機能5つまとめ
```
```documents.txt
あなたは1日に何回、Yahoo!やGoogleなどの検索エンジンを開きますか？ネットを利用する際に、何か調べたいことがあるとすぐに開くという方も多いかと思います。実は、検索エンジンには知りたい情報に早くたどり着くのに便利な検索機能があります。検索ボックスに計算式を入力することで検索エンジンがその計算式を解いてくれたり、地域の天気予報が検索結果の上位にわかりやすく表示されたり、その用途は様々です。今回はYahoo!とGoogleを利用した、便利な検索術について紹介します。検索エンジンを余すところなく活用して、業務のスピードアップに役立てましょう。計算式の検索方法GoogleやYahoo!では、検索窓に数式を入力すると、その計算式を解いた数字が検索結果として表示される機能があります。数式を入力する際に用いる基本的な記号は以下の通りです。+（たす）足し算の計算に使います。-（ひく）引き算の計算に使います。ー（長音符）では、計算結果は出てこないので気をつけましょう。*（かける）かけ算の計算に使います。×でも同様に計算することができます。/（割る）割り算の計算に使います。画像の中では、=（イコール）を使用していますが、入力しなくても計算結果に違いはありません。半角（半文字分の幅の文字）でも全角（1文字分の幅の文字９でも計算は行えますが、似たような見た目で違う意味の記号を使っても計算結果は出てこないので気をつけましょう。単純な計算だけでなく、関数を用いた複雑な計算も行うこともできます。Googleでは、関数からグラフとして作成した結果を見ることもできます。会議中など、電卓が手元になくてもパソコンがある場合は、検索エンジンを使った計算を試してみましょう。参考：電卓、単位変換、色コードの管理｜Googleウェブ検索ヘルプ検索窓で計算する｜Yahoo!検索ガイドダイレクト検索の利用方法各検索エンジンには天気情報や交通情報などの検索されることの多い情報について、要約した情報をわかりやすく検索結果に表示する「ダイレクト検索」という機能があります。すぐに役に立つ機能なので、普段から活用してみましょう。GoogleでもYahoo!でも「〇〇（単位）を△△（単位）で」と入力すると、単位の変換を行うことができます。マイルとメートルや、ドルと円のような、暗算で計算するのが難しい単位でも使えます。また、Yahoo!では年号の変換も可能です。よく「あれ、今年って平成何年だっけ？」となる人にとっては重宝する機能です。参考：あなたの知らないYahoo!検索機能｜Yahoo!検索ガイド「〇〇（単語）　とは」と検索すると、単語の意味が表示されます。引用元が信頼できるかどうか、また自分が検索したい用語の同音異義語が表示されてしまっていないかを注意しましょう。翻訳Googleでは、検索窓に「〇〇（単語）　英語」と入力すると、対応する英単語が検索結果に出てきます。英語以外にも、スペイン語やドイツ語、フランス語などに変換することができます。変換された内容は決して完璧なわけではないので、対外的に利用する前には正しい訳になっているかチェックするようにしましょう。Yahoo!でもGoogleでも、「〇〇（地名）　天気」と入力すると、その地域の天気予報を見ることができます。市町村名や、区の名称でも検索が行えます。経路（交通情報）Googleでは「〇〇（地名）から△△（地名）」と入力すると、交通経路の情報が出てきます。場所によっては、Googleのスポンサーとなっている航空会社のフライト情報も結果として表示されます。Yahoo!ではYahoo!路線情報のリンクが出てくるので、路線情報から情報をチェックしましょう。参考：電車の乗換案内や時刻表を調べる｜Yahoo!検索ガイド株価Yahoo!でもGoogleでも「〇〇（会社名）　株価」と検索すると、検索時点での株価の値動きがわかります。株価はタイムリーな情報です。すばやく値動きをチェックするのに活用してみましょう。参考：Google検索ヘルプ：便利な機能を利用するYahoo!ヘルプ：ダイレクト検索の使い方予測変換機能を使うGoogleでは検索ボックスから単語を検索して要約が表示される機能だけでなく、サジェストと呼ばれる予測変換から情報をチェックすることもできます。先ほど紹介した数式や天気などは検索窓に入力した時点で、さらに要約された結果が表示されます。詳しくはこちらの記事でご紹介しているので、ぜひ参照してみてください。進化し続けるGoogleのサジェスト機能（オートコンプリート）の基礎を理解しようまとめ日頃から使うことの多い検索エンジンには、業務の効率化に役に立つ色々な検索機能が付いています。・会議中にとっさに必要となった計算を、ちょうど開いている検索エンジンで行う・出張先の天気を、ニュースを見ることなくすぐに検索・多くのホームページを見ることなく、単語の意味をつかむこのように、ざまざまなシーンで活用することができるでしょう。また、Googleでは音声検索にも対応しています。入力の手間を省くことができるので、使いこなせば検索時間自体の短縮につながるでしょう。今回、ご紹介したもの以外にも各検索エンジンでは多くの活用方法を提案しています。興味がある方は、ぜひ色々な検索活用術を試してみましょう。|
ここ1,2年、「IoT」に注目が集まっています。皆様も耳にする機会が増えたのではないでしょうか。一方で、主にBtoB向けの展示会でよく見かける「M2M」も、概念的に非常に似通っているため混合しがちです。「IoTはモノとモノをインターネットにつなぐことで、M2Mは機械同士をつなぐこと」とおおよその内容はわかっていても、それぞれができることや具体的な違いについて明確に理解できている方は少ないのではないでしょうか。今回は、IoTとM2Mの違いについて、事例を交えてご紹介します。IoTやM2Mにかかわる製品案内を見る前に、意味や違いをしっかり押さえておきましょう。IoTとはIoTとは「Internet of Things（モノのインターネット）」の略称で、「あらゆるモノをインターネットにつなぐことができる状態」を指します。今まではパソコンやスマホなど、いわゆるネット機器からしかインターネットにアクセスすることができませんでしたが、現在ではデジタルカメラや万歩計など、本来インターネットに接続されていないような「モノ」までインターネットに接続され始めています。IoTの考え方自体は「生活環境のあらゆるところでITネットワークがつながる社会」を意味するユビキタス社会という単語が生まれた2000年代前半から構想されていました。現在では技術の進化により、IoTを利用したビジネスや製品は現実的なものとなっています。参考：平成27年度情報通信白書｜総務省2015年の重要キーワード「IoT」とは？オススメ記事5選IoTの事例現在IoTに関する様々なサービスが生まれています。今回は2つの事例をご紹介します。コーヒーマシンによる見守りシステムネスレ日本プレスリリースネスレ日本は2016年8月にスマートフォンのアプリを連携させたコーヒーマシンの発売を発表しました。アプリで家族や友人を登録すると、登録された人がコーヒーマシンを利用したタイミングでアプリに通知が届きます。コーヒーマシンや給湯器という毎日使用する家電とアプリをつなぐIoTの仕組みは、遠方に住む親族の見守りが課題となる高齢化社会の日本だからこそ求められるサービスと言えるでしょう。参考：コーヒーマシンに見守り機能? 意外な組み合わせで攻めるネスレ日本建設機械保守システムコマツ製作所建設機械大手のコマツ製作所では、自社で生産したショベルやブルドーザーなどの建設機械に対してGPSや稼働状況をチェックするセンサーを導入しています。・建設機械の故障の原因の推測可能（修理の迅速化）・建設機械の盗難防止・適切な点検期間や配車計画などの効率的な運用の提案・商品の需要予測機械自体から情報を得ることにより、上記のようなことが可能になります。機械の運用状況が明らかになり、コマツ製作所に取っても顧客にとってもメリットの大きいIoTの事例と言えるでしょう。参考：ビッグデータ活用とビジネスの変化　－コマツで起こったこと－メリット/デメリット事例から見えてくる通り、IoTを利用したビジネスには下記のようなメリットとデメリットがあります。 【メリット】・常時情報の監視が行えるため、効率のいい制御が行える・今までにない新しいビジネス、製品が生まれる・ビッグデータの収集、活用が可能になる【デメリット】・あらゆるモノとつながることで、セキュリティが脆弱になる危険性がある・ネットワークでやり取りされている情報が流出してしまうかもしれない・IoT開発、通信コストがかかる参考：セキュリティベンダーが語るIoTの長所と短所とは?M2MとはM2MとはMachine to Machine（機械から機械へ）という言葉の略称で、モノ同士が直接データを交換して動いている状態を指します。機械同士がつながることで自動で情報を処理することができ、人間が行っていた作業を機械に任せることができます。例えば、部品を生産する機械が不具合を起こした時に生産ラインの先で部品を待っている部品を組み立てる機械に不具合を知らせることで、事前に稼働を止めることができます。M2Mでは運用によっては複雑で危険な仕事を機械に任せられるようになりますし、人件費の削減にもつながります。M2Mの事例IoT同様、M2Mに関しても多くの導入事例があります。今回は2つの事例を紹介します。自動運転システム引用：レベル4の完全自動運転車はレベル3の自動運転車を賢く育てて実現する機械同士が情報を交換を行うことで、稼働するシステムとして自動車の自動運転システムが挙げられます。自動運転システムはカメラやセンサーの情報から車外のデータを取り、そのデータを元にして車両の運転システムを稼働させます。例えば、運転中の車両の目の前に人が飛び出してきた時、車両はセンサーで感知した瞬間、ブレーキをかけるよう運転システムへと号令をかけます。正確さと即時性が求められる一連の動作の精度を上げるため、自動車各社は研究に注力しています。参考：自動運転システムとルールベースシステムM2Mの代表的サービス例メリット/デメリット事例から見えてくる通り、M2Mには以下のようなメリットとデメリットが挙げられます。【メリット】・正確な機械の制御が可能になる・常時情報の監視が行えるため、効率のいい制御が行える・今までにない新しいビジネス、製品が生まれる【デメリット】・サイバー攻撃によるシステムジャックの危険性がある参考：課題山積の自動運転車のセキュリティ、業種や分野の枠超え議論を展開IoTとM２Mの違いここまでIoTとM2Mについてご紹介してきました。では実際のところ、この2つはどのような違いがあると言えるでしょうか。今までの内容をまとめてみると、IoTとM2Mにはそれぞれの強みがあるのが見えてきます。機械同士のネットワークだったM2Mから、さらに多くのものをネットワークにつなげるようになったものがIoTと言えるでしょう。ただ、高度な制御のためには機械同士のつながり（M2M）で処理した方がいいシステムも存在します。家の玄関と同じように、ネットワークにつながっているということは情報を取得できる入り口が開いていることであり、同時に情報の出て行く出口が解放されている状態です。情報のやり取りに不具合を起こさないようにしつつ、セキュリティ面の強化を行うことがIoT技術の課題とされています。また、M2Mに関してもIoTほどオープンにはなっていませんが、悪意のあるサイバー攻撃を受けた際に自動制御に支障をきたす可能性があります。参考：課題山積の自動運転車のセキュリティ、業種や分野の枠超え議論を展開IoTとM2Mを融合させた考え方も登場IoTとM2Mは全く切り離して考えるものでもありません。その一つに「インダストリー4.0」という考え方があります。参考:インターネットが産業を変える！ドイツ発の産業革命インダストリー4.0とはインダストリー4.0は機械と機械だけでなく、センサーや部品自体とも情報を交換することで、今まで人が判断を行っていたことを自動化するという考え方です。M2Mとしての高い制御力も持ちつつつ、一部のシステムは機械以外のものにもつなぐ仕組みは産業のあり方自体を変えるかもしれません。参考：微妙に違う？！かんたん解説「M2M」と「IoT」の違い3分でわかるIoTとM2Mの違いIoTとM2Mの違いを優しく解説！まとめ製造や物流などの分野のソリューションとして、IoTとM2Mに関する様々なサービスが生まれている今、双方の違いを改めて考えることはあまりないかもしれません。それぞれには得意な分野があります。様々な事例を見ながら、メリットとデメリットを把握するようにしましょう。自社で新しい業務の仕組みを開発したり、現在の業務を改善する際に2つの技術は力を発揮します。「IoTがやりたい」と技術を利用するのを目的とせず、自社のサービスにとってインターネットとどのようなつながり方をするのが理想的なのか考えてみましょう。|
-新製品体験、サポート＆コミュニティスペースを、全国5か所のソニーストアに新設-“α Plaza” で提供する主な体験・サービス[“α Plaza” webページ][“α Plaza” 展開スケジュール]12月8日　銀座、名古屋、大阪、福岡のソニーストアにαプラザ開設来年春　　ソニーストア札幌オープンに合わせて、αプラザオープン[“α Plaza” 展開スケジュール]12月8日 銀座、名古屋、大阪、福岡のソニーストアにαプラザ開設来年春 ソニーストア札幌オープンに合わせて、αプラザオープン|
OCUSが持つ豊富な動画制作実績や動画マーケティングのノウハウと、「EngageOne(R) Video」＊１　を組み合わせることで動画を活用したOne to Oneマーケティングを促進ピツニーボウズジャパン株式会社（代表取締役社長：ベンハー・メスフィン、本社：東京都品川区、略称：ピツニーボウズ）と株式会社LOCUS（代表取締役社長：瀧 良太、本社東京都渋谷区、略称：LOCUS(ローカス)）は、このたび対話式パーソナライズド動画ソリューションの提供において協業いたします。様々な業種におけるお客様のマーケティング課題に対して、動画を中心としたマーケティング支援を行ってきたLOCUSの知見やノウハウに、ピツニーボウズの対話機能を持つパーソナライズド動画ソリューションとなる「EngageOne(R) Video」＊１の技術を組み合わせることで、お客様は顧客満足度の向上、顧客とのエンゲージメント強化、業務効率化等に活用することができます。近年、スマートデバイスや動画サイトの普及に伴い社内外を問わず企業の動画利用が増加しています。しかし、従来の動画は視聴者との対話性がなく、主に企業からの一方的な情報提供となりがちです。また、個人個人の属性に応じて動画の内容を差し替えるパーソナライズド機能も、限定的なものにとどまっています。ピツニーボウズのEngageOne(R) Videoは、お客様ごとの好みやニーズに応じたOne to Oneマーケティングを実現する対話機能を持つ動画ソリューションです。シナリオに基づき制作したビデオと、企業が保有している視聴者の属性情報や購買データなどの行動履歴を独自技術により連携させることができます。さらに動画内に用意されている選択肢を視聴者が自由に選択したり、アンケートなどコメントを加えることも可能です。これにより、視聴者ごとにカスタマイズしたイタラクティブな動画提供を実現します。このような機能を通じて、視聴者の要望に応じた必要な情報の提供や次のアクションへのスムーズな誘導が可能になり、顧客満足度の向上や業務効率化につなげることができます。また、累計1,000社以上の動画制作実績を持つLOCUSでは、商品やサービスのプロモーション動画、企業紹介動画を始め、営業ツールやマニュアル、教育研修、採用、IR、CSRといったさまざまなシーンにおいて、実写からアニメーションCGなどの多様な映像スタイルを提供しています。その他、動画マーケティングをより広く浸透させるべく、国内外の動画マーケティングの最新動向を発信するニュースメディア「movieTIMES」を運営しております。今後、ピツニーボウズとLOCUSは、対話式パーソナライズド動画ソリューションを、BtoB, BtoCを問わず、幅広いビジネスを対象に提供していきます。＜EngageOne(R) Videoの特長＞1. 会員や利用者向けに個別にカスタマイズされた動画を提供2. 対話式機能で、利用者のニーズを瞬時に把握3. CRMなどの既存システムとリアルタイムに連携し動画に反映4. PC、スマートフォン、タブレットなどの様々な端末に対応＜LOCUS動画サービスの特長＞1. マーケティング戦略の立案から動画を中心としたクリエイティブ制作、活用手法、広告運用分析までワンストップでご提供2. 書類選考と面接によって厳選された600名のクリエイターにより、実写からアニメーション、フルCGまであらゆる表現に対応3. プロジェクト型の制作体制により無駄なコストを削減、最適な価格の提供■ ピツニーボウズジャパンについてピツニーボウズジャパン(NYSE：PBI)はグローバルテクノロジー企業として、顧客情報管理、位置情報活用(ロケーションインテリジェンス)、顧客コミュニケーション支援(顧客エンゲージメント)、発送と郵便そしてグローバルeコマースいった商取引の分野において、革新的な製品やソリューションを提供しています。ピツニーボウズの製品、ソリューション、サービスは世界約100ヶ国で150万以上お客様にご支持頂いております。詳細は日本語サイトをご覧ください。■LOCUSについてLOCUSは大手企業から新進ベンチャーまで1,000 社以上に対し、「動画をもっと手軽に」をテーマに動画を軸としたコンサルティングを展開。そのコンサルティング領域は多岐にわたり、クライアントの課題解決に向けた動画を軸とした戦略設計から、動画・Web・グラフィックの制作、各種広告の配信・効果測定、そして改善提案まで総合的なコンサルティングを行っております。詳細は弊社ホームページをご覧ください。＊1 EngageOne(R) Videoについてピツニーボウズの提供する独自の技術で、世界ではすでに200社以上の導入事例があり、保険会社での契約内容のご案内や通信会社の利用明細の解説のほか、取引拡大のための商品PRなど、BtoB、BtoCを問わず幅広い分野で利活用されていす。商品の紹介から、契約、利用継続サポート、追加、更新、評価といった顧客ライフサイクルに併せて動画を活用できます。※ 記載されている商品名などの固有名詞は、各社の商標または登録商標です。※ 掲載されている情報は、発表日現在の情報です。最新の情報と異なる場合がありますのでご了承ください。以上＜本件に関するお問い合わせ先＞株式会社LOCUSアライアンス推進室：尾藤 広将TEL：03-3461-1477　E-mail：pr@locus-inc.co.jpピツニーボウズジャパン株式会社担当：吉永 敏子TEL：03-5657-1230　／　Email：toshiko.yoshinaga@pb.com|
2016年10月10日（アメリカ時間）、Facebookはこれまで「Facebook at Work」という名称でテスト運用されていた法人版のソーシャルネットワーキングサービス（以下、SNS）「Workpkace」を正式リリースしました。「Workplace」のUIは従来のFacebookと類似しており、企業利用に役立つ様々な機能を備えています。個人アカウントとは別に「仕事用のアカウント」として利用できる点が特徴です。今回は、Facebookが投入したエンタープライズ向けSNS「Workplace」に関する情報をまとめていきます。Curriculum pt1Facebookの法人版 社内SNS「Workplace」とは？「Workplace」はFacebook社が10月に新たにリリースした法人版のSNSです。「Workplace」のリリース前から、法人版SNSは多数存在していましたが、月間アクティブユーザーが16億人を超え、世界的に普及しているFacebookの機能を継承している点が最大の特徴です。「アクティブ・ユーザー」の数によって料金を課金する新しいモデルを採用してたくさんの企業を取り込もうとしています。参考：総おさらい！国内主要SNSの利用状況まとめ（Facebook・Twitter・インスタグラム・Snapchat）それでは、ここから具体的に「Workplace」ではどんな機能があるのかご紹介します。1. Workplaceで使える機能紹介前述のとおり、「Workplace」はFacebookのデザインと同じような見た目になっています。しかし、Facebookは様々な人とオープンにコミュニケーションを取るのに対して、「Workplace」ではよりクローズドな環境で情報の共有やコミュニケーションを特化しています。A. グループ機能Facebookグループと同じく、Workplaceでもグループを作成することができます。会社が大きくなればなるほど、プロジェクトチームを作る機会も多くなるでしょう。そんな時にグループを作ってしまえば、適切な人との情報交換や情報検索が1ページで完結します。B. マルチグループ機能社外の人とプロジェクトを組みたい場合にはどうすればいいのでしょうか。それを解決する機能として、「Workplace」独自の機能としてマルチグループ機能があります。マルチグループ機能では、別の「Workplace」を使っている社外のメンバーやフリーランスで働いている人ともグループを作成することができます。C. ニュースフィード「Workplace」でもFacebookと同じようにニュースフィードを備えています。Facebookと根本的には同じですが、法人版ということで流れてくる情報は「友人の近況」ではなく「仕事上の重要な情報」です。テキストや写真はもちろん、動画を投稿することも可能です。D. ワークチャット「Workplace」でのチャット機能は「ワークチャット」と呼ばれています。コンタクトリストにもいわゆる「ビジネスコンタクト」(仕事関係の連絡先)だけがまとめられているので、チャットの招待も簡単です。もちろん、複数人数でのチャットやスタンプの送信も可能です。E. ライブビデオ「Workplace」ではライブビデオ機能も搭載されています。例えば、本社と支社が離れている場合にも、全社員がライブ中継で会議の様子を見ることができるので、その場でテキストチャットを使って発言することも可能です。F. 検索「Workplace」では、過去に別のグループが投稿した内容やファイルなども検索することができます。G. 管理機能「Workplace」の管理チームは、アクティブユーザーやアクティブグループの数や比率、投稿数などの分析情報をアナリティクス画面で参照することができます。2. Workplaceを使うメリットH. Facebookとほとんど同じ操作性「Workplace」はFacebookとほとんど同じ機能を持ち合わせているため、ほとんどの人が説明書なしで使い始めることができます。さらに、競合の社内コミュニケーションツール"Slack"のように外部のサードパーティー製アプリケーションと連携をあえて取っていないのもFacebookと同じような使い勝手を保持し、エンゲージメント率を高めるための大きな理由です。I. 万全なセキュリティWorkplaceはエンタープライズ版ということもあり、非常に強力なセキュリティー体制上で構築されています。Amazon Webサービスでも採用されているSOC(Service Organization Control)3と呼ばれる監査報告の認証を受けています。また、Facebookの個人アカウントと別に「Workplace」アカウントが発行されるので、Facebook上で機密情報が流れるという心配もありません。3. 気になる料金は？「Workplace」の料金体系は、1アクティブユーザーあたりの月額制となっています。1,000アクティブユーザーまでは1人あたり3ドル、9,000アクティブユーザーまでは1人あたり2ドル、それ以上は1人あたり1ドルというシンプルで安価な料金体系となっています。非営利団体と教育機関は無料で利用することができます。「Workplace」のユニークなところは、課金対象をアクティブユーザーに絞ったところです。アクティブユーザーとは、サービスをその月に一度でも利用しているユーザー数です。つまり、登録してもその月に一度も利用していないユーザーは課金対象とはなりません。もちろん、写真や動画、ファイルをアップロードするためのストレージ容量は無制限です。チームやプロジェクトを組むためのグループ数にも制限はありません。まとめグループウェアは無数に存在しますが、Facebookと同じように利用できる「Workplace」は、会社にとっても個人にとっても非常に使いやすい設計だと言えます。導入を検討する余地は十分あるでしょう。まずは少人数でテスト的に導入してみてもいいかもしれません。|
Facebookは世界で約14億人ものユーザーを抱え、国内の利用者数も2,400万人を突破する世界最大のSNSです。2006年にサービスを開始し、急速な成長を遂げるFacebookは、最近は特に従来のSNSとは異なるアプローチを続けており、先月行われた開発者向けのFacebookイベント「F8」でも、Facebookのメッセージ機能である「Facebookメッセンジャー」のプラットフォーム化やアプリ内の分析ツールなど、単なるSNSの枠に収まらないような様々な新機能を発表しました。Facebook F8カンファレンス、初日のまとめ - TechCrunch JapanF8ではFacebookの今後を大きく変えていくと予想される機能が紹介されていましたが、今年既にFacebookはいくつもの新機能をリリースしています。今回は、2015年に発表されたFacebookの新機能5つをご紹介します。Curriculum pt11.従業員同士の繋がりをサポートする「at Work」開始 -Facebook、ビジネス向け新機能「at Work」開始 - 従業員の繋がりをサポート - マイナビニュース企業内での情報共有をやりやすくする「at Work」は、1月15日より一部のパイロットパートナーに向けて試験的に提供されています。「at Work」専用アカウントを取得すれば、所属している企業の情報を受け取れるほか、従業員同士でグループを作成することも可能です。一般アカウントと完全に切り離しての使用が可能なため、情報漏えいしにくい仕組みとなっています。2.自分がいる場所とタイミングに合わせて情報を表示する「Place Tips」Facebook、位置情報に基づいたニュースフィードを行う新機能「Place Tips」の提供を開始：MarkeZine（マーケジン）「Place Tips」ユーザーがいる場所に合わせた情報を表示する機能です。利用者の位置情報は携帯電話のネットワーク、Wi-Fi、GPSの情報から特定されるようです。現在は言語設定を「英語（米国）」にしている場合のみ利用可能のようです。3.Facebookページ向けの「注目の動画」「プレイリスト」フェイスブックが新機能「注目の動画」「プレイリスト」を発表 - ライブドアニュースFacebookページ向けの新機能が2つリリースされています。「注目の動画」は、ユーザーに観てほしい動画を、ページ運営者側で選んで目立たせることができる機能です。選んだ動画は、Facebookページ左側の「情報」欄と「動画」セクションの上部に表示されます。「プレイリスト」は、アップした動画をグループ分けし、グループ内で任意の順番に並べ替えることができる機能です。これまで投稿順で並んでいた動画の表示位置を、運営者側である程度コントロールできるようになりました。4.Facebook上で売買を行える「For Sale Group」Facebook、CtoCの売買を可能にする新機能「For Sale Group」開始：MarkeZine（マーケジン）「For Sale Group」は、グループメンバー間で売買できる機能です。メンバーは、投稿するときに「Sell」機能を選択すると、売るものの説明や値段、持ち帰りや配達の場所を設定できます。「Available（販売中）」「Sold（売り切れ）」といった情報もその投稿に表示することができるほか、過去に売れたもののカタログを表示することもできます。5.過去の投稿を簡単に確認できる「On This Day」Facebook、過去の「今日」振り返る新機能 - ライブドアニュース3月24日、自分がこれまでにFacebookでシェアした（もしくは友達からタグ付けされた投稿）を振り返ることのできる新機能「On This Day」（過去のこの日）が発表されました。許可しない限り、友達のニュースフィードには流れない仕様になっています。まとめFacebookはSNSの王者として独走する期間が長く続いていますが、彼らは今までと同じようにSNS運営しているだけでは事業を継続できないことを既に気付いています。一見するとSNSとは全く関係の無い企業を買収したり、メッセンジャーのプラットフォーム化を構想しているのは、現状に留まっていてはいけないという思考が根本にあるからできることでしょう。どのようなサービスにも共通することですが、現状維持は維持ではなく低下に向かっているケースの方が多くなります。サービスを継続させたいのであれば、時代に合わせて柔軟に変化することを恐れないことも重要なポイントになります。Facebookの動きは今に満足せず、時代の流れを考え上での行動なのではないでしょうか。
```


###■Cos類似度
Cos類似度は、[scikit-learn](http://scikit-learn.org/stable/)（Pythonの機械学習ライブラリ）を使えば簡単に求めることが出来ます。

```python

# -*- coding: utf-8 -*-

from os import path
import numpy as np
import MeCab
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

current_dir = path.dirname(__file__)
input_text = open(path.join(current_dir, 'titles.txt'), 'r').read()
# input_text = open(path.join(current_dir, 'documents.txt'), 'r').read()
documents = input_text.split("|")

def words(text):
    """
        文章から単語を抽出
    """
    out_words = []
    tagger = MeCab.Tagger('-Ochasen')
    tagger.parse('')
    node = tagger.parseToNode(text)

    while node:
        word_type = node.feature.split(",")[0]
        if word_type in ["名詞"]:
            out_words.append(node.surface)
        node = node.next
    return out_words


def vecs_array(documents):
    """
    各文章における重み付け
    """
    docs = np.array(documents)
    vectorizer = TfidfVectorizer(
        analyzer=words,
        stop_words='|',
        min_df=1,
        token_pattern='(?u)\\b\\w+\\b' #文字列長が1の単語を処理対象に含める
    )
    vecs = vectorizer.fit_transform(docs)
    return vecs.toarray()

# Cos類似度
tag = ["記事A", "記事B", "記事C", "記事D", "記事E", "記事F"]
cs_array = cosine_similarity(vecs_array(documents), vecs_array(documents))

for i, cs_item in enumerate(cs_array):
    print("[" + tag[i] + "]")
    cs_dic = {}
    for j, cs in enumerate(cs_item):
        if round(cs - 1.0, 5) != 0: #同じ文書同士は省きます
            cs_dic[tag[j]] = cs
    for k, v in sorted(cs_dic.items(), key=lambda x:x[1], reverse=True):
        print("\t" + k + " : " + str(v))

```

`vectorizer.fit_transform`には分かち書きされたコーパスを入れます。
英文ならそのままでいいのですが、日本語を扱う場合はKyTeaやMeCabなどの形態素解析器で事前処理する必要があります。`TfidfVectorizer`の`analyzer`に文字列から単語のリストを返す関数を入れてあげるとよしなにしてくれます。


それではまずタイトルの類似度から。以下の結果になりました。

```
[記事A]
	記事B : 0.0796837075168
	記事C : 0.0
	記事F : 0.0
	記事E : 0.0
	記事D : 0.0
[記事B]
	記事A : 0.0796837075168
	記事C : 0.0
	記事F : 0.0
	記事E : 0.0
	記事D : 0.0
[記事C]
	記事B : 0.0
	記事A : 0.0
	記事F : 0.0
	記事E : 0.0
	記事D : 0.0
[記事D]
	記事C : 0.0
	記事B : 0.0
	記事A : 0.0
	記事F : 0.0
	記事E : 0.0
[記事E]
	記事F : 0.0761939589717
	記事C : 0.0
	記事B : 0.0
	記事A : 0.0
	記事D : 0.0
[記事F]
	記事E : 0.0761939589717
	記事C : 0.0
	記事B : 0.0
	記事A : 0.0
	記事D : 0.0
```

めちゃくちゃ低い。
かろうじて数値が出ているのは共通する単語があるからですが、記事タイトルのような文字数が50前後ではほとんど意味がないようです。

続いて、本文。

```
[記事A]
	記事F : 0.116339901331
	記事E : 0.0903148251938
	記事B : 0.0647476418275
	記事D : 0.0610043219694
	記事C : 0.0
[記事B]
	記事F : 0.093777127132
	記事D : 0.0691690478983
	記事E : 0.0682122801956
	記事A : 0.0647476418275
	記事C : 0.00968545371698
[記事C]
	記事D : 0.0259359751168
	記事F : 0.0236032531769
	記事B : 0.00968545371698
	記事E : 0.00545867136345
	記事A : 0.0
[記事D]
	記事F : 0.220923615126
	記事E : 0.140726321125
	記事B : 0.0691690478983
	記事A : 0.0610043219694
	記事C : 0.0259359751168
[記事E]
	記事F : 0.423037184966
	記事D : 0.140726321125
	記事A : 0.0903148251938
	記事B : 0.0682122801956
	記事C : 0.00545867136345
[記事F]
	記事E : 0.423037184966
	記事D : 0.220923615126
	記事A : 0.116339901331
	記事B : 0.093777127132
	記事C : 0.0236032531769
```

関連記事である記事Eと記事Fは、この中ではダントツに類似度が高く現れています。
内容的にもどちらもFacebook内サービスの紹介なので、人が見た場合は`それっぽい`と言えそうです。
また、記事Dと記事Fも数値が出ています。これは、`動画`の単語がこの２つの記事に多く現れているためでしょうか。
記事Cに関わる数値が極端に小さいのは、他記事が3,000文字を超える中、記事Cが300文字以下とかなり少ないからだと思います。
Cos類似度は文字数によって大きく影響されることが分かりました。

###■Doc2Vec

続いてDoc2Vecを試してみます。
こちらは、[gensim](https://radimrehurek.com/gensim/)というtopic modelingに特化したPythonライブラリを使用します。もちろん、Word2Vecも求めることが出来ます。

```python
# -*- coding: utf-8 -*-

from os import path
import MeCab
from gensim.models.doc2vec import Doc2Vec
from gensim.models.doc2vec import TaggedDocument
from collections import OrderedDict

current_dir = path.dirname(__file__)
text = open(path.join(current_dir, 'titles.txt'), 'r').read()
# text = open(path.join(current_dir, 'documents.txt'), 'r').read()
documents = text.split("|")

def words(text):
    """
        文章から単語を抽出
    """
    out_words = []
    tagger = MeCab.Tagger('-Ochasen')
    tagger.parse('')
    node = tagger.parseToNode(text)

    while node:
        word_type = node.feature.split(",")[0]
        if word_type in ["名詞"]:
            out_words.append(node.surface)
        node = node.next
    return out_words


# 学習データとなる各文書
training_docs = []
for i, document in enumerate(documents):
    training_docs.append(TaggedDocument(words=words(document), tags=['doc' + str(i + 1)]))

# min_count=1:最低1回出現した単語を学習に使用
# dm=0: 学習モデル=DBOW
model = Doc2Vec(documents=training_docs, min_count=1, dm=0)

tags = OrderedDict() #辞書の繰り返し時による順番を保つ
tag_list = (('doc1', "記事A"), ('doc2', "記事B"), ('doc3', "記事C"), ('doc4', "記事D"), ('doc5', "記事E"), ('doc6', "記事F"))
dic = OrderedDict(tag_list)
tags.update(dic)

for k, v in tags.items():
    print("[" + v + "]")
    for items in model.docvecs.most_similar(k):
        print("\t" + tags[items[0]] + " : "+ str(items[1]))

```
こちらもscikit-learnと同様に、日本語を扱う場合は単語リストを作りましょう。
Cos類似度で使用した`words`をそのまま使いました。
（出力結果をCos類似度と合わせるために若干ややこしくなってます、、、）

それでは早速見ていきましょう。
タイトルの結果からどうぞ。

```
[記事A]
	記事B : 0.2011023908853531
	記事E : 0.011074036359786987
	記事C : -0.010294390842318535
	記事F : -0.023472007364034653
	記事D : -0.08041443675756454
[記事B]
	記事A : 0.2011023908853531
	記事C : -0.010408895090222359
	記事D : -0.06356324255466461
	記事E : -0.07996334880590439
	記事F : -0.10177601873874664
[記事C]
	記事E : 0.0982491672039032
	記事A : -0.010294398292899132
	記事B : -0.01040889136493206
	記事D : -0.06354575604200363
	記事F : -0.1542533040046692
[記事D]
	記事E : 0.057576991617679596
	記事F : 0.00933074951171875
	記事C : -0.06354574114084244
	記事B : -0.06356324255466461
	記事A : -0.08041443675756454
[記事E]
	記事C : 0.0982491672039032
	記事D : 0.057576995342969894
	記事A : 0.011074036359786987
	記事F : -0.034924156963825226
	記事B : -0.07996334880590439
[記事F]
	記事D : 0.0093307513743639
	記事A : -0.023472007364034653
	記事E : -0.034924156963825226
	記事B : -0.10177601873874664
	記事C : -0.15425331890583038
```

Cos類似度では0~1の値を取りますが、Doc2Vecでは-1~1の値が返ってきます。
先程は記事Aと記事Bの類似度がもっとも高かったのですが、
Doc2Vecでも同様の結果となりました。

```
記事A : 知りたい情報にすぐたどり着ける！Yahoo!・Googleの便利な検索術を解説
記事B : 実際何が違うの？IoTとM2Mの定義の解説＆事例紹介
```

確かにどちらも２つの文で構成されており、何かの解説の記事だという点では類似しています。
次に値が高い（と言えるかはかなり怪しいですが）記事Cと記事Eは、カギカッコで特定のキーワードを強調し、新しいものに関するサービスであることが分かります。

```
記事C : 「“α Plaza”オープン」 プロフェッショナルをはじめとした全てのαユーザーの創作活動をワンストップで支援
記事E : Facebookが10月にリリースした新サービス！法人版の社内SNS「Workplace」を使う3つのメリット
```

次は本文です。

```
[記事A]
	記事B : 0.18122510612010956
	記事E : 0.015913434326648712
	記事F : -0.016436520963907242
	記事D : -0.24164748191833496
	記事C : -0.8404514193534851
[記事B]
	記事A : 0.18122510612010956
	記事F : -0.43511077761650085
	記事E : -0.5792118310928345
	記事C : -0.5943235158920288
	記事D : -0.6153969168663025
[記事C]
	記事D : 0.5334291458129883
	記事E : 0.020014554262161255
	記事F : -0.04789729043841362
	記事B : -0.5943235158920288
	記事A : -0.8404514193534851
[記事D]
	記事C : 0.5334291458129883
	記事E : 0.15914341807365417
	記事F : -0.07511717826128006
	記事A : -0.24164746701717377
	記事B : -0.6153969168663025
[記事E]
	記事F : 0.893048882484436
	記事D : 0.15914341807365417
	記事C : 0.020014554262161255
	記事A : 0.01591343805193901
	記事B : -0.5792118310928345
[記事F]
	記事E : 0.893048882484436
	記事A : -0.016436513513326645
	記事C : -0.04789729416370392
	記事D : -0.07511717826128006
	記事B : -0.43511077761650085
```

関連記事である記事Eと記事Fが最も高い値を出しました。
ここまでは「うーん、なんかそれっぽいと言われればそうだし、違うとも言えるし。。。」
という感じでしたが、やっと信頼できるものが出てきて一安心です。

が、次に類似度の高いものは、記事Cと記事Dなのですが、この２つがなぜまぁまぁ高い値が出ているのかは正直分かりませんでした。
Cos類似度でもあったように、極端に文字数が少ないと比較する語自体が少ないので、少しでも似た文章があると、高い数値（外れ値的な？）が出てしまうのではないかと思います。


##まとめ
似ているだろう、という類似度を出すことは出来ましたが、一概にどちらが良いとは言えませんでした。
今回は品詞のなかでも名詞のみ、オプションの設定もほぼデフォルトで実行しましたが、例えばストップワードを追加して余計な語を取り除いたり、同じ単語ではあるけどプログラム上で扱うには難しいもの（ex.申し込み-申込み）も考慮することで、理想的な結果を求められる（作り出せる）ことが分かりました。

日本語はやっぱり難しい。