Projects · Social · Machine Learning · Oct 2024

Hi-Five

Matches people on personality, not just shared tags, using OCEAN embeddings in a Neo4j graph.

Built over a weekend at SASEHack with two teammates. Free-text answers for each of the five OCEAN traits become embeddings, and matches weigh personality 60 to 40 over shared interests.

The Problem

Modern matching apps compare tags and interest metrics. Two people who both list “hiking” match; two people who would actually get along may not. Hi-Five adds the missing signal: personality.

What I Built

A matching app built at SASEHack in October 2024 with two teammates. New users take a personality test based on the OCEAN model (openness, conscientiousness, extraversion, agreeableness, neuroticism) and pick interest tags. Hi-Five turns the answers into embeddings, stores everyone in a Neo4j graph, and suggests people with similar personalities and interests. From there users can swipe, send friend requests and chat.

My commits covered the Next.js frontend, login and interest tags, the API endpoints, and chat.

How It Works

  1. Personality testOne free-text answer per OCEAN trait.
  2. EmbedEach answer is embedded with BAAI/bge-en-icl, giving five trait vectors per person.
  3. GraphPeople, tags and friendships live in Neo4j.
  4. ScoreFor each candidate: the cosine similarity of each trait vector, averaged across the five traits, weighted 0.6, plus the Jaccard similarity of interest tags, weighted 0.4.
  5. SuggestThe highest-scoring candidates come back as suggested matches.

Results

A working end-to-end app at the end of the hackathon: personality test, embeddings, graph-based matching, swiping, friend requests and chat. TODO(shawn): any placement or judging result from SASEHack.

Limitations

Correction

An earlier version of my resume described a professional matching platform that combined embeddings with emotion classification (roberta-base-go-emotions). The public code matches on OCEAN personality embeddings and shared interest tags. It contains no emotion classifier.

  • Untested weights. The 0.6 and 0.4 weights are fixed in code. Nothing in the repository measures match quality.
  • A thin personality signal. Five free-text answers stand in for a validated personality inventory.
  • Hackathon code. The embedding server address is hard-coded, and the repository README is the default template.

What I’d Do Next

  1. Measure match quality, even with a small survey of whether suggested matches actually talked, and tune the weights against it.
  2. Use a validated personality inventory instead of five free-text prompts.