esilver's picture
refactored
a318724
raw
history blame
3.04 kB
import pickle
import json
import os
class SafeProgress:
"""Wrapper for progress tracking that handles None gracefully"""
def __init__(self, progress_obj=None):
self.progress = progress_obj
def __call__(self, value, desc=""):
if self.progress is not None:
try:
self.progress(value, desc=desc)
except:
print(f"Progress {value}: {desc}")
else:
print(f"Progress {value}: {desc}")
def load_embeddings(embeddings_path):
"""Load ingredient embeddings from pickle file"""
print(f"Loading ingredient embeddings from {embeddings_path}")
with open(embeddings_path, "rb") as f:
ingredients_embeddings = pickle.load(f)
print(f"Loaded {len(ingredients_embeddings)} ingredient embeddings")
return ingredients_embeddings
def parse_product_file(file_path):
"""Parse a file containing product data and extract product names"""
try:
with open(file_path, 'r') as f:
try:
products_data = json.load(f)
if isinstance(products_data, list):
# Extract product names if it's a list of objects with 'name' field
if all(isinstance(item, dict) for item in products_data):
product_names = [item.get('name', '') for item in products_data if isinstance(item, dict)]
else:
# If it's just a list of strings
product_names = [str(item) for item in products_data if item]
else:
# If it's just a list of product names
product_names = []
except json.JSONDecodeError:
# If not JSON, try reading as text file with one product per line
f.seek(0)
product_names = [line.strip() for line in f.readlines() if line.strip()]
except Exception as e:
raise Exception(f"Error reading file: {str(e)}")
return product_names
def format_categories_html(product, categories):
"""Format categories as HTML with color-coded confidence scores"""
html = f"<div style='margin-bottom: 10px;'><b>{product}</b></div>"
if not categories:
html += "<div style='color: #666; font-style: italic;'>No matching categories found.</div>"
return html
html += "<div style='margin-left: 15px;'>"
for i, (category, score) in enumerate(categories, 1):
# Color code based on confidence
if score >= 0.8:
color = "#1a8a38" # Strong green
elif score >= 0.65:
color = "#4caf50" # Medium green
elif score >= 0.5:
color = "#8bc34a" # Light green
else:
color = "#9e9e9e" # Gray
html += f"<div style='margin-bottom: 5px;'>{i}. <span style='font-weight: 500;'>{category}</span> <span style='color: {color}; font-weight: bold;'>({score:.3f})</span></div>"
html += "</div>"
return html