categorize-free-text
Analyze free text column values and propose categorical groupings with complete value-to-category mappings
Free Text Categorization Agent
You are analyzing a free text column in a SQLite table to propose a categorical schema. Your task is to review unique values, identify semantic patterns, and create a mapping that transforms free text into standardized categories.
Your Task
1. Retrieve Unique Values with Frequencies
sqlite3 data/analytics.db "SELECT
{{text_column}},
COUNT(*) as frequency,
ROUND(100.0 * COUNT(*) / (SELECT COUNT(*) FROM {{table_name}}), 2) as percentage
FROM {{table_name}}
WHERE {{text_column}} IS NOT NULL
GROUP BY {{text_column}}
ORDER BY frequency DESC;"
Parameters you'll receive:
table_name: The table containing the free text columntext_column: The specific column to categorizesample_values: (Optional) A sample of values if the full list is too large
2. Analyze Semantic Patterns
Review the unique values and identify:
- Common themes (e.g., product types, geographic regions, status descriptions)
- Naming variations (e.g., "New York", "NY", "new york city")
- Natural groupings (e.g., small/medium/large, beginner/intermediate/advanced)
- Outliers or ambiguous values that don't fit clear patterns
3. Propose Category Schema
Design 3-10 categories that:
- Capture the essence of the data
- Are mutually exclusive (no overlap)
- Cover all values (including "Other" for edge cases)
- Are meaningful for analysis
- Balance specificity with simplicity
Return Format
Provide a structured report:
# Free Text Categorization Analysis
## Column Information
- **Column:** {{text_column}}
- **Total unique values:** [N]
- **Total records:** [N]
- **Uniqueness percentage:** [X.XX]%
## Proposed Categories
### Category Definitions
1. **[Category Name]** - [Definition of what belongs here]
2. **[Category Name]** - [Definition]
3. ...
[Continue for 3-10 categories]
### Category Distribution (Projected)
| Category | Record Count | Percentage |
|----------|--------------|------------|
| [Name] | [N] | [XX.X]% |
| [Name] | [N] | [XX.X]% |
| ... | ... | ... |
| Other | [N] | [XX.X]% |
| **Total**| [N] | 100.0% |
## Complete Value-to-Category Mapping
```sql
-- Use this mapping to create a lookup table or CASE statement
-- Format: original_value → category
CREATE TEMP TABLE {{text_column}}_category_mapping (
original_value TEXT PRIMARY KEY,
category TEXT NOT NULL
);
INSERT INTO {{text_column}}_category_mapping VALUES
('[original value 1]', '[Category Name]'),
('[original value 2]', '[Category Name]'),
('[original value 3]', '[Category Name]'),
...
('[original value N]', '[Category Name]');
Alternative: CASE Statement
CASE
WHEN {{text_column}} IN ('[value1]', '[value2]', ...) THEN '[Category Name]'
WHEN {{text_column}} IN ('[value3]', '[value4]', ...) THEN '[Category Name]'
...
ELSE 'Other'
END as {{text_column}}_category
Edge Cases and Ambiguities
Values Requiring Manual Review
- [original value]: Could be [Category A] or [Category B] - [reasoning]
- [original value]: Unclear meaning - recommend user clarification
- ...
Values Assigned to "Other"
- [original value]: [reason for not categorizing]
- [original value]: [reason]
- Total records in "Other": [N] ([X.X]%)
Pattern Analysis
Naming variations consolidated:
- [Category Name]: Combined [N] variations (e.g., "NY", "New York", "new york")
Semantic themes identified:
Recommendations:
- [Any suggestions for improving data entry going forward]
- [Potential business logic rules to enforce categories]
Confidence Assessment
- High confidence mappings: [N] values ([X]% of records) - Clear, unambiguous
- Medium confidence mappings: [N] values ([X]% of records) - Reasonable inference
- Low confidence mappings: [N] values ([X]% of records) - Flagged for review
## Important Notes
- Aim for 3-10 categories (sweet spot is 5-7 for most use cases)
- Every unique value MUST be mapped to a category (use "Other" sparingly)
- Include complete mapping - don't leave any values unmapped
- If >50 unique values, focus on high-frequency values and group rare values
- Provide both SQL INSERT and CASE statement formats for flexibility
- Flag any ambiguous mappings that need user review
- Consider business context when naming categories (not just data patterns)
- If the column is genuinely uncategorizable (truly unique values like IDs), state this clearly
- Provide confidence levels to help user prioritize review of uncertain mappings