semantick / README.md
orendar's picture
Deploy to HF Spaces
d53778f
---
title: Semantick
emoji: 🧠
colorFrom: gray
colorTo: green
sdk: docker
app_port: 7860
---
# Semantick
A semantic word-guessing game. Guess the secret word based on meaning similarity.
## Architecture
```
Client (React) ──POST /api/game/{id}/guess──▶ Server (FastAPI)
embeddings.npz
(word → vector)
cosine similarity
◀── { score, rank }
```
The server holds all embeddings in memory. Each guess is a vector lookup + dot product — sub-millisecond.
## Setup
```bash
pip install -r requirements.txt
# Generate mock embeddings (for development)
python generate_embeddings.py
# Start server
uvicorn server:app --reload --port 8000
```
## Replacing Mock Embeddings with Real Ones
The game ships with random vectors for testing. To use real semantic embeddings:
```python
import numpy as np
# Your embedding pipeline
words = [...] # list of vocabulary words
vectors = model.encode(words) # shape: (vocab_size, dim)
# Normalize to unit vectors (required for cosine similarity via dot product)
norms = np.linalg.norm(vectors, axis=1, keepdims=True)
vectors = vectors / norms
np.savez_compressed("embeddings.npz", words=np.array(words), vectors=vectors.astype(np.float32))
```
Recommended models: `all-MiniLM-L6-v2` (384-dim, fast), `all-mpnet-base-v2` (768-dim, better quality), or OpenAI/Cohere embedding APIs.
## API
| Endpoint | Method | Description |
|---|---|---|
| `/api/new-game` | POST | Start new game, returns `game_id` |
| `/api/game/{id}/guess` | POST | Submit guess `{"word": "..."}`, returns score + rank |
| `/api/game/{id}/give-up` | POST | Reveal secret word |
| `/api/health` | GET | Server status |
**Guess response:**
- `score`: 0-100 similarity (mapped from cosine similarity)
- `rank`: word's rank among all vocab by similarity to the secret (1 = closest)
- `solved`: true if exact match
- HTTP 422 if word not in dictionary