MedicalSearchModel / similarity.py
EmmaScharfmann
push to huggingface space
c33bcd6
from huggingface_hub import InferenceClient
from config import HF_TOKEN
from custom_css import SIMILARITY_BARS
client = InferenceClient(
provider="hf-inference",
api_key=HF_TOKEN,
)
def compute_similarity(reference_sentence: str, *comparison_sentences):
"""Compute similarity scores between reference and comparison sentences."""
sentences_list = [s.strip() for s in comparison_sentences if s and s.strip()]
if not sentences_list:
missing_reference_documents_message = "⚠️ Please enter at least one comparison sentence."
return f"<div style='color: #e74c3c; padding: 20px; text-align: center;'>{missing_reference_documents_message}</div>"
try:
result = client.sentence_similarity(
sentence=reference_sentence,
other_sentences=sentences_list,
model="sentence-transformers/embeddinggemma-300m-medical",
)
sorted_results = sorted(zip(sentences_list, result), key=lambda x: x[1], reverse=True)
output = SIMILARITY_BARS
for idx, (sentence, score) in enumerate(sorted_results, 1):
percentage = score * 100
if score >= 0.7:
border_color = "#48bb78"
gradient = "linear-gradient(90deg, #48bb78 0%, #38a169 100%)"
elif score >= 0.5:
border_color = "#ed8936"
gradient = "linear-gradient(90deg, #ed8936 0%, #dd6b20 100%)"
else:
border_color = "#667eea"
gradient = "linear-gradient(90deg, #667eea 0%, #764ba2 100%)"
output += f"""
<div class="similarity-item" style="border-left-color: {border_color};">
<div class="sentence-text">
<span class="rank-badge">#{idx}</span>{sentence}
</div>
<div class="bar-container">
<div class="progress-bar">
<div class="progress-fill" style="width: {percentage}%; background: {gradient};"></div>
</div>
<div class="score-badge" style="background: {border_color};">{score:.4f}</div>
</div>
</div>
"""
output += "</div>"
return output
except Exception as e:
return f"<div style='color: #e74c3c; padding: 20px; background: #fee; border-radius: 8px; border-left: 4px solid #e74c3c;'><strong>Error:</strong> {str(e)}</div>"