ラーメンと自然言語処理

261
-1

Published on

大好きなラーメン食べ歩きの効率を劇的に上げるべく、自然言語処理とR言語の勉強がてらラーメン屋さんのクラスタリングを行ってみた話。
自然言語処理は素人に近いので分析の妥当性はちょっと不安っていうか合ってるか否かもよくわからんが、のれん分けを自動で(たまたま?)見つけたりしながら分析を進めた過程を共有できればと思います。

Published in: Data & Analytics

ラーメンと自然言語処理

  1. 1. ラーメンと自然言語処理
  2. 2. 2 おことわりヽ(́ー`)ノ 本スライドには発表者個人の嗜好による 差別的な表現が含まれている場合があります。 あくまで個人の嗜好によるものであり、 該当のラーメンそのものの一般的な価値を否定するものではございません。 ラーメンに対する愛の裏返しであると予めご了承頂きたく、 ご理解の程、よろしくお願いします。
  3. 3. 3 おことわり その弐 発表者は自然言語処理に関して素人です。 使ってる手法がどれほど妥当か否かは把握できていないため、 その点に留意して、あくまで Entertainment として楽しんで頂ければ幸いです。 あと上記のような背景のため、 切れ味鋭いマサカリはご容赦頂けると幸甚です!
  4. 4. 4 それでは本編に参りましょう
  5. 5. 5 みなさまふくめ
  6. 6. 6 全日本国民の95%以上が
  7. 7. 7 夜も眠れぬほど悩まれていらっしゃると思いますが
  8. 8. 8 皆さん日々悩まれていると思いますが… ラーメンほど人のおすすめを 信用出来ないものはない 相当味覚が同じ人に教えてもらっても、   なかなかいい店にめぐりあいません。     こういう時にネットが役立つはずなのですが   問題点があると言わざるをえないのが現実です…。
  9. 9. 9 課題感は今更目線合わせする 必要もちゃんちゃらないと思いますが
  10. 10. 10 私の事例① 私の事例を元に、問題点の再確認をしておきましょう。
  11. 11. 11 私の事例① 事例①
  12. 12. 12 私の事例① 東京で 有名なつけ麺屋さんに、 「一燈」 「道」 ってのがあるって聞いて 両方食べに行ったのですが、
  13. 13. 13 私の事例① 個人的には(※) 「一燈」>>(越えられない壁)>>「道」 だと思いました。 がしかし…、 ※あくまで個人的な意見です。
  14. 14. 14 食べログのラーメンの点数って… ( ゚д゚)
  15. 15. 15 食べログのラーメンの点数って… (つд⊂)ゴシゴシゴシ 
  16. 16. 16 食べログのラーメンの点数って… ( ゚д゚)  ( ゚д゚)( ゚д゚)( ゚д゚)( ゚д゚)
  17. 17. 17 私の事例② 事例②
  18. 18. 18 こんなこともありました。 まだ京都に住んでいる時、 家の近くにラーメン屋さんが出来ました。 ろくに調べずに行ったら、 私の舌には全然あわない不味いラーメンが…(※) 「あー、失敗したなー、  食べログ見てから行くべきだったなー」 って、食べログで調べると… ※あくまで個人的な意見です。
  19. 19. 19 こんなこともありました。
  20. 20. 20 こんなこともありました。
  21. 21. 21 こんなこともありました。
  22. 22. 22 3.56
  23. 23. 23
  24. 24. 24 まぁまぁ といってても仕方ないので ー
  25. 25. 25 ラーメンのマッチングがうまくいかないことは   少子化より問題だと思いますか? 僕もココです ラーメンを探す全く新しいサービスが、 いま、日本にいちばん必要。
  26. 26. 26 じゃあどうするか?
  27. 27. 27 パーソナライズ! ラーメンを分析し   ユーザーに合わせ   レコメンデーション  
  28. 28. 28 さて、ここからはまじめにやります。
  29. 29. 29 問題解決の想定手法(仮説) 1.  各ラーメン店のラーメン空間(仮称)の分布を求める   2.  分布図を用いて店をクラスタリング   3.  各クラスタに対する各ユーザーの嗜好性計算   4.  各ユーザーにオリジナルのランキングの提示 パーソナライズの方法
  30. 30. 30 何言ってるかわからないと思うので   図解させていただきます
  31. 31. 31 問題解決の想定手法(仮説) 1.  各ラーメン店のラーメン空間の分布を求める  
  32. 32. 32 問題解決の想定手法(仮説) 2.  店をクラスタリング  
  33. 33. 33 問題解決の想定手法(仮説) 3.  各クラスタに対する各ユーザーの嗜好性計算
  34. 34. 34 問題解決の想定手法(仮説) 4.  各ユーザーにオリジナルのランキングの提示 1.  ベースのランキング点 (◎べ◎グ/R○t○y等をベース)   2.  レコメンドスコア = 基本点 +  調整点(ユーザ別)   3.  降順ソート      ~~各ユーザー個別のランキング作成!~~     ※当然、地域や営業日で絞込できるように各種機能足す
  35. 35. 35 ここから実際に作業していきます
  36. 36. 36 問題解決方法(再掲) 1.  各ラーメン店のラーメン空間の分布を求める   2.  分布図を用いて店をクラスタリング   3.  各クラスタに対する各ユーザーの嗜好性計算   4.  各ユーザーにオリジナルのランキングの提示
  37. 37. 37 問題解決方法(再掲) グルメサイト等のクローリング (Ruby) 自然言語処理による口コミの解析 (R) カテゴライズ等のデータ処理  (R) 1.  各ラーメン店のラーメン空間の分布を求める   2.  分布図を用いて店をクラスタリング   3.  各クラスタに対する各ユーザーの嗜好性計算   4.  各ユーザーにオリジナルのランキングの提示
  38. 38. 38 問題解決方法(再掲) ひたすらDBの処理するだけ(多分)   Excelベースで出来たものまで見せます 1.  各ラーメン店のラーメン空間の分布を求める   2.  分布図を用いて店をクラスタリング   3.  各クラスタに対する各ユーザーの嗜好性計算   4.  各ユーザーにオリジナルのランキングの提示 グルメサイト等のクローリング (Ruby) 自然言語処理による口コミの解析 (R) カテゴライズ等のデータ処理  (R)
  39. 39. 39 問題解決方法(再掲) 1.  各ラーメン店のラーメン空間の分布を求める   2.  分布図を用いて店をクラスタリング 3.  各クラスタに対する各ユーザーの嗜好性計算   4.  各ユーザーにオリジナルのランキングの提示 Rubyによるグルメサイト等のクローリング Rを用いた口コミの解析 w/  自然言語処理
  40. 40. 40 とはいえ ラーメン空間での分布(座標)    なんてどうやって計測するの? 本 当      ?
  41. 41. 41 座標なんてどうやって見つけるの? 発想法:みんなの意見は案外正しい。
  42. 42. 42 座標なんてどうやって見つけるの? 大規模グルメサイトの口コミ文章とか 検索エンジンが返す検索結果の文章解析したら 店の特徴とかわかりそうじゃね? 「一燈」は “魚介”  出まくり   味噌ラーメン店なら「みそ、こってり、コク」とか? 醤油ラーメン店なら「あっさり、醤油、辛い」とか?  
  43. 43. 43 自然言語処理でできそうじゃね? 大規模グルメサイトの口コミとか検索エンジンの 検索結果の文章解析したらわかりそうじゃね? 出来る方法あった!(LSIという技法) というわけでネット上で文章集めて解析する
  44. 44. 44 口コミ文章の解析 口コミを以下のように料理しました。 (クローリング:Ruby / 解析:Rを利用) 1.  収集   2.  分解   3.  集計   4.  調整   5.  解析     (座標値計算)  
  45. 45. 45 口コミ文章の解析 口コミを以下のように料理しました。(クローリング:Ruby / 解析:Rを利用) 1.  収集   2.  分解   3.  集計   4.  調整   5.  解析     (座標値計算)   〜詳細は割愛します〜
  46. 46. 46 口コミ文章の解析 口コミを以下のように料理しました。(クローリング:Ruby / 解析:Rを利用) 1.  収集   2.  分解   3.  集計   4.  調整   5.  解析     (座標値計算)   〜詳細は割愛します〜
  47. 47. 47 口コミ文章の解析 口コミを以下のように料理しました。(クローリング:Ruby / 解析:Rを利用) 1.  収集   2.  分解   3.  集計   4.  調整   5.  解析     (座標値計算)   〜詳細は割愛します〜
  48. 48. 48 口コミ文章の解析 口コミを以下のように料理しました。(クローリング:Ruby / 解析:Rを利用) 1.  収集   2.  分解   3.  集計   4.  調整   5.  解析     (座標値計算)   日本語は単語に切れ目がない     →切ってやらないと機械で処理ができない
  49. 49. 49 口コミ文章の解析 各店舗毎に、口コミを以下のように料理しました。 1.  収集   2.  分解   3.  集計   4.  調整   5.  解析     (座標値計算)   ・接続詞などはカウントしない (“だが””しかし”  etc,)   ・1回しか出てこないような誤記(やレアワード)は無視
  50. 50. 50 口コミ文章の解析 各店舗毎に、口コミを以下のように料理しました。 1.  収集   2.  分解   3.  集計   4.  調整   5.  解析     (座標値計算)   ・あまり出てこないワードを優遇(TF-­‐IDF) ・口コミが多い店は単語の出現回数が多くなるので調整
  51. 51. 51 口コミ文章の解析 面倒くさそうですが… 1.  収集   2.  分解   3.  集計   4.  調整   5.  解析     (座標値計算)   DM <- docMatrix("./", pos=c("名詞", "形容詞", "副詞"),                                              weight="tf*idf*norm", minFreq=2) R のライブラリ使えば、2~4の作業が1行!   (正確にはライブラリ読込あるので2行だけど)  
  52. 52. 52 口コミ文章の解析 面倒くさそうですが… 1.  収集   2.  分解   3.  集計   4.  調整   5.  解析     (座標値計算)   DM <- docMatrix("./", pos=c("名詞", "形容詞", "副詞"),                                              weight="tf*idf*norm", minFreq=2) 解析に使用する   品詞の指定 tf*idf:TF-­‐IDF   norm:口コミ数の調整 最低2回出てきた   ワードを使用   R のライブラリ使えば、2~4の作業が1行!   (正確にはライブラリ読込あるので2行だけど)     ☆RMeCab    ・Rから形態素解析エンジンMeCabを使うためのライブラリ    ・形態素解析エンジンを使った後の集計処理にも優れる  
  53. 53. 53 口コミ文章の解析 で、LSIを使った座標値の計算。今回は10次元空間にマッピング。 1.  収集   2.  分解   3.  集計   4.  調整   5.  解析     (座標値計算)   各ラーメン店の口コミに 「どのようなワードが出てきやすいのか?」 という表(行列)さえ作れれば、 あとは LSI (潜在的意味インデキシング) という 技法の行列分解を行えば、 座標が一瞬で出ます。
  54. 54. 54 口コミ文章の解析 で、LSIを使った座標値の計算。今回は10次元空間にマッピング。 1.  収集   2.  分解   3.  集計   4.  調整   5.  解析     (座標値計算)   DM.svd <- svd(DM) DM_small <- t(DM.svd$u[,1:dimension]) %*% DM LSI  も R  を使えば2行。   複雑な行列分解も一瞬です。     簡単ですねヽ(´ー`)ノ  
  55. 55. 55 口コミ文章の解析 LSI?なにそれ美味しいの? 1.  収集   2.  分解   3.  集計   4.  調整   5.  解析     (座標値計算)   話飛ばし過ぎたのでちょっと理論的な…   •  LSI  は検索などに用いられる次元圧縮手法。   •  例えば、以下は意味として全く同じ   •  「車で行く」   •  「自動車で行く」   •  単語そのものを見ると「車」と「自動車」が異なるため違 う文として扱われてしまう   •  「車」で検索しても「自動車で行く」という文がヒットしま せん。しかし、「車」も「自動車」も同じ意味なので同じ 文として扱われるようにしたいですよね。   •  これを実現する手法の1つが LSI です。 出典:http://d.hatena.ne.jp/a_bicky/20120324/1332591498  
  56. 56. 56 口コミ文章の解析 LSI?なにそれ美味しいの? 1.  収集   2.  分解   3.  集計   4.  調整   5.  解析     (座標値計算)   話飛ばし過ぎたのでちょっと理論的な…   •  LSI の肝は特異値分解で、特異値分解さえ理解でき れば9割方理解したようなものです。   •  特異値分解はランク r  の D  という m  x  n  の行列を次の ような3つの行列に分解します。   •  ここで、U  は m  x  r  の列直交行列*3、V  は n  x  r  の列 直交行列、Σは対角要素に特異値σiを降順に並べた r   x  r  の対角行列です。*4 •  式 (1)  に対して重み行列 W  を導入すると、   このあたりの理論の話だけで   軽く数時間はかかるため     中略…m(_  _)m   というのは言い訳で、   私、細かい理論の把握を出来ていません。     あ、ていうか使っている手法合ってるかどうか   全然わかってないのであんまりこの発表の内容を   参考にしないで下さいww   すみません…(´・ω・`)     出典のページが詳しいです。     出典:http://d.hatena.ne.jp/a_bicky/20120324/1332591498  
  57. 57. 57 口コミ文章の解析 LSI?なにそれ美味しいの? 1.  収集   2.  分解   3.  集計   4.  調整   5.  解析     (座標値計算)   話飛ばし過ぎたのでちょっと理論的な…   •  LSI の意味するところですが、機械学習でいう過学習を 緩和するようなものだと思います。   •  表現力が豊富なために文書を詳細まで表現できすぎて、 本来似ている文書も違った文書として表現できてしまう。   •  そこで、重要度の低い情報を削減することで、本来似て いる文書の分類をうまく行うことができる。   •  分類するための軸も選定してくれるため、     今回、ラーメン研究で採用しました(・∀・)   出典:http://d.hatena.ne.jp/a_bicky/20120324/1332591498  
  58. 58. 58 というわけで 以下の流れで、ラーメン空間が定義できました。 1.  収集   2.  分解   3.  集計   4.  調整   5.  解析     (座標値計算)   結果を見てみましょう。
  59. 59. 59 解析結果の確認 マッピングできました! X軸  Y軸  Z軸  W軸  V軸  U軸  A軸  B軸 ・・・
  60. 60. 60 解析結果の確認 マッピングできました! ・各店舗を10次元空間にマッピングできた   (10次元空間上の座標を持っている)     ・AFURI系列店は似た座標となった   X軸  Y軸  Z軸  W軸  V軸  U軸  A軸  B軸 ・・・
  61. 61. 61 解析結果の確認 店名は要素として全く使ってないのに、チェーン店を似た座標に配置できた? X軸  Y軸  Z軸  W軸  V軸  U軸  A軸  B軸 ・・・ •  と思ったのですが、多分口コミの中に出てくる店名のキーワードと かもある程度考慮しちゃってるのかなーって言う感じ。   •  余談ながら金久右衛門(きんぐえもん)は大阪の醤油ラーメンの名 店で、私が愛するラーメン屋の一つ。
  62. 62. 62 解析結果の確認 ところで、軸って何をあらわしてるの? X軸  Y軸  Z軸  W軸  V軸  U軸  A軸  B軸 ・・・
  63. 63. 63 解析結果の確認 空間の軸の定義 X軸  Y軸   Z軸  W軸  V軸  U軸  A軸  B軸 ・・・
  64. 64. 64 解析結果の確認 空間の軸の定義 ・ラーメン店分類で重要なワード群    =群衆がラーメン店の特徴を表す際によく使うワード     ・口コミから LSI  が自動で選択してくれる     ・人々は”二郎”や”家系”といった単語を、    ラーメン店の特徴を表すのに使用していると分かる     ・影響度の高い順に並べ替えてある   X軸  Y軸   Z軸  W軸  V軸  U軸  A軸  B軸 ・・・
  65. 65. 65 X軸  Y軸   Z軸  W軸  V軸  U軸  A軸  B軸 ・・・ 解析結果の確認 空間の軸の定義 ・空間軸の定義    (どのような特徴を持っている店が    各軸で座標値が大きくなるか)     例:   ・V3(Z軸)だと 塩ラーメンや鶏ガラ     のラーメン店の座標が大きくなる   ・V4(W軸)だと二郎系の  〃  
  66. 66. 66 解析結果の確認 空間上にマッピングできたので、距離(*)を求めることができる。 よって、「店Aに似てる店ランキング」を容易に作成可能。 支店→ (*正確には類似度) 支店→ ?→
  67. 67. 67 解析結果の確認 末廣ラーメン本舗?聞いたこともねえ。
  68. 68. 68 解析結果の確認 末廣ラーメン本舗?聞いたこともねえ。(ぐぐってみた。)
  69. 69. 69
  70. 70. 70 解析結果の確認 のれん分けの店が自動的に発見できた。 のれん分け だー!
  71. 71. 71 補足ながら 見た目も似てるね。(今後、ラーメンの見た目から分類とかもできるかも…) 末廣ラーメン本舗→ 新福菜館→
  72. 72. 72 問題解決方法(再掲) 座標が出せたので、次はクラスタリングです。 1.  各ラーメン店のラーメン空間の分布を求める   2.  分布図を用いて店をクラスタリング 3.  各クラスタに対する各ユーザーの嗜好性計算   4.  各ユーザーにオリジナルのランキングの提示
  73. 73. 73 クラスタリングは楽勝? 座標さえ出ていれば、後は比較的簡単。 この本で読んだことある、 K-meansクラスタリングで瞬殺! ↓の説明わかりやすいのでここでは省略。 http://tech.nitoyon.com/ja/blog/ 2009/04/09/kmeans-­‐visualise/  
  74. 74. 74 うまくいかない… K-meansクラスタリングで瞬殺!と思ってましたが、なんかおかしい…。
  75. 75. 75 うまくいかない… 全然違うラーメンが同じクラスター(5番クラスター)に分類されている。 ただのこってりラーメン   (京都の恥※) コクうま醤油ラーメン   (大阪の誉れ) ※あくまで個人的な意見です。
  76. 76. 76 調べ倒した結果、わかったこと。 K-meansには苦手な形の分布もある。(渦巻きとか)
  77. 77. 77 改善策 スペクトラル・クラスタリングってやつだと、複雑な分布でもうまく出来るらしい。
  78. 78. 78 なんでうまくいくの? スペクトラルクラスタリングのざっくりした説明
  79. 79. 79 なんでうまくいくの? スペクトラルクラスタリングのざっくりした説明 よくわかりませんが     点と点のつながりを考慮してやると     うまくいくらしい…。  
  80. 80. 80 とりあえず実装してみた 内容よくわからなかったけど、とりあえず実装してみた。
  81. 81. 81 とりあえず実装してみた 内容わかってないのに、実装できるの?
  82. 82. 82 とりあえず実装してみた できました!
  83. 83. 83 そう、R ならね。
  84. 84. 84 R:驚異のライブラリ群 わずか1行で実装。 (データ処理とか足しても3行) 中身よくわかってないから怒られるかもだけど…! 1行目:ライブラリ呼び出し   2行目:座標データ読込   3行目:スペクトラル・クラスタリング実行 ← ここがクラスタリング        (引数1:座標データを指定式へ変換、引数2:クラスタ数指定)
  85. 85. 85 うまくいきました☆(ただし更なる改善の必要はある) うまく分けられた。 ただし、チェーン店がすべて同じクラスタに入らなかったのは不満。
  86. 86. 86 参考:マッピング 10次元空間を2次元空間に投影してみた。
  87. 87. 87 参考:マッピング 10次元空間を2次元空間に投影してみた。 が、一部に空間のねじれが生じるのか、上手く二次元に表現できない。(今後の課題)
  88. 88. 88 問題解決方法(再掲) 1.  各ラーメン店の座標を求めてやる   2.  店をクラスタリング   3.  各クラスタに対する各ユーザーの嗜好性計算   4.  各ユーザーにオリジナルのランキングの提示
  89. 89. 89 忘れていると思いますので再掲… 4.  各ユーザーにオリジナルのランキングの提示 1.  基本ランキング (食◎◎グや●e●ty等をベース)   2.  レコメンドスコア = 基本点 +  調整点(ユーザ別)   3.  降順ソート      ~~各ユーザー個別のランキング作成!~~  
  90. 90. 90 問題解決の想定手法(再掲) ここで使う調整点の計算方法です。 1.  基本ランキング (食べ◎グ等をベース)   2.  レコメンドスコア = 基本点 +  調整点(ユーザ別)   3.  降順ソート      ~~各ユーザー個別のランキング作成!~~  
  91. 91. 91 ユーザ別調整点? 計算フロー 1.  サイトがユーザーへラーメン店の提示   2.  ユーザーが その店に LIKE/DISLIKE/UNKNOWN  をつける   3.  サイトがユーザーの回答に応じ、ラーメン店に紐づく     各カテゴリへLIKE/DISLIKEのスコアをためていく(ユーザー 毎)   4.  一定以上の回答を集めた段階で、     ユーザーのカテゴリ調整点を決める   サイト:ユーザーはん、藤しろ   (クラスタ24)はどないや?  
  92. 92. 92 ユーザ別調整点? 計算フロー サイト:ユーザーはん、藤しろ   (クラスタ24)はどないや?   ユーザー:好きやで~(・∀・)   1.  サイトがユーザーへラーメン店の提示   2.  ユーザーが その店に LIKE/DISLIKE/UNKNOWN  をつける   3.  サイトがユーザーの回答に応じ、ラーメン店に紐づく     各カテゴリへLIKE/DISLIKEのスコアをためていく(ユーザー 毎)   4.  一定以上の回答を集めた段階で、     ユーザーのカテゴリ調整点を決める  
  93. 93. 93 ユーザ別調整点? 計算フロー サイト:ユーザーはん、藤しろ   (クラスタ24)はどないや?   ユーザー:好きやで~(・∀・)   サイト:(´-­‐`).。oO(この人は クラスタ23に+1やな)   1.  サイトがユーザーへラーメン店の提示   2.  ユーザーが その店に LIKE/DISLIKE/UNKNOWN  をつける   3.  サイトがユーザーの回答に応じ、ラーメン店に紐づく     各カテゴリへLIKE/DISLIKEのスコアをためていく(ユーザー 毎)   4.  一定以上の回答を集めた段階で、     ユーザーのカテゴリ調整点を決める  
  94. 94. 94 ユーザ別調整点? 計算フロー サイト:ユーザーはん、藤しろ   (クラスタ24)はどないや?   ユーザー:好きやで~(・∀・)   サイト:(´-­‐`).。oO(この人は クラスタ23に+1やな)   サイト:(´-­‐`).。oO(ユーザAはんのデータ、5店舗分ぐら いあつまったな。ユーザAはんは、クラスタ20~24は   加点、クラスタ1~15は減点するか)   1.  サイトがユーザーへラーメン店の提示   2.  ユーザーが その店に LIKE/DISLIKE/UNKNOWN  をつける   3.  サイトがユーザーの回答に応じ、ラーメン店に紐づく     各カテゴリへLIKE/DISLIKEのスコアをためていく(ユーザー 毎)   4.  一定以上の回答を集めた段階で、     ユーザーのカテゴリ調整点を決める  
  95. 95. 95 嗜好性計算のルール スコアリングの効率をあげるため、以下のルールで行う。 ³  スコアがいい店を好き:あまり気にしない ³  スコアが悪い店を好き:大きく+評価 ³  スコアがいい店を嫌い:大きくー評価 ³  スコアが悪い店を嫌い:あまり気にしない              ※各種係数は、とりあえず勘コツで決めてしまう(・ ・)
  96. 96. 96 問題解決方法(再掲) 1.  各ラーメン店の座標を求めてやる   2.  店をクラスタリング   3.  各クラスタに対する各ユーザーの嗜好性計算   4.  各ユーザーにオリジナルのランキングの提示
  97. 97. 97 さて、準備は整いました (ここまでお疲れ様でした)
  98. 98. 98 今のところ、残念ながらサービス作ってませんが、
  99. 99. 99 実装済 レコメンドエンジンは Rを凌駕する史上最高の解析ツールで 既に実装済みです
  100. 100. 100 実装済 Rを凌駕する史上最高の解析ツール?
  101. 101. 101 実装済 複雑なコードを書かなくても DBとか作らなくても 簡単にデータ処理&可視化ができる
  102. 102. 102 そう、EXCELならね。
  103. 103. 103 EXCEL_DEMO
  104. 104. 104 まとめ 【出来たこと】 ü  口コミに自然言語処理を適用し、ラーメン空間上の座標計算が出来た。 ü  ラーメン座標を利用し、ラーメン店のクラスタリングや類似店舗検索が出来た。 ü  ラーメン店のクラスタリングデータを使い、レコメンドエンジンの基幹部を 作った。 【今後やりたいこと】 ü  使った手法の理論的背景の勉強 (今からかよ!って言わないで。) ü  Word2Vec等の分散表現を利用した新しい手法の研究 ü  サービスを作った際にマネタイズ出来ないか考える。
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×