|
interface SocioDemographicData { |
|
age: string; |
|
gender: string; |
|
percentage: number; |
|
social_group: string; |
|
} |
|
|
|
type SynonymsMap = Record<string, string[]>; |
|
|
|
export function characterizeSocioDemographicData( |
|
data: SocioDemographicData[] |
|
): string { |
|
const result: string[] = []; |
|
|
|
const ageSynonyms: SynonymsMap = { |
|
"15-24": ["young", "youthful", "adolescent", "teenage", "juvenile"], |
|
"25-34": ["young adult", "early adult", "youthful", "prime of life"], |
|
"35-49": ["middle-aged", "adult", "mature", "grown-up"], |
|
"50-64": ["senior", "elderly", "aged", "mature", "golden-aged"], |
|
"65-PLUS": ["elderly", "senior", "aged", "retired", "elder"], |
|
}; |
|
|
|
const socialGroupSynonyms: SynonymsMap = { |
|
"1": ["poorest", "impoverished", "deprived", "underprivileged", "needy"], |
|
"2": [ |
|
"poor", |
|
"low-income", |
|
"economically challenged", |
|
"struggling", |
|
"disadvantaged", |
|
], |
|
"3": ["poor", "struggling", "disadvantaged", "less fortunate", "in need"], |
|
"4": ["middle-income", "average", "moderate", "ordinary", "typical"], |
|
"5": ["middle-income", "average", "moderate", "ordinary", "typical"], |
|
"6": ["middle-income", "average", "moderate", "ordinary", "typical"], |
|
"7": ["rich", "affluent", "well-off", "prosperous", "wealthy"], |
|
"8": ["rich", "wealthy", "opulent", "affluent", "privileged"], |
|
"9": ["richest", "privileged", "wealthiest", "affluent", "opulent"], |
|
"10": ["richest", "wealthiest", "opulent", "affluent", "privileged"], |
|
}; |
|
|
|
const crowdedSynonyms = [ |
|
"crowded", |
|
"dense", |
|
"populated", |
|
"teeming", |
|
"packed", |
|
]; |
|
const notCrowdedSynonyms = [ |
|
"not that crowded", |
|
"sparsely populated", |
|
"unpopulated", |
|
"deserted", |
|
"vacant", |
|
]; |
|
|
|
const groupedData = data.reduce((groups, item) => { |
|
const key = `${item.age}-${item.gender}-${item.social_group}`; |
|
if (!groups[key]) { |
|
groups[key] = []; |
|
} |
|
groups[key].push(item.percentage); |
|
return groups; |
|
}, {} as Record<string, number[]>); |
|
|
|
for (const key in groupedData) { |
|
if (groupedData.hasOwnProperty(key)) { |
|
const percentages = groupedData[key]; |
|
const averagePercentage = |
|
percentages.reduce((sum, percentage) => sum + percentage, 0) / |
|
percentages.length; |
|
|
|
if (averagePercentage > 0.1) { |
|
result.push(...crowdedSynonyms); |
|
} else { |
|
result.push(...notCrowdedSynonyms); |
|
} |
|
|
|
const age = key.split("-")[0]; |
|
const randomAgeSynonym = ageSynonyms[age] |
|
? ageSynonyms[age][Math.floor(Math.random() * ageSynonyms[age].length)] |
|
: age; |
|
result.push(randomAgeSynonym); |
|
|
|
const socialGroup = key.split("-")[2]; |
|
const randomSocialGroupSynonym = socialGroupSynonyms[socialGroup] |
|
? socialGroupSynonyms[socialGroup][ |
|
Math.floor(Math.random() * socialGroupSynonyms[socialGroup].length) |
|
] |
|
: "social group " + socialGroup; |
|
result.push(randomSocialGroupSynonym); |
|
} |
|
} |
|
|
|
const finalString = result.filter((word) => isNaN(Number(word))).join(" "); |
|
|
|
return finalString; |
|
} |
|
|