Hierarchical Taxonomy Clustering
Create a unified multi-level taxonomy from hierarchical category paths by clustering similar paths and automatically generating meaningful category names.
Problem
Given category paths from multiple sources (e.g., "electronics -> computers -> laptops"), create a unified taxonomy that groups similar paths across sources, generates meaningful category names, and produces a clean N-level hierarchy (typically 5 levels). The unified category taxonomy could be used to do analysis or metric tracking on products from different platform.
Methodology
- Hierarchical Weighting: Convert paths to embeddings with exponentially decaying weights (Level i gets weight 0.6^(i-1)) to signify the importance of category granularity
- Recursive Clustering: Hierarchically cluster at each level (10-20 clusters at L1, 3-20 at L2-L5) using cosine distance
- Intelligent Naming: Generate category names via weighted word frequency + lemmatization + bundle word logic
- Quality Control: Exclude all ancestor words (parent, grandparent, etc.), avoid ancestor path duplicates, clean special characters
Output
DataFrame with added columns:
unified_level_1: Top-level category (e.g., "electronic | device")
unified_level_2: Second-level category (e.g., "computer | laptop")
unified_level_3 through unified_level_N: Deeper levels
Category names use | separator, max 5 words, covering 70%+ of records in each cluster.
Installation
pip install pandas numpy scipy sentence-transformers nltk tqdm
python -c "import nltk; nltk.download('wordnet'); nltk.download('omw-1.4')"
4-Step Pipeline
Step 1: Load, Standardize, Filter and Merge (step1_preprocessing_and_merge.py)
- Input: List of (DataFrame, source_name) tuples, each of the with
category_path column
- Process: Per-source deduplication, text cleaning (remove &/,/'/-/quotes,'and' or "&", "," and so on, lemmatize words as nouns), normalize delimiter to
>, depth filtering, prefix removal, then merge all sources. source_level should reflect the processed version of the source level name
- Output: Merged DataFrame with
category_path, source, depth, source_level_1 through source_level_N
Step 2: Weighted Embeddings (step2_weighted_embedding_generation.py)
- Input: DataFrame from Step 1
- Output: Numpy embedding matrix (n_records × 384)
- Weights: L1=1.0, L2=0.6, L3=0.36, L4=0.216, L5=0.1296 (exponential decay 0.6^(n-1))
- Performance: For ~10,000 records, expect 2-5 minutes. Progress bar will show encoding status.
Step 3: Recursive Clustering (step3_recursive_clustering_naming.py)
- Input: DataFrame + embeddings from Step 2
- Output: Assignments dict {index → {level_1: ..., level_5: ...}}
- Average linkage + cosine distance, 10-20 clusters at L1, 3-20 at L2-L5
- Word-based naming: weighted frequency + lemmatization + coverage ≥70%
- Performance: For ~10,000 records, expect 1-3 minutes for hierarchical clustering and naming. Be patient - the system is working through recursive levels.
Step 4: Export Results (step4_result_assignments.py)
- Input: DataFrame + assignments from Step 3
- Output:
unified_taxonomy_full.csv - all records with unified categories
unified_taxonomy_hierarchy.csv - unique taxonomy structure
Usage
Use scripts/pipeline.py to run the complete 4-step workflow.
See scripts/pipeline.py for:
- Complete implementation of all 4 steps
- Example code for processing multiple sources
- Command-line interface
- Individual step usage (for advanced control)
1---2name: skill-0683description: Build unified multi-level category taxonomy from hierarchical product category paths from any e-commerce companies using embedding-based recursive clustering with intelligent category naming via weighted word frequency analysis.4---56# Hierarchical Taxonomy Clustering78Create a unified multi-level taxonomy from hierarchical category paths by clustering similar paths and automatically generating meaningful category names.910## Problem1112Given category paths from multiple sources (e.g., "electronics -> computers -> laptops"), create a unified taxonomy that groups similar paths across sources, generates meaningful category names, and produces a clean N-level hierarchy (typically 5 levels). The unified category taxonomy could be used to do analysis or metric tracking on products from different platform.1314## Methodology15161. **Hierarchical Weighting**: Convert paths to embeddings with exponentially decaying weights (Level i gets weight 0.6^(i-1)) to signify the importance of category granularity172. **Recursive Clustering**: Hierarchically cluster at each level (10-20 clusters at L1, 3-20 at L2-L5) using cosine distance183. **Intelligent Naming**: Generate category names via weighted word frequency + lemmatization + bundle word logic194. **Quality Control**: Exclude all ancestor words (parent, grandparent, etc.), avoid ancestor path duplicates, clean special characters2021## Output2223DataFrame with added columns:24- `unified_level_1`: Top-level category (e.g., "electronic | device")25- `unified_level_2`: Second-level category (e.g., "computer | laptop")26- `unified_level_3` through `unified_level_N`: Deeper levels2728Category names use ` | ` separator, max 5 words, covering 70%+ of records in each cluster.2930## Installation3132```bash33pip install pandas numpy scipy sentence-transformers nltk tqdm34python -c "import nltk; nltk.download('wordnet'); nltk.download('omw-1.4')"35```3637## 4-Step Pipeline3839### Step 1: Load, Standardize, Filter and Merge (`step1_preprocessing_and_merge.py`)40- **Input**: List of (DataFrame, source_name) tuples, each of the with `category_path` column41- **Process**: Per-source deduplication, text cleaning (remove &/,/'/-/quotes,'and' or "&", "," and so on, lemmatize words as nouns), normalize delimiter to ` > `, depth filtering, prefix removal, then merge all sources. source_level should reflect the processed version of the source level name42- **Output**: Merged DataFrame with `category_path`, `source`, `depth`, `source_level_1` through `source_level_N`4344### Step 2: Weighted Embeddings (`step2_weighted_embedding_generation.py`)45- **Input**: DataFrame from Step 146- **Output**: Numpy embedding matrix (n_records × 384)47- Weights: L1=1.0, L2=0.6, L3=0.36, L4=0.216, L5=0.1296 (exponential decay 0.6^(n-1))48- **Performance**: For ~10,000 records, expect 2-5 minutes. Progress bar will show encoding status.4950### Step 3: Recursive Clustering (`step3_recursive_clustering_naming.py`)51- **Input**: DataFrame + embeddings from Step 252- **Output**: Assignments dict {index → {level_1: ..., level_5: ...}}53- Average linkage + cosine distance, 10-20 clusters at L1, 3-20 at L2-L554- Word-based naming: weighted frequency + lemmatization + coverage ≥70%55- **Performance**: For ~10,000 records, expect 1-3 minutes for hierarchical clustering and naming. Be patient - the system is working through recursive levels.5657### Step 4: Export Results (`step4_result_assignments.py`)58- **Input**: DataFrame + assignments from Step 359- **Output**:60 - `unified_taxonomy_full.csv` - all records with unified categories61 - `unified_taxonomy_hierarchy.csv` - unique taxonomy structure6263## Usage6465**Use `scripts/pipeline.py` to run the complete 4-step workflow.**6667See `scripts/pipeline.py` for:68- Complete implementation of all 4 steps69- Example code for processing multiple sources70- Command-line interface71- Individual step usage (for advanced control)