Получение «рекомендуемого продукта» на основе взвешенных отношений в течение 2 прыжков - PullRequest
0 голосов
/ 02 мая 2019

Используя Racket Scheme, я пытаюсь рекомендовать продукт клиенту, основываясь на кратчайшем пути, основанном на весе в течение 2 прыжков. Я пытаюсь понять, как найти правильное предложение, а затем внедрить его в функцию рекомендуемый продукт, который использует алгоритм Дейкстры для нахождения весов между путями. Также с этими указанными путями и действительными рекомендациями, как тогда можно сделать рекомендацию, не отображая, что люди имеют всю историю покупок и только один предмет, который действителен, при условии, что было приобретено несколько предметов, которые могут быть действительными.

project.rkt

#lang racket

(require graph)



(define adj-list (make-hash))

(define add-arc!
  (lambda (adj-list n1name n2name weight)
    (cond [(not (hash-has-key? adj-list n1name)) (hash-set! adj-list n1name (make-hash))])
    (let ((node1-adjacent-nodes (hash-ref adj-list n1name #f)))
      (hash-set! node1-adjacent-nodes n2name weight))))

(define adjacent?
  (lambda (adj-list n1name n2name)
    (let ((node1-adjacent-nodes (hash-ref adj-list n1name #f)))
      (if node1-adjacent-nodes
          (let ((weight (hash-ref node1-adjacent-nodes n2name #f)))
            weight)
          #f))))

(define add-bidirectional-arcs!
  (lambda (adj-list n1name n2name weight)
    (add-arc! adj-list n1name n2name weight)
    (add-arc! adj-list n2name n1name weight)))

(define purchase-history (make-hash))
(define products (make-hash))
(define social-graph (weighted-graph/undirected '()))

(define addSocial!
  (lambda (person1 person2 weight)
    (add-edge! social-graph person1 person2 weight)))

(define addUser!
  (lambda (person)
    (hash-set! purchase-history person '())))


(define addPurchase!
  (lambda (person product)
    (cond ((not (hash-has-key? purchase-history person)) (addUser! person)))
    (hash-set! purchase-history person (cons product (hash-ref! purchase-history person #f)))))

(define addProduct!
  (lambda (product category)
    (hash-set! products product category)))

(define get-categories
  (lambda (items)
    (let ((categories (mutable-set)))
      (for/list ((s items))
        (set-add! categories (hash-ref products s '())))
    categories)))

;(define valid-suggestions
 ; (lambda (person1 person2)
  ;  (let* ((person1-history (hash-ref purchase-history person1 '()))
   ;        (person2-history (hash-ref purchase-history person2 '()))
    ;       (valid-categories (get-categories person1-history)

(define recommendProduct
  (lambda (person hops)
    (let-values ( [ ( first second) (dijkstra social-graph 'Bob) ] )
      (hash-for-each first (lambda (k v) (display k) (display "-->") (display v) (display "\n"))))))


(addSocial! 'Bob 'Sue 5)
(addSocial! 'Bob 'John 3)
(addSocial! 'Sue 'Jane 7)
(addSocial! 'John 'Sue 1)
(addProduct! 'Toaster 'Homewares)
(addProduct! 'Blender 'Homewares)
(addPurchase! 'Bob 'Toaster)
(addPurchase! 'Sue 'Blender)

;(adjacent? social-graph 'Bob 'Sue)

(recommendProduct 'Bob 2)
...