Upgrade to Pro — share decks privately, control downloads, hide ads and more …

グラフデータベース Neo4j によるレコメンド /POL-TechLab-LT-1

グラフデータベース Neo4j によるレコメンド /POL-TechLab-LT-1

Published on Mar 31, 2021

TechLab LT会 #1 - connpass, https://pol-inc.connpass.com/event/208421/
LT② グラフデータベース Neo4j によるレコメンド

社内で取り組んでいた Neo4j を使ったレコメンドの簡単な紹介と簡単な実践について.

詳細: グラフデータベース Neo4j を使ってアニメをレコメンドしてみた - Qiita, https://qiita.com/kohei-shinden/items/e1c1fbc0a90a9fd7ecb9

Kohei Shinden

March 31, 2021
Tweet

More Decks by Kohei Shinden

Other Decks in Technology

Transcript

  1. • グラフ構造のデータベース ‒ グラフとは要素(頂点)間の関係を表す線からなる数学理論 グラフデータベースとは? 3 [1] グラフ理論 ‒ Wikipedia,

    http://ja.wikipedia.org/w/index.php?curid=429680(Access: 2020.03.31) [2] Neo4j Graph Platform ‒ The Leader in Graph Databases, https://neo4j.com/ (Access: 2020.03.31) 6つの節点と7つの辺から成るグラフの⼀例[1] ノード エッジ グラフデータベースによる構成の⼀例[2] ノードによって「商品,カテゴリ,注⽂,供給者,顧客」を表現 ノード間の関係性をエッジとして表現 要素として プロパティがあり 属性情報を表現 { id: 100, age: 22, ...} データ間の関係性を格納できる
  2. • データ間の関係性によって直感的なレコメンドが可能 グラフデータベースの利点 4 ユーザ1 ユーザ2 ユーザ3 アイテム1 アイテム2 アイテム3

    関係性: ⾼評価 例: 動画サイトにおける商品評価 {Rate: 2} ユーザ アイテム 評価 グラフデータ ベースによる 表現 … • 同じアイテムを評価しているユーザ同⼠は類似する可能性が⾼い • あるユーザが未評価のアイテムの中で類似ユーザが評価している アイテムは有益なアイテムである可能性が⾼い
  3. • 実際にユーザのアニメ評価データを使ってレコメンドを実践 ‒ Kaggle の Anime Recommendations Database[3] を利⽤ アニメデータでレコメンドしてみる

    5 [3] Anime Recommendations Database | Kaggle, https://www.kaggle.com/CooperUnion/anime-recommendations-database (Access: 2020.03.31) anime_id name genre type episodes rating members 32281 Kimi no Na wa. "Drama, Romance, School, Supernatural" Movie 1 9.37 200630 5114 Fullmetal Alchemist: Brotherho od "Action, Adventure, Drama, Fantasy, Magic, Military, Shounen" TV 64 9.26 793665 … … … … … … … user_id anime_id rating 1 20 -1 1 24 -1 … … … anime.csv rating.csv
  4. • グラフデータベース Neo4j に対してクエリ⾔語 Cypher を⽤いてCSV から インポートしてユーザ/アニメノードを作成 ‒ Neo4j

    の import ディレクトリ下にデータファイルを配置することで読み込み可能 Neo4j へのデータ⼊⼒: ノードの作成 6 rating.csv anime.csv LOAD CSV WITH HEADERS FROM 'file:///anime.csv' AS row CREATE (:Anime { name: row.name, anime_id: row.anime_id }); LOAD CSV WITH HEADERS FROM 'file:///rating.csv' AS row WITH DISTINCT row.user_id as user_id WHERE toInteger(user_id) <= 1000 CREATE (:User { user_id: user_id }); アニメノード作成のクエリ ユーザノード作成のクエリ グラフデータベース Neo4j
  5. • ユーザのアニメに対する評価をエッジとして作成 ‒ プロパティとして評価値を持たせることなども可能 Neo4j へのデータ⼊⼒: エッジの作成 7 LOAD CSV

    WITH HEADERS FROM 'file:///rating.csv' AS row MATCH (u:User) WHERE u.user_id = row.user_id AND toInteger(row.user_id) <= 1000 MATCH (a:Anime) WHERE a.anime_id = row.anime_id CREATE (u)-[:RATING{rating:toInteger(row.rating)}]->(a); rating.csv レーティングエッジ作成のクエリ グラフデータベース Neo4j
  6. • 格納したデータはブラウザアクセスによって簡単に確認できる Neo4j へのデータ⼊⼒結果 8 user_id 1,000 anime_id 12,294 rating

    96,489 (⾼評価も低評価も含む) user_id が 3 のユーザノード user_id が 4 のユーザノード user_id が 4 のユーザが 評価したアニメノード user_id が 3 のユーザが 評価したアニメノード 上の画像は出⼒結果を保存した画像
  7. • ユーザベース協調フィルタリングによってレコメンド ‒ 同じアニメを⾼評価しているユーザ同⼠は類似していると仮定 ⾃分の好きなアニメに基づいたレコメンドの考え⽅ 10 ユーザ1 ユーザ2 ユーザ3 アニメ1

    アニメ2 アニメ3 関係性: ⾼評価 類似したユーザが より多く評価していて アニメは対象ユーザにとって 有益である可能性が⾼い ユーザ1とユーザ2は 同じアニメを評価 同じアニメを⾼評価している ユーザ同⼠は類似している 可能性が⾼い
  8. • 協調フィルタリングの考え⽅をクエリとして直接表現して データを出⼒する ⾃分の好きなアニメに基づいたレコメンドのクエリ 11 // ⾃分が⾼評価しているアニメ MATCH (:User{user_id:"1001"})-[:RATING]-(a0:Anime) WITH

    collect(a0.anime_id) AS a0_ids // ⾃分が⾼評価しているアニメを⾼評価している他のユーザが⾼評価している他のアニメ MATCH (:User{user_id:"1001"})-[:RATING]-(:Anime)-[r0:RATING]-(:User)-[r1:RATING]-(a1:Anime) // ⾃分が⾼評価しているアニメを除外するかつ r0 と r1 の rating が 1 より⼤きい WHERE NOT a1.anime_id IN a0_ids AND r0.rating > 1 AND r1.rating > 1 WITH a1, count(a1) as cnt_a1 RETURN a1, cnt_a1 // 重複数の降順でソート ORDER BY cnt_a1 DESC LIMIT 10;
  9. • グラフデータベースを紹介 • ノード間の関係性によって直感的なレコメンドシステムを 構築できる利点 • ノードやエッジの種類を変えれば様々なプロダクトへ応⽤可能 • 属性情報を使って絞り込むことでより⾼精度な推薦の実現 •

    今回利⽤したデータは⼗分な量があったが,データが少ないよう なシステムに今回のような⽅法を適⽤しても,あまり使えるもの ではない可能性が⾼いので⼯夫が必要 • データ分析を⾏う追加機能などもある まとめ 13 以下のリンクに詳細が載っています グラフデータベース Neo4j を使ってアニメをレコメンドしてみた ‒ Qiita, https://qiita.com/kohei-shinden/items/e1c1fbc0a90a9fd7ecb9
  10. ⾃⼰紹介 14 新⽥洸平 (Kohei Shinden) POL における活動 • インターン⽣としてデータの分析や検索の改善などに⾃由に取り組む 研究・技術領域の興味

    • 情報検索,情報推薦,⾃然⾔語処理,機械学習 など • Go, Flutter, Python, Neo4j など その他の活動 • 2020年度 未踏IT⼈材発掘・育成事業 • ZENPEN(⾼専⽣の編⼊対策⽀援) 筑波⼤学 情報学群 知識情報・図書館学類 B4 知識獲得システム研究室 (加藤誠研究室) 個⼈サイト: https://sites.google.com/view/kohei-shinden 研究室サイトの個⼈ページ: https://kasys.slis.tsukuba.ac.jp/member/kohei-shinden/ @KoheiShinden kohei-shinden