Probá la app en https://buscador-linkedin.streamlit.app/
El otro día me di cuenta que hace ya cuatro años que comparto contenido sobre Python y Ciencia de Datos en LinkedIn y la verdad es que se trata de una experiencia muy interesante que me permitió conectar con muchas personas. Sin embargo, al acumular cientos de publicaciones, encontrar contenido específico puede volverse un verdadero desafío y frecuentemente hay gente preguntándome sobre algo de lo que ya hice muchos posts. Por esta razón, decidí desarrollar un buscador semántico que utiliza inteligencia artificial para encontrar publicaciones relevantes. Este proyecto combina las bibliotecas Sentence Transformers y Streamlit para crear una aplicación sencilla y poderosa que mejora la forma en que se puede interactuar con mi contenido. Al final, además del objetivo de proporcionar una manera más eficaz para buscar entre mis publicaciones, estos conceptos y herramientas les permitirán ir más allá y crear un buscador en base a sus propios datos.
Búsqueda semántica
La búsqueda semántica es un enfoque avanzado para encontrar información relevante, que se basa en el significado de las palabras y las relaciones entre conceptos, en lugar de simplemente buscar coincidencias exactas de texto (como hacen los motores de búsqueda tradicionales). La idea es entender la intención detrás de la consulta del usuario y su contexto, mejorando la precisión de los resultados.
Hay versiones más sofisticadas, pero en su forma básica se basa en encontrar similitudes entre palabras y oraciones en un espacio vectorial, luego de haber construido representaciones numéricas (también conocidas como embeddings) de ellas. Esto se basa en la idea de que palabras que aparecen en contextos similares tienen significados similares.
Cómo funciona el buscador
El corazón de este proyecto es el modelo hiiamsid/sentence_similarity_spanish_es, una variante de BERT entrenada para calcular la similitud entre oraciones en español. El modelo lo descargué de HuggingFace y la idea es transformar tanto las publicaciones de LinkedIn como las consultas de los usuarios en vectores numéricos (embeddings) y luego medir la distancia entre ellos para encontrar el contenido más relevante.
La ventaja de este enfoque es que el buscador no necesita que las palabras de la consulta coincidan exactamente con las palabras de mis publicaciones. Por ejemplo, si alguien busca “visualización de datos”, el sistema puede encontrar publicaciones donde hablé de gráficos con Matplotlib o dashboards con Plotly, aunque esas palabras no estén en la consulta original. Esto es posible porque el modelo entiende que todos esos conceptos están relacionados.
Cómo construí un buscador semántico de mis publicaciones de LinkedIn
Para facilitar la búsqueda de contenido específico entre mis cientos de publicaciones, creé un buscador semántico usando:
Sentence Transformers: Para convertir textos en vectores (embeddings) y medir similitud.
Streamlit: Para armar una interfaz web simple y funcional.
Pandas: Para manipular el archivo CSV con mis publicaciones.
Flujo del Proyecto
Acá pueden encontrar todo el código del proyecto y a continuación pasaré a explicar cada parte del mismo
1. Descarga de mis posts de LinkedIn
En el archivo posts.csv se encuentran todas mis publicaciones de LinkedIn. Cada fila corresponde a un post, con su fecha y el texto completo. Este archivo es la fuente principal de datos para el buscador semántico.
Este archivo fue generado utilizando la herramienta oficial de Descarga de Datos de LinkedIn, que permite exportar un historial completo de tus publicaciones. De esta forma, pude obtener un registro estructurado con el contenido de cada post, listo para procesar y analizar.
2. Creación de representaciones numéricas (embeddings)
Este modelo está finetuneado para calcular similitud entre oraciones en español. La idea es que publicaciones con temas similares (por ejemplo, pandas y limpieza de datos) estén cerca en un espacio vectorial que los contiene.
El código relevante se encuentra en el notebook generar_linkedin_embeddings.ipynb
model = SentenceTransformer('hiiamsid/sentence_similarity_spanish_es')
El flujo es el siguiente:
Cargar el CSV de publicaciones.
Convertir cada post a un embedding.
Guardar los embeddings en un archivo. Los embeddings podrían generarse con cada consulta pero esto es una manera más óptima de hacerlo.
shares_data.to_csv(f'Shares_with_embeddings_{model_type.split("/")[-1]}.csv', index=False)
3. Creación de una app con Streamlit
La idea fue crear una app web sencilla que le permitiera al usuario escribir una consulta y visualizar los potenciales posts de interés.
El código lo pueden encontrar en streamlit_app.py , pero más allá de algunos detalles de diseño para que se vea mejor, el sistema hace lo siguiente:
Carga el archivo CSV con publicaciones y embeddings.
Compara la consulta con todos mis posts usando la similitud coseno.
Devuelve los 5 posts más relevantes.
Permite ver una versión abreviada del post e ir con un botón directo al post original.
Puesta en producción
Finalmente la subí Streamlit community cloud, un servicio de Streamlit que tiene una capa gratuita para subir apps con algunas limitaciones.
Probá la app funcionando: https://buscador-linkedin.streamlit.app/
¿Querés armar uno para tu propio buscador con IA?
Si te interesa replicarlo, el código completo está disponible y puede adaptarse a cualquier colección de textos: posts, artículos, papers o documentos internos: https://github.com/GEJ1/buscador-linkedin/
¿Te interesa seguir aprendiendo más sobre Python?
Si este contenido te resultó útil y te interesa leer contenido sobre programación principalmente en Python, ciencia de datos e inteligencia artificial, seguime en mis redes:
🐙 Pueden ver todo el código en es repositorio de Github y si te sirve dejá una estrella ⭐
📘 LinkedIn donde comparto contenido con frecuencia: Gustavo Juantorena
📹 YouTube: Gustavo Juantorena - Programación y Ciencia de Datos