this is my code to perform lemmatization and clustering of keyword. i will give you an extract of the output, and you must provide me some way to enhance the lemmatization and clustering of similar words. my final objective is to have few keywords, and those keywords must deeply represent the initial description. i want you to always provide me the entire correct code.

this is my original code

import os
import re
import csv
import argparse
import logging
import nltk
import pandas as pd
from collections import defaultdict, Counter
from nltk.stem import WordNetLemmatizer
from typing import List, Dict, Tuple
import numpy as np
from sklearn.preprocessing import OneHotEncoder

# Import the suggested libraries
from sentence_transformers import SentenceTransformer
from sklearn.cluster import AgglomerativeClustering
from rich.logging import RichHandler
from rich.progress import track
import torch


def download_nltk_data():
    """
    Ensures that required NLTK data packages are downloaded.
    """
    nltk_data_packages = ['wordnet']
    for package in nltk_data_packages:
        try:
            nltk.data.find(f'corpora/{package}')
            logging.info(f"NLTK package '{package}' already exists.")
        except LookupError:
            nltk.download(package)
            logging.info(f"Downloaded NLTK package '{package}'.")


def parse_arguments():
    """
    Parses command-line arguments.
    """
    parser = argparse.ArgumentParser(description='Process and cluster keywords from a CSV file.')
    parser.add_argument('--input_file', type=str,     default = "/home/danilo/Projects/IR_MD/utils/_testing_publication_cleaned_code/clothing_qwen_original.csv", required=False,
 help='Path to the input CSV file.')
    parser.add_argument('--save_lemmatized', action='store_true', help='Save lemmatized keywords and counts.')
    parser.add_argument('--model_name', type=str, default='all-MiniLM-L6-v2',
                        help='Name of the SentenceTransformer model to use for clustering. Default is "all-MiniLM-L6-v2".')
    parser.add_argument('--device', type=str, default='cuda',
                        help='Device to run the model on ("cuda" or "cpu"). Default is "cuda".')
    parser.add_argument('--frequency_threshold', type=int, default=0,
                        help='Frequency threshold for keywords. Set to 0 to cluster all keywords. Default is 0.')
    parser.add_argument('--num_clusters', type=int, default=None,
                        help='Number of clusters for keywords. Default is None.')
    parser.add_argument('--distance_threshold', type=float, default=0.2,
                        help='Distance threshold for clustering. Default is 0.6.')
    parser.add_argument('--category_limit', type=int, default=100,
                        help='Limit of top N keywords per category. Default is 100.')
    parser.add_argument('--remove_duplicates', action='store_true',
                        help='Remove duplicates in clustered keywords per row.')
    return parser.parse_args()


def main():
    # Parse command-line arguments
    args = parse_arguments()
    input_file = args.input_file
    save_lemmatized = args.save_lemmatized
    model_name = args.model_name
    device = args.device
    frequency_threshold = args.frequency_threshold
    num_clusters = args.num_clusters
    distance_threshold = args.distance_threshold
    category_limit = args.category_limit
    remove_duplicates = args.remove_duplicates

    # Check if input file exists
    if not os.path.exists(input_file):
        raise FileNotFoundError(f"Input file '{input_file}' does not exist.")

    # Set up logging
    input_dir = os.path.dirname(os.path.abspath(input_file))
    input_filename = os.path.basename(input_file)
    input_name_no_ext = os.path.splitext(input_filename)[0]
    processed_dir = os.path.join(input_dir, 'processed')
    os.makedirs(processed_dir, exist_ok=True)
    log_file = os.path.join(processed_dir, f'log_{input_name_no_ext}.log')

    # Remove any existing handlers
    for handler in logging.root.handlers[:]:
        logging.root.removeHandler(handler)

    logging.basicConfig(
        level=logging.INFO,
        format='%(message)s',
        datefmt='[%X]',
        handlers=[
            RichHandler(),               # For console output with Rich
            logging.FileHandler(log_file)  # For file logging
        ]
    )

    logging.info(f"Processing input file: {input_file}")

    # Download NLTK data if necessary
    download_nltk_data()

    # Initialize the lemmatizer
    lemmatizer = WordNetLemmatizer()

    # Labels (customizable)
    labels = ['Type', 'Color', 'Wear Location', 'Material', 'Style']  # Modify as needed

    # Define output file paths
    output_file = os.path.join(processed_dir, f'clustered_{input_filename}')
    one_hot_encoded_file = os.path.join(processed_dir, f'onehot_{input_name_no_ext}.tsv')
    lemmatized_counts_output_file = os.path.join(processed_dir, f'lemmatized_keyword_counts.csv')

    # ------------------------------#
    # Step 1: Cleaning #
    # ------------------------------#
    logging.info("Starting CSV cleaning...")
    df_clean = clean_csv(input_file, labels)
    logging.info("CSV cleaning completed.")

    # ------------------------------#
    # Step 2: Lemmatization #
    # ------------------------------#
    logging.info("Starting lemmatization...")
    if save_lemmatized:
        per_row_df, keyword_counts = lemmatize_keywords(df_clean, lemmatized_counts_output_file, lemmatizer)
    else:
        per_row_df, keyword_counts = lemmatize_keywords(df_clean, None, lemmatizer)
    # Check if per_row_df is None
    if per_row_df is None:
        logging.error("Error in lemmatization.")
        return

    # ------------------------------#
    # Step 3: Load Model #
    # ------------------------------#
    if device == 'cuda' and not torch.cuda.is_available():
        logging.warning("CUDA is not available, switching to CPU.")
        device = 'cpu'
    model = load_model(model_name, device=device)

    # ------------------------------#
    # Step 4: Clustering #
    # ------------------------------#
    logging.info("Starting clustering of keywords...")
    clustered_keyword_mapping = perform_clustering_with_threshold(
        keyword_counts, model,
        threshold=frequency_threshold, num_clusters=num_clusters,
        distance_threshold=distance_threshold
    )
    logging.info("Keyword clustering completed.")

    # ------------------------------#
    # Step 5: Clustered Keywords #
    # ------------------------------#
    per_row_df['Clustered Keywords'] = per_row_df['Lemmatized Keywords'].apply(
        lambda kws: ', '.join([clustered_keyword_mapping.get(kw, kw) for kw in kws.split(', ')])
    )

    # ------------------------------#
    # Step 6: Categorization #
    # ------------------------------#
    logging.info("Starting categorization of clustered keywords...")
    category_keyword_counts = categorize_and_count_clustered_keywords(
        per_row_df, labels=labels, category_limit=category_limit
    )
    logging.info("Categorization completed.")

    # ------------------------------#
    # Step 7: Final Processing #
    # ------------------------------#
    logging.info("Generating final clustered keywords and categories...")
    per_row_df = generate_clustered_keywords_and_categories(
        per_row_df, clustered_keyword_mapping, category_keyword_counts, labels=labels,
        remove_duplicates=remove_duplicates
    )
    logging.info("Final processing completed.")

    # Optionally, write category counts to CSV files
    if save_lemmatized:
        for category, counts in category_keyword_counts.items():
            category_counts_df = pd.DataFrame({'Keyword': list(counts.keys()), 'Count': list(counts.values())})
            category_counts_df = category_counts_df.sort_values(by='Count', ascending=False)
            category_counts_output_file = os.path.join(processed_dir, f'{category}_keywords_counts.csv')
            category_counts_df.to_csv(category_counts_output_file, index=False)
            logging.info(f"{category} keyword counts saved to '{category_counts_output_file}'.")

    # ------------------------------#
    # Step 8: Save Results #
    # ------------------------------#
    per_row_df.to_csv(output_file, index=False)
    logging.info(f"Process completed. Output saved to '{output_file}'.")

    # ------------------------------#
    # Step 9: One-Hot Encoding #
    # ------------------------------#
    logging.info("Starting one-hot encoding of categorical features...")
    encode_categorical_features(
        per_row_df, one_hot_encoded_file,
        id_column='Image Name', remove_extension='.jpg',
        labels=labels,
        sep='\t', header=False, index=False
    )
    logging.info(f"One-hot encoded features saved to '{one_hot_encoded_file}'.")


def clean_csv(input_file: str, labels: List[str]) -> pd.DataFrame:
    """
    Cleans the input CSV file and returns a DataFrame.

    Parameters:
        input_file (str): Path to the input CSV file.
        labels (List[str]): List of labels to process.

    Returns:
        pd.DataFrame: Cleaned DataFrame with 'Image Name' and 'Keywords' columns.
    """
    logging.info("Starting to clean the CSV file...")
    total_row_count = 0
    empty_row_count = 0
    na_count = 0
    no_comma_count = 0
    no_comma_rows = []
    cleaned_data = []
    # Read the entire content of the file
    try:
        with open(input_file, 'r', newline='', encoding='utf-8') as infile:
            content = infile.read()
    except Exception as e:
        logging.error(f"Error reading input file: {e}")
        raise

    # Remove newline characters inside quoted strings
    content = re.sub(r'("\[.*?")\n', r'\1 ', content)
    # Use StringIO to read the cleaned content as a CSV
    import io
    temp_file = io.StringIO(content)
    reader = csv.reader(temp_file)

    # Skip the first line (header)
    try:
        header = next(reader)
    except StopIteration:
        logging.error("Input file is empty.")
        raise ValueError("Input file is empty.")

    # Process each row
    for row in reader:
        total_row_count += 1
        if not row:
            continue
        jpg_file = row[0]
        if len(row) < 2:
            logging.warning(f"Row {total_row_count} doesn't have enough columns: {row}")
            keywords = []
        else:
            keywords = extract_keywords(row[1], labels)
        # Count occurrences of "N/A" and empty spaces
        na_count += keywords.count("N/A")
        na_count += sum(1 for k in keywords if k.strip() == "")
        # Check if the row is empty or contains only "N/A" or empty spaces
        if not keywords or all(k.strip().upper() == 'N/A' or k.strip() == '' for k in keywords):
            empty_row_count += 1
            continue  # Skip this row
        # Concatenate the keywords into a single string
        keywords_str = ', '.join(keywords)
        # Replace multiple spaces with a comma and a single space
        keywords_str = re.sub(r'\s{2,}', ', ', keywords_str)
        # Check if the row has no commas
        if ',' not in keywords_str:
            no_comma_count += 1
            no_comma_rows.append(f'{jpg_file},{keywords_str}')
        # Add to cleaned data
        cleaned_data.append({'Image Name': jpg_file, 'Keywords': keywords_str})
    # Now, create a DataFrame from the cleaned_data
    df = pd.DataFrame(cleaned_data)
    # Clean the 'Keywords' column further
    df = clean_keywords_in_df(df, labels)
    # Log statistics
    logging.info(f"Total rows processed: {total_row_count}")
    logging.info(f"Number of empty or N/A rows skipped: {empty_row_count}")
    logging.info(f"Occurrences of N/A (including empty spaces): {na_count}")
    logging.info(f"Number of rows without commas: {no_comma_count}")
    if no_comma_rows:
        logging.info("Rows without commas:")
        for row in no_comma_rows:
            logging.info(row)
    logging.info("CSV cleaning completed successfully.")
    return df


def extract_keywords(line: str, labels: List[str]) -> List[str]:
    """
    Extracts keywords from a line.

    Parameters:
        line (str): The line from which to extract keywords.
        labels (List[str]): List of labels to be removed.

    Returns:
        List[str]: List of extracted keywords.
    """
    # First, try to extract keywords between curly braces
    keywords = re.findall(r'\{([^}]+)\}', line)
    if keywords:
        # Further split if multiple keywords are within braces
        return [kw.strip() for group in keywords for kw in group.split(',')]
    # Remove newline characters from the keywords section
    line = line.replace('\n', ' ')
    # Remove the labels using word boundaries and considering possible formats
    for label in labels:
        # Patterns like "Label:", "Label -", "[Label]:", etc.
        pattern = rf'\b{re.escape(label)}\b[: -]?'
        line = re.sub(pattern, '', line, flags=re.IGNORECASE)
    # Remove any '- ' (dash and space) using exact string replacement
    line = line.replace('- ', '')
    # Remove single quotes around keywords using regex
    line = re.sub(r"'([^']+)'", r'\1', line)
    # Remove any remaining brackets
    line = line.replace('[', '').replace(']', '').replace('{', '').replace('}', '')
    # Split keywords by commas and strip whitespace
    keywords = [keyword.strip() for keyword in line.split(',') if keyword.strip()]
    return keywords


def clean_keywords_in_df(df: pd.DataFrame, labels: List[str]) -> pd.DataFrame:
    """
    Cleans the 'Keywords' column in the DataFrame.

    Parameters:
        df (pd.DataFrame): DataFrame containing the keywords to be cleaned.
        labels (List[str]): List of labels to be removed.

    Returns:
        pd.DataFrame: DataFrame with cleaned 'Keywords' column.
    """
    # Construct a regex pattern from the labels with word boundaries
    labels_pattern = r'\b(' + '|'.join(map(re.escape, labels)) + r')\b[: -]*'
    # Replace labels with an empty string using regex
    df['Keywords'] = df['Keywords'].str.replace(labels_pattern, '', regex=True)
    # Remove any '- ' (dash and space)
    df['Keywords'] = df['Keywords'].str.replace('- ', '', regex=False)
    # Remove single quotes around keywords
    df['Keywords'] = df['Keywords'].str.replace(r"'([^']+)'", r'\1', regex=True)
    # Replace multiple spaces with a comma and a single space
    df['Keywords'] = df['Keywords'].str.replace(r'\s{2,}', ', ', regex=True)
    # Remove leading/trailing commas and spaces
    df['Keywords'] = df['Keywords'].str.strip(' ,')
    return df


def lemmatize_keywords(df: pd.DataFrame, lemmatized_counts_output_file: str, lemmatizer: WordNetLemmatizer) -> Tuple[pd.DataFrame, Counter]:
    """
    Lemmatizes the keywords in the DataFrame and returns a DataFrame with lemmatized keywords.
    Optionally saves the lemmatized keyword counts to a CSV file.

    Parameters:
        df (pd.DataFrame): DataFrame containing 'Image Name' and 'Keywords' columns.
        lemmatized_counts_output_file (str): Path to save the lemmatized keyword counts CSV.
        lemmatizer (WordNetLemmatizer): NLTK WordNetLemmatizer instance.

    Returns:
        Tuple[pd.DataFrame, Counter]: DataFrame with lemmatized keywords and keyword counts.
    """
    logging.info("Starting lemmatization of keywords...")
    per_row_data = []
    keyword_counts = Counter()
    # Iterate through each row to extract and lemmatize keywords
    for index, row in track(df.iterrows(), total=len(df), description="Lemmatizing keywords..."):
        image_name = row.get('Image Name', '')
        keywords_str = row.get('Keywords', '')
        if pd.isna(keywords_str):
            keywords_str = ''
        # Split keywords by comma and strip whitespace
        extracted_keywords = [kw.strip() for kw in keywords_str.split(',')]
        # Lemmatize keywords
        lemmatized_keywords = [lemmatizer.lemmatize(kw.lower()) for kw in extracted_keywords if kw]
        # Update global counts
        keyword_counts.update(lemmatized_keywords)
        # Store per-row data
        per_row_data.append({
            'Image Name': image_name,
            'Keywords': ', '.join(extracted_keywords),
            'Lemmatized Keywords': ', '.join(lemmatized_keywords)
        })
    # Create a DataFrame from per_row_data
    per_row_df = pd.DataFrame(per_row_data)
    if lemmatized_counts_output_file:
        # Write the lemmatized keyword counts to CSV
        lemmatized_counts = [{'Lemmatized Keyword': kw, 'Count': count}
                             for kw, count in keyword_counts.items()]
        lemmatized_counts_df = pd.DataFrame(lemmatized_counts)
        # Sort by Count in descending order
        lemmatized_counts_df = lemmatized_counts_df.sort_values(by='Count', ascending=False)
        # Write to CSV
        try:
            lemmatized_counts_df.to_csv(lemmatized_counts_output_file, index=False)
            logging.info(f"Lemmatized keyword counts saved to '{lemmatized_counts_output_file}'.")
        except Exception as e:
            logging.error(f"Error saving lemmatized keyword counts: {e}")
            raise
    logging.info("Lemmatization completed.")
    return per_row_df, keyword_counts


def load_model(model_name: str, device: str = 'cuda') -> SentenceTransformer:
    """
    Loads a SentenceTransformer model.
    """
    try:
        logging.info(f"Loading SentenceTransformer model '{model_name}' on device '{device}'. This may take a few minutes...")
        model = SentenceTransformer(model_name, device=device)
        logging.info(f"Model '{model_name}' loaded successfully on device '{device}'.")
        return model
    except Exception as e:
        logging.error(f"Error loading model '{model_name}': {e}")
        raise


def perform_clustering_with_threshold(keyword_counts: Counter, model: SentenceTransformer, threshold: int = 0,
                                      num_clusters: int = None, distance_threshold: float = 0.6) -> Dict[str, str]:
    """
    Clusters keywords using hierarchical clustering.

    Parameters:
        keyword_counts (Counter): Counts of lemmatized keywords.
        model (SentenceTransformer): SentenceTransformer model.
        threshold (int): Frequency threshold to separate frequent and infrequent keywords.
                         Set to 0 to cluster all keywords.
        num_clusters (int): Number of clusters to form if distance_threshold is not specified. Default is None.
        distance_threshold (float): The linkage distance threshold above which clusters will not be merged.

    Returns:
        Dict[str, str]: A mapping from keywords to their cluster representatives.
    """
    logging.info(f"Clustering keywords with frequency threshold: {threshold}")
    # Since threshold is set to 0, we'll cluster all keywords
    all_keywords = list(keyword_counts.keys())
    logging.info(f"Total number of keywords to cluster: {len(all_keywords)}")

    # Cluster all keywords and map them to their representatives
    mapping = cluster_keywords(
        all_keywords, keyword_counts, model,
        num_clusters=num_clusters, distance_threshold=distance_threshold
    )
    logging.info(f"Number of cluster representatives: {len(set(mapping.values()))}")
    return mapping


def cluster_keywords(keywords: List[str], keyword_counts: Counter, model: SentenceTransformer,
                     num_clusters: int = None, distance_threshold: float = 0.6) -> Dict[str, str]:
    """
    Clusters keywords and maps them to cluster representatives.

    Parameters:
        keywords (List[str]): List of keywords to cluster.
        keyword_counts (Counter): Counts of lemmatized keywords.
        model (SentenceTransformer): SentenceTransformer model.
        num_clusters (int): Number of clusters to form. Default is None.
        distance_threshold (float): The linkage distance threshold above which clusters will not be merged.

    Returns:
        Dict[str, str]: A mapping from each keyword to its cluster representative.
    """
    logging.info("Clustering keywords...")
    # Compute embeddings for all keywords
    embeddings = model.encode(keywords, show_progress_bar=True)
    if len(embeddings) == 0:
        logging.warning("No valid embeddings found for clustering.")
        return {}
    # Compute cosine distance matrix
    from sklearn.metrics.pairwise import cosine_distances
    distance_matrix = cosine_distances(embeddings)
    # Perform Hierarchical Clustering using precomputed distances
    if distance_threshold is not None:
        logging.info(f"Using distance threshold: {distance_threshold}")
        clustering_model = AgglomerativeClustering(
            n_clusters=None,
            metric='precomputed',
            linkage='average',
            distance_threshold=distance_threshold
        )
    else:
        logging.info(f"Using number of clusters: {num_clusters}")
        clustering_model = AgglomerativeClustering(
            n_clusters=num_clusters,
            affinity='precomputed',
            linkage='average'
        )
    labels = clustering_model.fit_predict(distance_matrix)
    logging.info(f"Clustering completed. Number of clusters formed: {len(set(labels))}")
    # Organize keywords by clusters
    clusters = defaultdict(list)
    for label, keyword in zip(labels, keywords):
        clusters[label].append(keyword)
    # Select the most frequent keyword in each cluster as the representative
    representative_keywords = {}
    for label, words in clusters.items():
        most_frequent = max(words, key=lambda w: keyword_counts[w])
        representative_keywords[label] = most_frequent
    # Create a mapping from keyword to representative
    keyword_to_representative = {}
    for label, words in clusters.items():
        rep = representative_keywords[label]
        for word in words:
            keyword_to_representative[word] = rep
    return keyword_to_representative


def categorize_and_count_clustered_keywords(per_row_df: pd.DataFrame, labels: List[str], category_limit: int = 200) -> Dict[str, Counter]:
    """
    Categorizes clustered keywords and counts them per category.

    Parameters:
        per_row_df (pd.DataFrame): DataFrame containing 'Clustered Keywords'.
        labels (List[str]): List of category labels.
        category_limit (int): Limit of top N keywords per category.

    Returns:
        Dict[str, Counter]: Dictionary of keyword counts per category.
    """
    logging.info("Categorizing and counting clustered keywords...")
    category_keyword_counts = {label: Counter() for label in labels}
    for idx, row in per_row_df.iterrows():
        clustered_keywords = row['Clustered Keywords'].split(', ')
        for i, label in enumerate(labels):
            if i < len(clustered_keywords):
                keyword = clustered_keywords[i]
                category_keyword_counts[label][keyword] += 1
    # Limit to top N keywords per category
    for label in labels:
        original_count = len(category_keyword_counts[label])
        category_keyword_counts[label] = Counter(dict(category_keyword_counts[label].most_common(category_limit)))
        logging.info(f"Category '{label}': Reduced from {original_count} to {len(category_keyword_counts[label])} keywords (top {category_limit})")
    logging.info("Categorization and counting completed.")
    return category_keyword_counts


def generate_clustered_keywords_and_categories(per_row_df: pd.DataFrame, clustered_keyword_mapping: Dict[str, str],
                                               category_keyword_counts: Dict[str, Counter], labels: List[str],
                                               remove_duplicates: bool = False) -> pd.DataFrame:
    """
    Generates the final DataFrame with clustered keywords and category assignments.

    Parameters:
        per_row_df (pd.DataFrame): DataFrame containing 'Lemmatized Keywords'.
        clustered_keyword_mapping (Dict[str, str]): Mapping of keywords to their cluster representatives.
        category_keyword_counts (Dict[str, Counter]): Keyword counts per category.
        labels (List[str]): List of category labels.
        remove_duplicates (bool): Whether to remove duplicates in clustered keywords.

    Returns:
        pd.DataFrame: Updated DataFrame with 'Clustered Keywords' and category columns.
    """
    logging.info("Generating clustered keywords and assigning categories...")
    top_keywords_per_category = {label: set(counts.keys()) for label, counts in category_keyword_counts.items()}
    # Initialize lists for categories and counters for "Other"
    category_keywords_list = {label: [] for label in labels}
    clustered_keywords_list = []
    # Initialize a counter for the number of rows with specific "Other" counts
    max_other_count = len(labels)
    other_count_rows = {i: 0 for i in range(max_other_count + 1)}  # from 0 to len(labels)
    for idx, row in per_row_df.iterrows():
        lemmatized_keywords = row['Lemmatized Keywords'].split(', ')
        clustered_keywords = [clustered_keyword_mapping.get(kw, kw) for kw in lemmatized_keywords]
        if remove_duplicates:
            # Remove duplicates while preserving order
            clustered_keywords = list(dict.fromkeys(clustered_keywords))
        clustered_keywords_list.append(', '.join(clustered_keywords))
        # Initialize "Other" counter for each row
        row_other_count = 0
        # Assign keywords to categories based on positions
        for i, label in enumerate(labels):
            if i < len(clustered_keywords):
                keyword = clustered_keywords[i]
                # Map to 'Other' if not in top keywords
                if keyword not in top_keywords_per_category[label]:
                    keyword = 'Other'
                    row_other_count += 1  # Increase the row counter for "Other"
                category_keywords_list[label].append(keyword)
            else:
                category_keywords_list[label].append('')  # or 'Other'
        # Count the number of rows with the specific number of "Other" keywords
        if row_other_count <= max_other_count:
            other_count_rows[row_other_count] += 1
    per_row_df['Clustered Keywords'] = clustered_keywords_list
    # Add the category columns to per_row_df
    for label in labels:
        per_row_df[label] = category_keywords_list[label]
    # Log summary of "Other" counts per category
    other_count = {label: 0 for label in labels}  # Counter for "Other" per category
    logging.info("\nSummary of 'Other' counts per category:")
    for label in labels:
        other_count[label] = sum(1 for keyword in category_keywords_list[label] if keyword == 'Other')
        logging.info(f"{label}: {other_count[label]}")
    # Log the summary of rows having specific "Other" counts
    logging.info("\nSummary of 'Other' count rows:")
    for count in range(max_other_count + 1):
        logging.info(f"Rows with {count} 'Other' keywords: {other_count_rows[count]}")
    logging.info("Clustered keywords and categories generated successfully.")
    return per_row_df


def encode_categorical_features(input_df: pd.DataFrame, output_tsv_path: str, id_column: str = 'Image Name',
                                remove_extension: str = '.jpg', labels: List[str] = None, sep: str = '\t',
                                header: bool = False, index: bool = False):
    """
    Encodes categorical features using One-Hot Encoding and saves them to a TSV file.

    Parameters:
        input_df (pd.DataFrame): Input DataFrame containing the categorical features.
        output_tsv_path (str): Path to save the one-hot encoded TSV file.
        id_column (str): Name of the identifier column.
        remove_extension (str): Extension to remove from the identifier column values.
        labels (List[str]): List of columns to encode.
        sep (str): Delimiter to use in the TSV file.
        header (bool): Whether to include the header in the TSV file.
        index (bool): Whether to write row names (index).
    """
    logging.info("Starting one-hot encoding of categorical features...")
    if labels is None:
        raise ValueError("Labels for encoding must be provided.")
    # Read only the necessary columns
    columns_to_encode = labels
    columns_to_read = [id_column] + columns_to_encode
    df = input_df[columns_to_read]
    # Initialize OneHotEncoder
    enc = OneHotEncoder(handle_unknown='ignore', dtype=np.int8)
    # Fit and transform the categorical columns
    emb = enc.fit_transform(df[columns_to_encode])
    # Retrieve the names of the one-hot encoded features
    feature_names = enc.get_feature_names_out(input_features=columns_to_encode)
    # Create a DataFrame with the encoded features
    emb_df = pd.DataFrame(emb.toarray(), columns=feature_names, dtype=np.int8)
    # Concatenate the id_column with the one-hot encoded features
    result_df = pd.concat([df[[id_column]].reset_index(drop=True), emb_df.reset_index(drop=True)], axis=1)
    # Remove specified extension from id_column
    if remove_extension:
        result_df[id_column] = result_df[id_column].str.replace(remove_extension, '', regex=False)
    # Save to TSV file
    try:
        result_df.to_csv(output_tsv_path, index=index, header=header, sep=sep)
        logging.info(f"One-hot encoded features saved successfully to '{output_tsv_path}'.")
    except Exception as e:
        logging.error(f"Error saving one-hot encoded features: {e}")
        raise


if __name__ == "__main__":
    main()


this is an extract of the output:
Image Name,Keywords,Lemmatized Keywords,Clustered Keywords,Type,Color,Wear Location,Material,Style
B00404NH66.jpg,"polo shirt, black, torso, cotton, casual","polo shirt, black, torso, cotton, casual","shirt, black, torso, cotton, casual",shirt,black,torso,cotton,casual
B009I3F7A8.jpg,"shoes, black, white, foot, leather, athletic","shoe, black, white, foot, leather, athletic","shoe, black, white, foot, leather, athletic",shoe,black,white,foot,Other
B004C4BROI.jpg,"necklace, orange, neck, metal, sports","necklace, orange, neck, metal, sport","necklace, orange, neck, metal, athletic",necklace,orange,neck,metal,athletic
B0076V22SO.jpg,"tank top, multi, torso, polyester, active wear","tank top, multi, torso, polyester, active wear","tank top, multi, torso, polyester, active wear",tank top,multi,torso,polyester,active wear
B003ZLT4TY.jpg,"earrings, silver, ears, metal, sporty","earring, silver, ear, metal, sporty","ear, silver, ear, metal, sporty",ear,silver,ear,metal,sporty
B004T2YCTA.jpg,"shoes, blue, feet, fabric, slipper","shoe, blue, foot, fabric, slipper","shoe, blue, foot, fabric, slipper",shoe,blue,foot,fabric,Other
B009E322VE.jpg,"book cover, yellow, none, leather, minimalist","book cover, yellow, none, leather, minimalist","book cover, yellow, none, leather, minimalist",Other,yellow,none,leather,minimalist
B006TJXGL6.jpg,"keychain, blue, keyring, rubber, anime character","keychain, blue, keyring, rubber, anime character","keychain, blue, keyring, rubber, anime character",keychain,blue,keyring,rubber,Other
B00BWVELC4.jpg,"belt, blue, waist, leather, formal","belt, blue, waist, leather, formal","belt, blue, waist, leather, formal",belt,blue,waist,leather,formal
B005DSTH8A.jpg,"shorts, black, legs, spandex, athletic","short, black, leg, spandex, athletic","short, black, leg, spandex, athletic",short,black,leg,spandex,athletic
B004E50EYY.jpg,"T-shirt, black, torso, cotton, athletic","t-shirt, black, torso, cotton, athletic","t-shirt, black, torso, cotton, athletic",t-shirt,black,torso,cotton,athletic
B00899E2SU.jpg,"T-shirt, black, torso, cotton, casual","t-shirt, black, torso, cotton, casual","t-shirt, black, torso, cotton, casual",t-shirt,black,torso,cotton,casual
B0017L98A4.jpg,"shoe, red, foot, canvas, flat","shoe, red, foot, canvas, flat","shoe, red, foot, canvas, flat",shoe,red,foot,canvas,flat
B00EAA91B0.jpg,"backpack, red, back, fabric, anime","backpack, red, back, fabric, anime","backpack, red, back, fabric, anime",backpack,red,back,fabric,anime
B006Q5QAE8.jpg,"shoe, white, foot, leather, athletic","shoe, white, foot, leather, athletic","shoe, white, foot, leather, athletic",shoe,white,foot,leather,athletic
B009VQYN2U.jpg,"earrings, blue, ears, metal, feminine","earring, blue, ear, metal, feminine","ear, blue, ear, metal, feminine",ear,blue,ear,metal,feminine
B001NHE4EC.jpg,"bracelet, orange, wrist, metal, sporty","bracelet, orange, wrist, metal, sporty","bracelet, orange, wrist, metal, sporty",bracelet,orange,wrist,metal,sporty
B000V20IWC.jpg,"shoe, green, foot, mesh, running","shoe, green, foot, mesh, running","shoe, green, foot, mesh, running",shoe,green,foot,mesh,running
B003VY3ULS.jpg,"pant, gray, lower body, polyester, casual","pant, gray, lower body, polyester, casual","pant, gray, upper body, polyester, casual",pant,gray,upper body,polyester,casual
B009TCXRNM.jpg,"mask, gold, face, fabric, Venetian","mask, gold, face, fabric, venetian","mask, gold, face, fabric, venetian",mask,gold,face,fabric,Other
B000EM6GJ8.jpg,"T-shirt, camouflage, torso, cotton, casual","t-shirt, camouflage, torso, cotton, casual","t-shirt, camouflage, torso, cotton, casual",t-shirt,camouflage,torso,cotton,casual
B002LFFWHS.jpg,"necklace, purple, neck, metal, bohemian","necklace, purple, neck, metal, bohemian","necklace, purple, neck, metal, bohemian",necklace,purple,neck,metal,bohemian
B005I57JMO.jpg,"costume accessory, black, head, neck, wrist, furry fabric, animal-themed","costume accessory, black, head, neck, wrist, furry fabric, animal-themed","costume accessory, black, head, neck, wrist, furry fabric, animal-themed",Other,black,head,neck,Other
B003YQVLGE.jpg,"bandages, blue, arm/leg, cloth, medical","bandage, blue, arm/leg, cloth, medical","bandage, blue, arm/leg, cloth, medical",Other,blue,Other,cloth,medical
B0009R8A1K.jpg,"jewelry, gold, neck, metal, pendant","jewelry, gold, neck, metal, pendant","jewelry, gold, neck, metal, pendant",jewelry,gold,neck,metal,pendant
B00D7JA36C.jpg,"necklace, silver, neck, metal, Western","necklace, silver, neck, metal, western","necklace, silver, neck, metal, western",necklace,silver,neck,metal,western
B004RSH4WS.jpg,"jacket, black, upper body, polyester, casual","jacket, black, upper body, polyester, casual","jacket, black, upper body, polyester, casual",jacket,black,upper body,polyester,casual
B00EVQI7XG.jpg,"hat, blue, head, fleece, funny","hat, blue, head, fleece, funny","hat, blue, head, fleece, funny",hat,blue,head,fleece,funny
B00A7IV5U4.jpg,"umbrella, black and white, hands, fabric, golf","umbrella, black and white, hand, fabric, golf","umbrella, black and white, hand, fabric, golf",umbrella,black and white,hand,fabric,golf
B000HJN8Y4.jpg,"headwear, pink, head, feather, fancy","headwear, pink, head, feather, fancy","headwear, pink, head, feather, fancy",headwear,pink,head,feather,fancy
B004FJL5MO.jpg,"shorts, black, lower body, cotton, cargo","short, black, lower body, cotton, cargo","short, black, upper body, cotton, cargo",short,black,upper body,cotton,cargo
B0031R0DDI.jpg,"bracelet, silver, wrist, metal, stackable","bracelet, silver, wrist, metal, stackable","bracelet, silver, wrist, metal, stackable",bracelet,silver,wrist,metal,Other
B0050R1AAM.jpg,"flashlight, silver, hand, metal, compact","flashlight, silver, hand, metal, compact","flashlight, silver, hand, metal, compact",Other,silver,hand,metal,compact
B0087UI750.jpg,"hat, blue, head, fabric, military","hat, blue, head, fabric, military","hat, blue, head, fabric, military",hat,blue,head,fabric,military
B004GHHR1S.jpg,"sunglasses, white, face, plastic, sporty","sunglass, white, face, plastic, sporty","sunglass, white, face, plastic, sporty",sunglass,white,face,plastic,sporty
B005OUDUQ2.jpg,"tank top, red, torso, cotton, casual","tank top, red, torso, cotton, casual","tank top, red, torso, cotton, casual",tank top,red,torso,cotton,casual
B006YCSBKE.jpg,"hat, blue, head, wool, cute","hat, blue, head, wool, cute","hat, blue, head, wool, cute",hat,blue,head,wool,cute
B00AWZEXDI.jpg,"pajama pants, black, lower body, flannel, casual","pajama pants, black, lower body, flannel, casual","pajama pants, black, upper body, flannel, casual",pajama pants,black,upper body,flannel,casual
B00142IDBQ.jpg,"sunglasses, gold, face, metal, modern","sunglass, gold, face, metal, modern","sunglass, gold, face, metal, modern",sunglass,gold,face,metal,modern
B0057UOHPW.jpg,"dress, beige, torso, cotton, casual","dress, beige, torso, cotton, casual","dress, beige, torso, cotton, casual",dress,beige,torso,cotton,casual
B00DEPFS1Y.jpg,"leggings, pink, legs, spandex, active wear","legging, pink, leg, spandex, active wear","legging, pink, leg, spandex, active wear",legging,pink,leg,spandex,active wear
B00IHNHQVI.jpg,"necklace, silver, neck, metal, modern","necklace, silver, neck, metal, modern","necklace, silver, neck, metal, modern",necklace,silver,neck,metal,modern
B000S95TWM.jpg,"watch, black, wrist, leather, classical","watch, black, wrist, leather, classical","watch, black, wrist, leather, classical",watch,black,wrist,leather,classical
B0053WWRF6.jpg,"vehicle, brown, entire body, metal, rusty","vehicle, brown, entire body, metal, rusty","car, brown, entire body, metal, rust",Other,brown,entire body,metal,Other
B008934F7O.jpg,"sunglasses, red, face, plastic, retro","sunglass, red, face, plastic, retro","sunglass, red, face, plastic, retro",sunglass,red,face,plastic,Other
B005CCK8XU.jpg,"bracelet, red and black, wrist, plastic, sports","bracelet, red and black, wrist, plastic, sport","bracelet, red and white, wrist, plastic, athletic",bracelet,red and white,wrist,plastic,athletic
B000O8PC4M.jpg,"socks, black, legs, cotton, athletic","sock, black, leg, cotton, athletic","sock, black, leg, cotton, athletic",sock,black,leg,cotton,athletic
B001XURZL8.jpg,"boots, black, footwear, rubber, winter","boot, black, footwear, rubber, winter","boot, black, footwear, rubber, winter",boot,black,footwear,rubber,winter
B00HX9C0N6.jpg,"shoes, neon green, foot, leather, wedge","shoe, neon green, foot, leather, wedge","shoe, neon green, foot, leather, wedge",shoe,neon green,foot,leather,Other
B0083C21LS.jpg,"T-shirt, white, torso, cotton, casual","t-shirt, white, torso, cotton, casual","t-shirt, white, torso, cotton, casual",t-shirt,white,torso,cotton,casual
B008MQD3VC.jpg,"backpack, pink, back, fabric, casual","backpack, pink, back, fabric, casual","backpack, pink, back, fabric, casual",backpack,pink,back,fabric,casual
B00ABB3QCM.jpg,"duffle bag, pink, shoulder, fabric, giraffe print","duffle bag, pink, shoulder, fabric, giraffe print","duffle bag, pink, shoulder, fabric, giraffe print",duffle bag,pink,shoulder,fabric,Other
B00DLDAATY.jpg,"jewelry, blue, neck, metal, pendant","jewelry, blue, neck, metal, pendant","jewelry, blue, neck, metal, pendant",jewelry,blue,neck,metal,pendant
B00AJF40KM.jpg,"shoe, gray, foot, leather, hiking","shoe, gray, foot, leather, hiking","shoe, gray, foot, leather, hiking",shoe,gray,foot,leather,hiking
B00E6T6F1Y.jpg,"backpack, black, back, fabric, casual","backpack, black, back, fabric, casual","backpack, black, back, fabric, casual",backpack,black,back,fabric,casual
B0034460US.jpg,"brooch, silver, dress, metal, vintage","brooch, silver, dress, metal, vintage","brooch, silver, dress, metal, vintage",brooch,silver,Other,metal,vintage
B0002MGM58.jpg,"shirt, olive green, torso, cotton, casual","shirt, olive green, torso, cotton, casual","shirt, olive green, torso, cotton, casual",shirt,olive green,torso,cotton,casual
B00H9GBD0E.jpg,"jacket, purple, upper body, polyester, casual","jacket, purple, upper body, polyester, casual","jacket, purple, upper body, polyester, casual",jacket,purple,upper body,polyester,casual
B00GBNGPFY.jpg,"helmet, gold, head, metal, viking","helmet, gold, head, metal, viking","helmet, gold, head, metal, viking",helmet,gold,head,metal,Other
B002HWSFDS.jpg,"sandals, black, feet, leather, casual","sandal, black, foot, leather, casual","sandal, black, foot, leather, casual",sandal,black,foot,leather,casual
B000KG8KHE.jpg,"backpack, pink, shoulder, nylon, sporty","backpack, pink, shoulder, nylon, sporty","backpack, pink, shoulder, nylon, sporty",backpack,pink,shoulder,nylon,sporty
B00CLGTK7U.jpg,"dresser, brown, closet, wood, traditional","dresser, brown, closet, wood, traditional","dresser, brown, closet, wood, traditional",dresser,brown,closet,wood,traditional
B00E3DRI4G.jpg,"backpack, pink, back, fabric, character-themed","backpack, pink, back, fabric, character-themed","backpack, pink, back, fabric, character-themed",backpack,pink,back,fabric,Other
B002BZIFB8.jpg,"gloves, silver, hands, leather, formal","glove, silver, hand, leather, formal","glove, silver, hand, leather, formal",glove,silver,hand,leather,formal
B0080QYSC2.jpg,"costume, yellow, full body, inflatable, funny","costume, yellow, full body, inflatable, funny","costume, yellow, full body, inflatable, funny",costume,yellow,full body,Other,funny
B0042CR8XO.jpg,"bracelet, brown, wrist, leather, sporty","bracelet, brown, wrist, leather, sporty","bracelet, brown, wrist, leather, sporty",bracelet,brown,wrist,leather,sporty
B0042JYQZU.jpg,"accessory, black, waist, nylon, suspender","accessory, black, waist, nylon, suspender","accessory, black, waist, nylon, suspender",accessory,black,waist,nylon,Other
B002X9MY82.jpg,"backpack, black, shoulder, nylon, casual","backpack, black, shoulder, nylon, casual","backpack, black, shoulder, nylon, casual",backpack,black,shoulder,nylon,casual
B008A2V6L2.jpg,"jacket, black, upper body, polyester, athletic","jacket, black, upper body, polyester, athletic","jacket, black, upper body, polyester, athletic",jacket,black,upper body,polyester,athletic
B00CF1AQG0.jpg,"bracelet, gold, wrist, metal, chain","bracelet, gold, wrist, metal, chain","bracelet, gold, wrist, metal, chain",bracelet,gold,wrist,metal,chain
B004CWAZIE.jpg,"dress, blue, torso, cotton, casual","dress, blue, torso, cotton, casual","dress, blue, torso, cotton, casual",dress,blue,torso,cotton,casual
B005KS9HHE.jpg,"jacket, red, upper body, cotton, chef's uniform","jacket, red, upper body, cotton, chef's uniform","jacket, red, upper body, cotton, chef's uniform",jacket,red,upper body,cotton,Other
B0044KBSFI.jpg,"accessory, silver, cuff, metal, formal","accessory, silver, cuff, metal, formal","accessory, silver, cuff, metal, formal",accessory,silver,cuff,metal,formal
B0042LAS78.jpg,"shirt, blue, torso, cotton, casual","shirt, blue, torso, cotton, casual","shirt, blue, torso, cotton, casual",shirt,blue,torso,cotton,casual
B00975AT6O.jpg,"leggings, navy blue, legs, spandex, athletic","legging, navy blue, leg, spandex, athletic","legging, navy blue, leg, spandex, athletic",legging,navy blue,leg,spandex,athletic
B0098DHPVW.jpg,"belt, red and blue, waist, nylon, cosplay","belt, red and blue, waist, nylon, cosplay","belt, red and white, waist, nylon, cosplay",belt,red and white,waist,nylon,cosplay
B006JUORN6.jpg,"bicycle shorts, black and white, legs, spandex, athletic","bicycle shorts, black and white, leg, spandex, athletic","bicycle shorts, black and white, leg, spandex, athletic",Other,black and white,leg,spandex,athletic
B007YGMIW6.jpg,"necklace, yellow, neck, metal, sports","necklace, yellow, neck, metal, sport","necklace, yellow, neck, metal, athletic",necklace,yellow,neck,metal,athletic
B001T9MY0A.jpg,"jewelry box, natural wood, desk, bamboo, modern","jewelry box, natural wood, desk, bamboo, modern","jewelry box, natural wood, desk, bamboo, modern",jewelry box,natural wood,desk,Other,modern
B003WSY1J8.jpg,"jewelry, gold, neck, wrist, ears, metal, sporty","jewelry, gold, neck, wrist, ear, metal, sporty","jewelry, gold, neck, wrist, ear, metal, sporty",jewelry,gold,neck,wrist,ear
B00HIIZNCM.jpg,"sunglasses, black, face, plastic, sporty","sunglass, black, face, plastic, sporty","sunglass, black, face, plastic, sporty",sunglass,black,face,plastic,sporty
B000YHBWCO.jpg,"jewelry, blue, finger, metal, funny","jewelry, blue, finger, metal, funny","jewelry, blue, finger, metal, funny",jewelry,blue,finger,metal,funny
B002IPH8AA.jpg,"coat, black, upper body, polyester, long-sleeved","coat, black, upper body, polyester, long-sleeved","coat, black, upper body, polyester, long-sleeve shirt",coat,black,upper body,polyester,long-sleeve shirt
B005MY4L40.jpg,"underwear, brown, lower body, cotton, long johns","underwear, brown, lower body, cotton, long johns","underwear, brown, upper body, cotton, long johns",underwear,brown,upper body,cotton,Other
B00280BS3I.jpg,"clutch, gold, hand, leather, luxury","clutch, gold, hand, leather, luxury","clutch, gold, hand, leather, luxury",Other,gold,hand,leather,Other
B006RUIXCE.jpg,"T-shirt, black, torso, cotton, casual","t-shirt, black, torso, cotton, casual","t-shirt, black, torso, cotton, casual",t-shirt,black,torso,cotton,casual
B007RE3OXC.jpg,"map, blue, desk, paper, geographical","map, blue, desk, paper, geographical","map, blue, desk, paper, geographical",Other,blue,desk,paper,Other
B003EE06VM.jpg,"charm, gold, jewelry, metal, fashion","charm, gold, jewelry, metal, fashion","charm, gold, jewelry, metal, fashionable",Other,gold,jewelry,metal,fashionable
B002RCY4UQ.jpg,"shoes, white, feet, fabric, space-themed","shoe, white, foot, fabric, space-themed","shoe, white, foot, fabric, space-themed",shoe,white,foot,fabric,Other
B002EL309G.jpg,"sunglasses, black, face, metal, sporty","sunglass, black, face, metal, sporty","sunglass, black, face, metal, sporty",sunglass,black,face,metal,sporty
B005VTGWXY.jpg,"purse, red, shoulder, canvas, classic","purse, red, shoulder, canvas, classic","purse, red, shoulder, canvas, classic",purse,red,shoulder,canvas,classic
B0059BMGRU.jpg,"jacket, black, upper body, polyester, sporty","jacket, black, upper body, polyester, sporty","jacket, black, upper body, polyester, sporty",jacket,black,upper body,polyester,sporty
B002DYCO6E.jpg,"socks, black, foot, cotton, athletic","sock, black, foot, cotton, athletic","sock, black, foot, cotton, athletic",sock,black,foot,cotton,athletic
B005HNPPS2.jpg,"purse, gray, shoulder, felt, crossbody","purse, gray, shoulder, felt, crossbody","purse, gray, shoulder, felt, crossbody",purse,gray,shoulder,felt,Other
B0059DXZZ0.jpg,"sweater, black, upper body, cotton blend, casual","sweater, black, upper body, cotton blend, casual","sweater, black, upper body, cotton blend, casual",sweater,black,upper body,cotton blend,casual
B000KDUFRU.jpg,"gloves, black, hands, fleece, winter","glove, black, hand, fleece, winter","glove, black, hand, fleece, winter",glove,black,hand,fleece,winter
B00AF3DCSY.jpg,"hat, white, head, plush, animal-themed","hat, white, head, plush, animal-themed","hat, white, head, plush, animal-themed",hat,white,head,plush,animal-themed
B00AD3LM9C.jpg,"bra, black, torso, foam, basic","bra, black, torso, foam, basic","bra, black, torso, foam, basic",bra,black,torso,foam,Other
B00INR2I20.jpg,"bracelet, black, wrist, leather, minimalist","bracelet, black, wrist, leather, minimalist","bracelet, black, wrist, leather, minimalist",bracelet,black,wrist,leather,minimalist
B000BQVSUY.jpg,"socks, white, foot, cotton, athletic","sock, white, foot, cotton, athletic","sock, white, foot, cotton, athletic",sock,white,foot,cotton,athletic
B000GI02X6.jpg,"necklace, silver, neck, metal, casual","necklace, silver, neck, metal, casual","necklace, silver, neck, metal, casual",necklace,silver,neck,metal,casual
B000V4Q7E8.jpg,"mask, black, head, latex, halloween","mask, black, head, latex, halloween","mask, black, head, latex, halloween",mask,black,head,latex,halloween
B00AARAT18.jpg,"shorts, black and white, lower body, polyester, athletic","short, black and white, lower body, polyester, athletic","short, black and white, upper body, polyester, athletic",short,black and white,upper body,polyester,athletic
B00H6ATK0S.jpg,"jewelry, black, ears, rubber, tunnel","jewelry, black, ear, rubber, tunnel","jewelry, black, ear, rubber, tunnel",jewelry,black,ear,rubber,Other
B0040AEXN6.jpg,"jewelry box, brown, dresser, wood, traditional","jewelry box, brown, dresser, wood, traditional","jewelry box, brown, dresser, wood, traditional",jewelry box,brown,dresser,wood,traditional
B00CQ5RGNG.jpg,"toy, multi, none, plastic, cartoon","toy, multi, none, plastic, cartoon","toy, multi, none, plastic, cartoon",toy,multi,none,plastic,cartoon
B001D0BHNA.jpg,"costume, black, red, entire body, velvet, felt, animal","costume, black, red, entire body, velvet, felt, animal","costume, black, red, entire body, velvet, felt, animal",costume,black,red,entire body,Other
B00EVQI8HQ.jpg,"hat, brown, head, fleece, animal-themed","hat, brown, head, fleece, animal-themed","hat, brown, head, fleece, animal-themed",hat,brown,head,fleece,animal-themed
B00BJH45EU.jpg,"dress, pink, torso, tulle, fancy","dress, pink, torso, tulle, fancy","dress, pink, torso, tulle, fancy",dress,pink,torso,tulle,fancy
B003TYOAM8.jpg,"mask, silver, face, plastic, masquerade","mask, silver, face, plastic, masquerade","mask, silver, face, plastic, masquerade",mask,silver,face,plastic,masquerade
B003XRSGE4.jpg,"hardware, silver, accessory, metal, rectangular","hardware, silver, accessory, metal, rectangular","hardware, silver, accessory, metal, rectangular",Other,silver,accessory,metal,rectangular
B003WHJKS6.jpg,"hat, camouflage, head, fabric, casual","hat, camouflage, head, fabric, casual","hat, camouflage, head, fabric, casual",hat,camouflage,head,fabric,casual
B0019GJEDI.jpg,"dresser, brown, none, wood, modern","dresser, brown, none, wood, modern","dresser, brown, none, wood, modern",dresser,brown,none,wood,modern
B002NBR4IU.jpg,"socks, black, foot, cotton, no-show","sock, black, foot, cotton, no-show","sock, black, foot, cotton, no-show",sock,black,foot,cotton,Other
B0054I61II.jpg,"backpack, black, shoulder, nylon, functional","backpack, black, shoulder, nylon, functional","backpack, black, shoulder, nylon, functional",backpack,black,shoulder,nylon,functional
B00AOG1P5Y.jpg,"statue, black, yellow, none, ceramic, modern","statue, black, yellow, none, ceramic, modern","statue, black, yellow, none, ceramic, modern",Other,black,yellow,Other,Other
B0080RHYAE.jpg,"backpack, teal, shoulder, nylon, casual","backpack, teal, shoulder, nylon, casual","backpack, teal, shoulder, nylon, casual",backpack,teal,shoulder,nylon,casual
B0041F24QI.jpg,"costume, blue, full body, fabric, boxing","costume, blue, full body, fabric, boxing","costume, blue, full body, fabric, boxer",costume,blue,full body,fabric,Other
B001KA9ZWI.jpg,"socks, navy, feet, cotton, animal print","sock, navy, foot, cotton, animal print","sock, navy, foot, cotton, animal print",sock,navy,foot,cotton,animal print
B0017LEB1U.jpg,"shoe, brown and blue, foot, leather, casual","shoe, brown and blue, foot, leather, casual","shoe, brown and white, foot, leather, casual",shoe,brown and white,foot,leather,casual
B0016JKZZ4.jpg,"hat, black, head, fabric, casual","hat, black, head, fabric, casual","hat, black, head, fabric, casual",hat,black,head,fabric,casual
B00AOSK8TG.jpg,"gloves, black, hands, knit, pirate","glove, black, hand, knit, pirate","glove, black, hand, knit, pirate",glove,black,hand,knit,pirate
B00AFYJD0O.jpg,"purse, purple, hand, quilted fabric, boho","purse, purple, hand, quilted fabric, boho","purse, purple, hand, quilted fabric, boho",purse,purple,hand,quilted fabric,boho
B000NID3XU.jpg,"sandals, blue, foot, fabric, casual","sandal, blue, foot, fabric, casual","sandal, blue, foot, fabric, casual",sandal,blue,foot,fabric,casual
B000IZYV6Q.jpg,"gloves, gray, hands, wool, fingerless","glove, gray, hand, wool, fingerless","glove, gray, hand, wool, fingerless",glove,gray,hand,wool,Other
B007ZH1UKA.jpg,"hat, light blue, head, cotton, casual","hat, light blue, head, cotton, casual","hat, blue, head, cotton, casual",hat,blue,head,cotton,casual
B006SMGVDE.jpg,"ribbon, pink, none, fabric, decorative","ribbon, pink, none, fabric, decorative","ribbon, pink, none, fabric, decorative",Other,pink,none,fabric,decorative
B000KZEEYS.jpg,"pouch, green, waist, canvas, military","pouch, green, waist, canvas, military","pouch, green, waist, canvas, military",pouch,green,waist,canvas,military
B001G7QL5Y.jpg,"glove, black, hands, leather, winter","glove, black, hand, leather, winter","glove, black, hand, leather, winter",glove,black,hand,leather,winter
B00276LQH6.jpg,"hat, silver, head, fabric, dressy","hat, silver, head, fabric, dressy","hat, silver, head, fabric, dressy",hat,silver,head,fabric,dressy
B008N5BSFA.jpg,"shorts, red, lower body, cotton, athletic","short, red, lower body, cotton, athletic","short, red, upper body, cotton, athletic",short,red,upper body,cotton,athletic
B00BC3QA4E.jpg,"glove, black, hands, leather, winter","glove, black, hand, leather, winter","glove, black, hand, leather, winter",glove,black,hand,leather,winter
B0013O6HW2.jpg,"bra, beige, torso, silk, wire-free","bra, beige, torso, silk, wire-free","bra, beige, torso, silk, wire-free",bra,beige,torso,silk,Other
B008PY8FF0.jpg,"long-sleeve shirt, black, torso, cotton, casual","long-sleeve shirt, black, torso, cotton, casual","long-sleeve shirt, black, torso, cotton, casual",long-sleeve shirt,black,torso,cotton,casual
B00AHFL8WW.jpg,"hoodie, purple, upper body, cotton blend, casual","hoodie, purple, upper body, cotton blend, casual","hoodie, purple, upper body, cotton blend, casual",hoodie,purple,upper body,cotton blend,casual
B00CO8YOVM.jpg,"socks, green, legs, cotton, argyle","sock, green, leg, cotton, argyle","sock, green, leg, cotton, argyle",sock,green,leg,cotton,Other