Build interaction sequences (history_len=10). Same logic as your original json2csv version but using: - user_id - rating - timestamp - title from metadata Output entry: [user_id_original, history_asins, target_asin, hist
(reviews, user2index, item2index, asin2title)
| 263 | |
| 264 | |
| 265 | def build_interaction_list_amazon23(reviews, user2index, item2index, asin2title): |
| 266 | """ |
| 267 | Build interaction sequences (history_len=10). |
| 268 | Same logic as your original json2csv version but using: |
| 269 | - user_id |
| 270 | - rating |
| 271 | - timestamp |
| 272 | - title from metadata |
| 273 | Output entry: |
| 274 | [user_id_original, |
| 275 | history_asins, |
| 276 | target_asin, |
| 277 | history_item_ids, |
| 278 | target_item_id, |
| 279 | history_titles, |
| 280 | target_title, |
| 281 | history_ratings, |
| 282 | target_rating, |
| 283 | history_timestamps, |
| 284 | target_timestamp] |
| 285 | """ |
| 286 | |
| 287 | # Group by user |
| 288 | interact = {} |
| 289 | |
| 290 | for r in tqdm(reviews, desc="Collecting interactions"): |
| 291 | u = r["user_id"] |
| 292 | i = r["asin"] |
| 293 | |
| 294 | if u not in interact: |
| 295 | interact[u] = { |
| 296 | "items": [], |
| 297 | "ratings": [], |
| 298 | "timestamps": [], |
| 299 | "item_ids": [], |
| 300 | "titles": [], |
| 301 | } |
| 302 | |
| 303 | interact[u]["items"].append(i) |
| 304 | interact[u]["ratings"].append(r["rating"]) |
| 305 | interact[u]["timestamps"].append(r["timestamp"]) |
| 306 | interact[u]["item_ids"].append(item2index[i]) |
| 307 | interact[u]["titles"].append(asin2title.get(i, "")) |
| 308 | |
| 309 | # Build full list |
| 310 | interaction_list = [] |
| 311 | |
| 312 | for u in tqdm(interact.keys(), desc="Building sequence windows"): |
| 313 | items = interact[u]["items"] |
| 314 | ratings = interact[u]["ratings"] |
| 315 | timestamps = interact[u]["timestamps"] |
| 316 | item_ids = interact[u]["item_ids"] |
| 317 | titles = interact[u]["titles"] |
| 318 | |
| 319 | # sort by timestamp |
| 320 | all_data = list(zip(items, ratings, timestamps, item_ids, titles)) |
| 321 | all_data.sort(key=lambda x: x[2]) |
| 322 | items, ratings, timestamps, item_ids, titles = zip(*all_data) |