コサイン類似度とかの話

少し間が空いてしまいました 

少しずつ技術的な話も増やしてきいきたいですね. (ネタに走らず雑味カット路線)

 

あるユーザーが読んだ本をまとめていくと、そのユーザーの趣味って出てきそうですよね

例えば...

[漫画:100%]

[小説:60%, ライトノベル:40%]

[ビジネス・経済・就職:30%, 人文・思想・社会:30%, 科学・医学・技術: 40%]

 

自分の本棚を見て、ヒヤリともしたり

 

こういった割合を、ユーザーごとにベクトルでまとめること(特徴ベクトル化)をしてみます. 特徴ベクトル化することで、コサイン類似度*などの計算も出来ますね.

*ベクトルごとの近さを数値化します

 

たとえば本のカテゴリー情報を元に、

ユーザーの読書履歴を純粋に特徴ベクトル化するなら、(0, 0, 0, 1, 0, 0, 0, ...)等と、

読んでいない本も含めてカテゴリーを全部取得しないといけません.

 

ただ0ばっかり(疎)のベクトルを愚直に用いるのもどうなのか。

ベクトル各々をDBに保存する形式をどうするか...ということにも迷いが生じました.

 

今回は、特徴ベクトルをjson形式でDBに格納して、

コサイン類似度を連想配列に一度戻して計算することを考えました.

 

(下記はphpサンプルコード)

$query = json_encode($query);

 

function norm($v){

  $sumsq = 0;

  foreach($v as $key => $value){

    $sumsq += pow($value,2);

  }

  return pow($sumsq,0.5);

}

 

function cosSim($json1, $json2){

  //内積 inner product

  $i_p = 0;

  //引数としてjsonを受け取る.

  $a=json_decode($json1,true);

  $b=json_decode($json2,true);

 

  $l = sizeof($a) < sizeof($b) ? $a : $b;

  foreach($l as $key => $value){

    if(isset($a[$key]) && isset($b[$key]))

      $i_p += $a[$key]*$b[$key];

  }

  return ($i_p/(norm($a)*norm($b)));

}

 

自分のコードを晒すのに全然慣れませんが

そろそろ、自分が書いたものには責任を取らないとですね( ・д・)怖い.

 

第三回ミーティングとかあったなあ

こんにちは!

 

今日諸事情により吉田南のメディセンから7号館まで(GoogleMapによると1km、体感的にはもっと長かった・・・、そして恥ずかしい)全力疾走して頭が痛い(酸欠)の武田です。

 

待ちに待った第三回ミーティング(10/16)のことについて書きたいと思います。

 

このミーティングでは以下のことが決まりました!パチパチ。

  • おおまかなアプリ内容
  • チーム名

 

チーム名については過去記事を参照してください。

 

アプリ内容はずばり、一筆書きを用いたランダム商品検索です!

ランダム検索とは言ってもある程度はユーザが検索したい内容を選べる、そんな検索を目指したところ、クエリとして一筆書きを用いるということになりました。

検索対象ですが人が意図的に集めたリストです。例えばリストマニアがそうです。リストマニアとは「amazon.co.jpの機能。ユーザが関連商品をまとめることができる。1リストに25まで商品を登録できる」(はてなキーワード)です。

人が集めたリストというのはランキングなどとは違った価値があると思います。

このようなリストの検索として、一筆書きを用いた曖昧な検索を行うことが良いのではないかと考えました。

 

ただ、ここで一つ問題が・・・

AmazonAPIはスマホ等には使用できないそうです。。。

 

次回ミーティングまでにこの問題を調査しよう!ということで今回のミーティングはお開きです!

 

それでは。

第2回ミーティングのこと

こんにちは!

 

駆け足で、あたかも怒涛の更新をしているかの如く、振り返っていこうと思います。

 

 

-----(前回までのあらすじ)

アプリの案をごちゃごちゃと散らかし

「イケるんじゃね!?」と心きらめかせ

これは、今までにない...と何処から来たか分からぬ自信を覗かす

 

そんなチームhitodeは第二回のミーティングに満を持して望むのでした。

-----

 

さて、前回のミーティングにて、各自のアイデアを出しました。

 

各人の好みも、ちらりと覗かせる...そんな第1回目のミーティングで出た様々な案を元に、

 

アプリ案が、どう広がりを見せるかを検討した第二回。

 

 

 

 

 

 

...収 集 が つ か な い 笑

 

 

 

何か、技術的/アイデアの強みを押し出そうとして、そのアイデアに縛られたり、

日が経つと、妙に冷静に(・ω・)なってしまい、現実的にこれはうまくいく/間に合うのだろうか...と考えてしまったりで、

なかなか一つに決めきれないまま、ミーティング終了時間を迎えてしまうのでした。

全員が「コレだ!」と決めきれないと、モチベーションがさよならしてしまう危険性。

 

アプリ案を出して、決める際に、最低限考えるべきことって何でしょうか?

新規性? 操作性? 扱うシチュエーション?ターゲット層?収益性?インパクト?

...色々あるのでしょうが、その中でどれに重きを置くのがよいか。

判断が人それぞれで、正しい方向が分からない。。うーん難しい!

 

第三回に向けて、扱いうるAPIを触って、うまくいきそうかを各自試してこよう!

とかなんとかで、次回に続くのです。

第1回ミーティング

こんにちは!

チーム「hitode」です

どうぞよろしくお願いします

 

【チーム名「hitode」の由来】

私たちが

  • みんなのまとめ役としての存在、インテリジェンスなSさん
  • THE安定にTHEイケメンな、しかもクレバーなエンジニアのTさん
  • 日本語は今からって感じかもだけど、まあ3カ国語を使いこなすWさん
  • 話すことが好きそうな、メンバー唯一の女性であるHさん
  • 最後に、とりあえず毎日楽しく過ごすことしか考えていない私N

                 (↑※すべて、個人的な価値観に基づいています)

という ” 5人 ” から成り立っていて

一般的にhitode(=海星)は"5つの腕を持っているので

5人が皆協力して

海星のように1つになって

よいものを作っていこう!!!!!

的な、まあまあこじつけで決まったものです(笑)

でも、これもかなり長考の末出たものですよ

チーム名って難しいですねー

 

 

【どんなアプリにするか】

初めてのミーティングであったため

みんなで

どんなアプリが作りたいかを洗出していきました

  • 地図APIを使用するもの
  • 語学勉強系
  • シェアサービス系
  • 検索系
  • おもしろアプリ

他にも

こんな技術を利用してみたい!

などと

どんどん発散していきました

 

 

次回は収束に向かう感じで

よいミーティングができたらいいと思います

ではまた.

f:id:hitode_sadp:20141027130616p:plain