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. グラフデータベース Neo4j による
    レコメンド
    株式会社POL
    プロダクト部インターン
    新⽥洸平
    株式会社POL
    TechLab LT会 #1
    2021年3⽉31⽇

    View Slide

  2. • レコメンドシステムの構築は重要
    ‒ ユーザに有益な商品をおすすめしたり,
    ユーザに合ったユーザをおすすめしたり
    • ⼀⽅で,レコメンドシステムの構築は難しい
    ‒ 対象データの特徴を考慮して設計しなければならない
    ‒ なるべく簡単かつ直感的にレコメンドシステムを
    構築したい…
    背景 2

    ⽅法の1つとして
    グラフデータベースを紹介

    View Slide

  3. • グラフ構造のデータベース
    ‒ グラフとは要素(頂点)間の関係を表す線からなる数学理論
    グラフデータベースとは? 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, ...}
    データ間の関係性を格納できる

    View Slide

  4. • データ間の関係性によって直感的なレコメンドが可能
    グラフデータベースの利点 4
    ユーザ1
    ユーザ2
    ユーザ3
    アイテム1
    アイテム2
    アイテム3
    関係性: ⾼評価
    例: 動画サイトにおける商品評価
    {Rate: 2}
    ユーザ
    アイテム
    評価
    グラフデータ
    ベースによる
    表現

    • 同じアイテムを評価しているユーザ同⼠は類似する可能性が⾼い
    • あるユーザが未評価のアイテムの中で類似ユーザが評価している
    アイテムは有益なアイテムである可能性が⾼い

    View Slide

  5. • 実際にユーザのアニメ評価データを使ってレコメンドを実践
    ‒ 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

    View Slide

  6. • グラフデータベース 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

    View Slide

  7. • ユーザのアニメに対する評価をエッジとして作成
    ‒ プロパティとして評価値を持たせることなども可能
    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

    View Slide

  8. • 格納したデータはブラウザアクセスによって簡単に確認できる
    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 のユーザが
    評価したアニメノード
    上の画像は出⼒結果を保存した画像

    View Slide

  9. • ⾃分へアニメをレコメンドするために,データベース内から⾃分が好きなア
    ニメデータを探して⾼評価をつけてみる
    ‒ 任意のプロパティに対してフルテキストインデックスを作成することで
    検索を⾼速で⾏える
    ⾃分の好きなアニメを登録 9
    ⼿順
    ⾃分のユーザノード作成
    アニメのタイトルで検索
    検索結果のアニメノードに
    Rating のエッジを作成
    アニメを⾼評価している
    ユーザに基づいてレコメンド
    好きなアニメ「One Piece」の検索結果

    View Slide

  10. • ユーザベース協調フィルタリングによってレコメンド
    ‒ 同じアニメを⾼評価しているユーザ同⼠は類似していると仮定
    ⾃分の好きなアニメに基づいたレコメンドの考え⽅ 10
    ユーザ1
    ユーザ2
    ユーザ3
    アニメ1
    アニメ2
    アニメ3
    関係性: ⾼評価
    類似したユーザが
    より多く評価していて
    アニメは対象ユーザにとって
    有益である可能性が⾼い
    ユーザ1とユーザ2は
    同じアニメを評価
    同じアニメを⾼評価している
    ユーザ同⼠は類似している
    可能性が⾼い

    View Slide

  11. • 協調フィルタリングの考え⽅をクエリとして直接表現して
    データを出⼒する
    ⾃分の好きなアニメに基づいたレコメンドのクエリ 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;

    View Slide

  12. レコメンドの結果 12
    • 上から順に,進撃の巨⼈,ワンピース(Film:
    Strong World),デスノート,ソードアート
    オンライン,鋼の錬⾦術師...
    • 進撃の巨⼈はワンピースと同じようなアクショ
    ン漫画のアニメなのでユーザが評価する可能性
    • デスノートは週刊少年ジャンプで連載されてい
    た漫画のアニメなのでユーザが評価する可能性
    ⾃分の評価したアニメに基づいた出⼒結果

    View Slide

  13. • グラフデータベースを紹介
    • ノード間の関係性によって直感的なレコメンドシステムを
    構築できる利点
    • ノードやエッジの種類を変えれば様々なプロダクトへ応⽤可能
    • 属性情報を使って絞り込むことでより⾼精度な推薦の実現
    • 今回利⽤したデータは⼗分な量があったが,データが少ないよう
    なシステムに今回のような⽅法を適⽤しても,あまり使えるもの
    ではない可能性が⾼いので⼯夫が必要
    • データ分析を⾏う追加機能などもある
    まとめ 13
    以下のリンクに詳細が載っています
    グラフデータベース Neo4j を使ってアニメをレコメンドしてみた ‒ Qiita,
    https://qiita.com/kohei-shinden/items/e1c1fbc0a90a9fd7ecb9

    View Slide

  14. ⾃⼰紹介 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

    View Slide