Cruza descripciones de ofertas de empleo con CVs buscando por significado y no por coincidencia exacta de palabras.
Match job descriptions with resumes by meaning, not only by exact keyword matching.
Este ejercicio es solo para aprendizaje y pruebas. No ejecutes modelos contra CVs reales, datos personales, información laboral sensible o ambientes de producción sin autorización, respaldo, anonimización cuando aplique, permisos mínimos, control de cambios, revisión humana y cumplimiento de las políticas de privacidad de tu organización.
This exercise is for learning and testing only. Do not run models against real resumes, personal data, sensitive employment information, or production environments without authorization, backups, anonymization when applicable, least-privilege permissions, change control, human review, and compliance with your organization's privacy policies.
Usar embeddings para convertir textos en vectores numéricos y comparar similitud semántica. Esto permite encontrar el CV más relacionado con una oferta de empleo aunque no use exactamente las mismas palabras.
Use embeddings to convert text into numeric vectors and compare semantic similarity. This helps find the resume most related to a job posting even when the exact same words are not used.
| ID | Tipo | Texto |
|---|---|---|
| JOB01 | Oferta | Trabajo remoto desde casa con análisis de datos y reportes. |
| CV01 | CV | Experiencia creando dashboards, reportes y análisis de datos. |
| CV02 | CV | Atención al cliente presencial y manejo de caja registradora. |
| CV03 | CV | Soporte administrativo remoto, Excel y documentación. |
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
vector = model.encode("Trabajo remoto desde casa")Ejecuta esto una sola vez si la librería no está instalada en tu ambiente local o notebook.
Run this once if the library is not installed in your local environment or notebook.
pip install sentence-transformers scikit-learn pandas
# ==========================================================
# Python Advanced Topic 04
# Semantic Search with Embeddings
# ==========================================================
import pandas as pd
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
# 1. Job description to match
job_description = "Trabajo remoto desde casa con análisis de datos y reportes."
# 2. Synthetic resume descriptions
resumes = [
{"cv_id": "CV01", "candidate": "Ana Perez", "text": "Experiencia creando dashboards, reportes y análisis de datos."},
{"cv_id": "CV02", "candidate": "John Smith", "text": "Atención al cliente presencial y manejo de caja registradora."},
{"cv_id": "CV03", "candidate": "Maria Lopez", "text": "Soporte administrativo remoto, Excel y documentación."},
{"cv_id": "CV04", "candidate": "Robert Diaz", "text": "Mantenimiento de equipos, inventario y soporte operativo."}
]
df = pd.DataFrame(resumes)
# 3. Load embedding model
model = SentenceTransformer("all-MiniLM-L6-v2")
# 4. Convert texts into vectors
job_vector = model.encode([job_description])
resume_vectors = model.encode(df["text"].tolist())
# 5. Compare semantic similarity
similarities = cosine_similarity(job_vector, resume_vectors)[0]
df["semantic_score"] = similarities.round(4)
# 6. Sort best matches first
ranking = df.sort_values("semantic_score", ascending=False)
# 7. Export report
output_file = "semantic_search_resume_matches.csv"
ranking.to_csv(output_file, index=False)
print("Job description:")
print(job_description)
print("
Best semantic matches:")
print(ranking[["cv_id", "candidate", "semantic_score", "text"]])
print(f"
Report created: {output_file}")Job description: Trabajo remoto desde casa con análisis de datos y reportes. Best semantic matches: cv_id candidate semantic_score text 0 CV01 Ana Perez 0.7421 Experiencia creando dashboards, reportes y análisis de datos. 2 CV03 Maria Lopez 0.5814 Soporte administrativo remoto, Excel y documentación. 3 CV04 Robert Diaz 0.2638 Mantenimiento de equipos, inventario y soporte operativo. 1 CV02 John Smith 0.1846 Atención al cliente presencial y manejo de caja registradora. Report created: semantic_search_resume_matches.csv
| CV ID | Candidato | Semantic Score | Interpretación |
|---|---|---|---|
| CV01 | Ana Perez | 0.7421 | Mejor coincidencia semántica |
| CV03 | Maria Lopez | 0.5814 | Coincidencia parcial por remoto/administrativo |
| CV04 | Robert Diaz | 0.2638 | Baja relación |
| CV02 | John Smith | 0.1846 | Muy baja relación |
Este patrón abre la puerta a búsquedas inteligentes en texto. En vez de depender de palabras exactas, el modelo entiende cercanía de significado, lo que es muy útil para empleo, documentos, tickets, comentarios, encuestas y repositorios de conocimiento.
This pattern opens the door to intelligent text search. Instead of depending on exact words, the model understands similarity of meaning, which is useful for jobs, documents, tickets, comments, surveys, and knowledge repositories.