/var/log/messages

Aug 5, 2018 - 5 minute read - Comments - recommendation

context aware recommendation

特徴量の組み合わせ、が複数あって云々、な宿題があり困り果てていたのですが context aware という言葉を参考書にて発見して google 先生にお伺いしてみたところ、neo4j 発信なリンク切れドキュメントがありましたので cache を確保して機械翻訳。

以下にて共有しておきます。

Introduction

システムを推薦する場合、私はいつも80’sシチュコムのタイトル曲「乾杯」を覚えています。 方法は次のとおりです。

“あなたは人々が知っているところに行きたい、人々はすべて同じ” - コンテンツベース

“あなたが見える場所になりたい、私たちのトラブルはすべて同じ” - Colloborative-filtering

「すべての心配から休みを取って、大いに役立つでしょう。あなたは離れたくないですか?」 …誰とどこで? - コンテキスト認識。

ここでは、Neo4jを使用してコンテキスト情報に基づいてレストランの推奨事項を提示するのが好きです。

What is Context?

コンテキストとは、エンティティの状況を特徴付けるために使用できる任意の情報です。 エンティティとは、ユーザとアプリケーション(AK Dey&GD Abowd - ACM Conference in Computer Systems in Computer Systems(CHI 2000))を含む、ユーザとアプリケーションとの間の相互作用に関連すると考えられる人物、 Vol.5 / Iss.1、pp.4-7、2001)。

コンテキストの最も一般的なタイプは、Identity( ‘who’)、Acivity( ‘what’)、Time( ‘when’)、およびLocation( ‘where’)であり、この情報を使用して状況が発生した理由を判断できます。

従来の推奨システムでは、2つのエンティティ(2次元)のユーザーとアイテムが使用されます。 この推奨は、多次元アプローチを使用してコンテキスト情報を組み込むことにより、よりパーソナライズされたものにすることができます。

Apply to Restaurant Recommendation

https://archive.ics.uci.edu/ml/datasets/Restaurant+%26+consumer+data からレストランと消費者のデータ(メキシコに関するもの)をインポートしました。

ユーザーデータには、喫煙、飲酒などの居場所、習慣、婚姻状況、料理、予算などの情報があります。 ユーザーには、各コンテキスト(喫煙、料理、予算など)を1つの次元として取り入れることができます。

レストランのデータには、場所、料理、喫煙、アロコホル、価格などの情報が含まれます。 レストランについても、ユーザーの好みに基づいてレストランのより良い選択肢を提供するために、複数の次元があります。

三次元アプローチの図的記述を以下に示す。

ユーザキューブの3つの次元は、ユーザ、喫煙、料理であり、レストランキューブの場合、レストラン、喫煙、料理である。 色分けされたユーザーキューブのスライスは、喫煙に関する様々なプレゼンテーションで同じ料理が好きなユーザーを表します。 これらの選択肢を使用して、選択されたユーザーの選択肢に一致するレストランを選択します。 レストランキューブの色付きのスライスは、ユーザーが選択した選択肢に一致するレストランを表示します。

同一のアプローチは、さらに高い次元にも適用されます。

Data Model

Metadata

Setup

4つのデータファイル:Users_50.csv(50人を選択)UCuisine.csv(ユーザー/料理)Restaurants.csv RestCuisine.csv(レストラン/料理)

Cypherのデータベースへの照会

Query 1

CREATE CONSTRAINT ON ( rest:Restaurant ) ASSERT rest.pid IS UNIQUE;
CREATE CONSTRAINT ON ( company:Company ) ASSERT company.name IS UNIQUE;
CREATE CONSTRAINT ON ( usr:User ) ASSERT usr.UserID IS UNIQUE;

//Import users.............

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM
"https://raw.githubusercontent.com/kaisesha/cdrgraph/master/Users_50.csv"
AS line
WITH line

MERGE (company:Company {name: "Ameyasoft"})
MERGE (usr:User {uid: line.UserID})
CREATE (company)-[:USER_PROFILE]->(usr)

CREATE (prsnl:Personal {name: "Personal"})
CREATE (usr)-[:PERSONAL]->(prsnl)

CREATE (intrst:Interest {attr9: line.Interest})
CREATE (prsnl)-[:INTEREST]->(intrst)

CREATE (prsnlt:Persnlty {attr10: line.Personality})
CREATE (prsnl)-[:PERSONALITY]->(prsnlt)

CREATE (trnsp:Transp {attr5: line.Transport})
CREATE (prsnl)-[:TRANSPORT]->(trnsp)

CREATE (marrd:Married {attr6: line.Marital_Status})
CREATE (prsnl)-[:MARITAL_STATUS]->(marrd)


CREATE (brthyr:Byear {attr8: line.Birth_Year})
CREATE (prsnl)-[:BIRTH_YEAR]->(brthyr)


CREATE (relgn:Religion {attr11: line.Religion})
CREATE (prsnl)-[:RELIGION]->(relgn)


CREATE (habit:Habit {name: "Habits"})
CREATE (usr)-[:HABITS]->(habit)

CREATE (smkr:Smoker {attr1: line.Smoker})
CREATE (habit)-[:SMOKER]->(smkr)

CREATE (drnk:Drink {attr2: line.Drink_Level})
CREATE (habit)-[:DRINK_LEVEL]->(drnk)

CREATE (dress:Dress {attr3: line.Dress_Pref})
CREATE (habit)-[:DRESS]->(dress)

CREATE (hijos:Hijos {attr7: line.Hijos})
CREATE (habit)-[:HIJOS]->(hijos)

CREATE (ambnc:Ambnce {attr4: line.Ambience})
CREATE (habit)-[:AMBIENCE]->(ambnc)

CREATE (actv:Activity {attr12: line.Activity})
CREATE (habit)-[:USER_PROFILE]->(actv)

CREATE (budgt:Budget {attr13: line.Budget})
CREATE (habit)-[:BUDGET]->(budgt)

CREATE (m:Cuisine {name: line.UserID})
CREATE (usr)-[:CUISINE]->(m)

;

//Import user choices of cuisines.......

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM
"https://raw.githubusercontent.com/kaisesha/cdrgraph/master/UCuisine.csv"
AS line
WITH line

CREATE (f:Food {name: line.Rcuisine})
WITH line, f

MATCH (n:User {uid:line.userID})-[:CUISINE]->(m:Cuisine {name: 'Cuisine'})
MERGE (n)-[:CUISINE]->(m)-[:TYPE]->(f)
;

//Import restaurants.............

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM
"https://raw.githubusercontent.com/kaisesha/cdrgraph/master/Restaurants.csv"
AS line
WITH line

MERGE (company:Company {name: "Ameyasoft"})
MERGE (rest:Restaurant {pid: toInt(line.PlaceID), name: line.Name})
CREATE (company)-[:RESTAURANT]->(rest)

CREATE (addr:Addrs {street: line.Address, city: line.City, state: line.State, zip: line.Zip, country: line.Country})
CREATE (rest)-[:ADDRESS]->(addr)

CREATE (featrs:Features {alcohol: line.Alcohol, smoking: line.Smoking_Area, dress: line.Dress_Code, price: line.Price, ambience: line.Ambience})
CREATE (rest)-[:FEATURES]->(featrs)

;

//Import restaurant cuisines.......

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM
"https://raw.githubusercontent.com/kaisesha/cdrgraph/master/RestCuisine.csv"
AS line
WITH line

MATCH (n:Restaurant {pid: toInt(line.PlaceID)})
MERGE (n)-[:REST_CUISINE]->(cuse:Cusine {name: line.Cuisine});
0 rows
123 ms
+-------------------+
| No data returned. |
+-------------------+
Nodes created: 60
Relationships created: 60
Properties set: 60

この問合せを使用して、USER_PROFILEパスとRESTAURANTパスの両方の視覚化を改善しました。

Query 2

MATCH (c)-[r:USER_PROFILE|RESTAURANT]->(n)-[]->(p)
WHERE n.uid IN['U1001', 'U1002', 'U1003'] or n.pid IN [132609, 132613, 132630]
RETURN c, n, p LIMIT 20;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| c                         | n                                                     | p                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Node[0]{name:"Ameyasoft"} | Node[1]{uid:"U1001"}                                  | Node[17]{name:"U1001"}                                                                                         |
| Node[0]{name:"Ameyasoft"} | Node[1]{uid:"U1001"}                                  | Node[9]{name:"Habits"}                                                                                         |
| Node[0]{name:"Ameyasoft"} | Node[1]{uid:"U1001"}                                  | Node[2]{name:"Personal"}                                                                                       |
| Node[0]{name:"Ameyasoft"} | Node[18]{uid:"U1002"}                                 | Node[34]{name:"U1002"}                                                                                         |
| Node[0]{name:"Ameyasoft"} | Node[18]{uid:"U1002"}                                 | Node[26]{name:"Habits"}                                                                                        |
| Node[0]{name:"Ameyasoft"} | Node[18]{uid:"U1002"}                                 | Node[19]{name:"Personal"}                                                                                      |
| Node[0]{name:"Ameyasoft"} | Node[35]{uid:"U1003"}                                 | Node[51]{name:"U1003"}                                                                                         |
| Node[0]{name:"Ameyasoft"} | Node[35]{uid:"U1003"}                                 | Node[43]{name:"Habits"}                                                                                        |
| Node[0]{name:"Ameyasoft"} | Node[35]{uid:"U1003"}                                 | Node[36]{name:"Personal"}                                                                                      |
| Node[0]{name:"Ameyasoft"} | Node[926]{pid:132609,name:"Pollo_Frito_Buenos_Aires"} | Node[1135]{name:"Fast_Food"}                                                                                   |
| Node[0]{name:"Ameyasoft"} | Node[926]{pid:132609,name:"Pollo_Frito_Buenos_Aires"} | Node[928]{smoking:"not permitted",alcohol:"No_Alcohol_Served",dress:"informal",ambience:"quiet",price:"low"}   |
| Node[0]{name:"Ameyasoft"} | Node[926]{pid:132609,name:"Pollo_Frito_Buenos_Aires"} | Node[927]{state:"Tamaulipas",street:"tampico",city:"Victoria",country:"Mexico"}                                |
| Node[0]{name:"Ameyasoft"} | Node[929]{pid:132613,name:"carnitas_mata"}            | Node[1134]{name:"Mexican"}                                                                                     |
| Node[0]{name:"Ameyasoft"} | Node[929]{pid:132613,name:"carnitas_mata"}            | Node[930]{street:"lic. Emilio portes gil",state:"Tamaulipas",city:"Victoria",country:"Mexico"}                 |
| Node[0]{name:"Ameyasoft"} | Node[929]{pid:132613,name:"carnitas_mata"}            | Node[931]{alcohol:"No_Alcohol_Served",price:"medium",smoking:"permitted",dress:"informal",ambience:"familiar"} |
| Node[0]{name:"Ameyasoft"} | Node[932]{pid:132630,name:"palomo tec"}               | Node[1133]{name:"Mexican"}                                                                                     |
| Node[0]{name:"Ameyasoft"} | Node[932]{pid:132630,name:"palomo tec"}               | Node[934]{smoking:"none",price:"low",alcohol:"No_Alcohol_Served",dress:"informal",ambience:"familiar"}         |
| Node[0]{name:"Ameyasoft"} | Node[932]{pid:132630,name:"palomo tec"}               | Node[933]{street:"blvrd emilio portes gil",state:"tamaulipas",city:"Victoria",country:"Mexico"}                |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
18 rows
28 ms

左半分はRestaurantで、右半分はUser Profileです。

Recommend Restaurants Based On User Preferences

3つの好み:メキシコ料理、禁煙、中価格。

Query 3

//Users with selected choices..............

MATCH (c)-[]->(n)-[:CUISINE]->(r)-[:LIKES]->(t:Food {name: "Mexican"})
WITH COLLECT (n) AS nodes, t
UNWIND nodes AS n1

MATCH (c)-[]->(n1)-[:HABITS]->(q)-[:SMOKER]->(v:Smoker {attr1: "false"})
WITH COLLECT (n1) AS nodes, t, v
UNWIND nodes AS n2

MATCH (c)-[]->(n2)-[:HABITS]->(q)-[:BUDGET]->(v1:Budget {attr13: "medium"})
WITH v1, t, v MATCH (c)-[]->(n)-[:CUISINE]->(r)-[:LIKES]->(t:Food {name: "Mexican"})
WITH COLLECT (n) AS nodes, t
UNWIND nodes AS n1

MATCH (c)-[]->(n1)-[:HABITS]->(q)-[:SMOKER]->(v:Smoker {attr1: "false"})
WITH COLLECT (n1) AS nodes, t, v
UNWIND nodes AS n2

MATCH (c)-[]->(n2)-[:HABITS]->(q)-[:BUDGET]->(v1:Budget {attr13: "medium"})
WITH v1, t

//WITH v1, t, v1, n2
//RETURN n2.uid as User, t.name as Cuisine, v.attr1 as Smoker, v1.attr13 as Budget;


// Find the restaurants that match the user preferences......

MATCH (c)-[]->(n2)-[:REST_CUISINE]->(p:Cusine {name: t.name})
WITH COLLECT(n2) AS pn, v1
UNWIND pn AS n3
MATCH (c)-[]->(n3)-[:FEATURES]->(q1:Features {price: v1.attr13, smoking: "none"})
WITH COLLECT(n3) AS pn

UNWIND pn AS n4
WITH DISTINCT n4
MATCH (c)-[]->(n4)-[:ADDRESS]-(k)
RETURN n4.name AS Restaurant, k.city AS City;

Four preferences: Japanese food, non-smoking, medium priced, and ambience (friends).

Query 4

MATCH (c)-[]->(n)-[:CUISINE]->(r)-[:LIKES]->(t:Food {name: "Japanese"})
WITH COLLECT (n) AS nodes, t
UNWIND nodes AS n1

MATCH (c)-[]->(n1)-[:HABITS]->(q)-[:SMOKER]->(v:Smoker {attr1: "false"})
WITH COLLECT (n1) AS nodes, t, v
UNWIND nodes AS n2

MATCH (c)-[]->(n2)-[:HABITS]->(q)-[:BUDGET]->(v1:Budget {attr13: "medium"})
WITH COLLECT (n2) AS nodes, t, v, v1
UNWIND nodes AS n3

MATCH (c)-[]->(n3)-[:HABITS]->(q)-[:AMBIENCE]->(v2:Ambnce {attr4: "friends"})
WITH COLLECT (n3) AS nodes, t, v, v1, v2
UNWIND nodes AS n4

WITH t, v1

//WITH v, t, v1, v2, n4
//RETURN n4.uid as User, t.name as Cuisine, v.attr1 as Smoker, v1.attr13 as Budget, v2.attr4 as Ambience;


MATCH (c)-[]->(n2)-[:REST_CUISINE]->(p:Cusine {name: t.name})
WITH COLLECT(n2) AS pn, v1
UNWIND pn AS n3
MATCH (c)-[]->(n3)-[:FEATURES]->(q1:Features {price: v1.attr13, smoking: "none", ambience: "familiar"})
WITH COLLECT(n3) AS pn2

UNWIND pn2 AS n4
WITH DISTINCT n4
MATCH (c)-[]->(n4)-[:ADDRESS]-(k)

RETURN n4.name AS Restaurant, k.city AS City;

Conclusions…

レストランの個人的な推奨は、ユーザの好みに基づいて提示される。 ここでの1つの問題は、関連するデータセットの可用性です。 データセットが提供する情報が多くなればなるほど、分析と結果に役立つでしょう。

Resources

Datasets:

酒場ル kemia Context Aware Recommendation (2)

comments powered by Disqus