Improves CSV data parsing and normalization

Normalizes data from CSV files by mapping sentiment strings to numeric scores and standardizing boolean values.

This change enhances data consistency and accuracy, ensuring reliable data processing for sentiment analysis and boolean evaluations. It also handles multiple languages for sentiment strings.
This commit is contained in:
2025-05-22 00:30:01 +02:00
parent 7479f3ec97
commit 4db0104e2c
2 changed files with 71 additions and 8 deletions

View File

@ -43,6 +43,58 @@ interface SessionData {
initialMsg?: string;
}
/**
* Converts sentiment string values to numeric scores
* @param sentimentStr The sentiment string from the CSV
* @returns A numeric score representing the sentiment
*/
function mapSentimentToScore(sentimentStr?: string): number | null {
if (!sentimentStr) return null;
// Convert to lowercase for case-insensitive matching
const sentiment = sentimentStr.toLowerCase();
// Map sentiment strings to numeric values on a scale from -1 to 2
const sentimentMap: Record<string, number> = {
'happy': 1.0,
'excited': 1.5,
'positive': 0.8,
'neutral': 0.0,
'playful': 0.7,
'negative': -0.8,
'angry': -1.0,
'sad': -0.7,
'frustrated': -0.9,
'positief': 0.8, // Dutch
'neutraal': 0.0, // Dutch
'negatief': -0.8, // Dutch
'positivo': 0.8, // Spanish/Italian
'neutro': 0.0, // Spanish/Italian
'negativo': -0.8, // Spanish/Italian
'yes': 0.5, // For any "yes" sentiment
'no': -0.5, // For any "no" sentiment
};
return sentimentMap[sentiment] !== undefined
? sentimentMap[sentiment]
: isNaN(parseFloat(sentiment)) ? null : parseFloat(sentiment);
}
/**
* Checks if a string value should be considered as boolean true
* @param value The string value to check
* @returns True if the string indicates a positive/true value
*/
function isTruthyValue(value?: string): boolean {
if (!value) return false;
const truthyValues = [
'1', 'true', 'yes', 'y', 'ja', 'si', 'oui', 'да', 'да', 'はい'
];
return truthyValues.includes(value.toLowerCase());
}
export async function fetchAndParseCsv(
url: string,
username?: string,
@ -103,9 +155,9 @@ export async function fetchAndParseCsv(
country: r.country,
language: r.language,
messagesSent: Number(r.messages_sent) || 0,
sentiment: r.sentiment ? parseFloat(r.sentiment) : null,
escalated: r.escalated === "1" || r.escalated === "true",
forwardedHr: r.forwarded_hr === "1" || r.forwarded_hr === "true",
sentiment: mapSentimentToScore(r.sentiment),
escalated: isTruthyValue(r.escalated),
forwardedHr: isTruthyValue(r.forwarded_hr),
fullTranscriptUrl: r.full_transcript_url,
avgResponseTime: r.avg_response_time
? parseFloat(r.avg_response_time)