My attempt:
(let* ((data '((name (tag1))
(name2 (tag2))
(name3 (tag1))
(name4 (tag3))
(name5 (tag2 tag1)))))
(mapcar (lambda (tag)
`(,tag ,(delete nil
(mapcar (lambda (item)
(when (member tag (cadr item))
(car item)))
data))))
(delete-dups (flatten-tree (mapcar #'cdr data)))))