algorithm - Creación o búsqueda de una función de sugerencia de "términos relevantes"
web-services nlp (3)
Eche un vistazo a los siguientes dos documentos:
Aquí está mi intento de una explicación muy simplificada:
Si tenemos una base de datos de consultas de usuarios anteriores, podemos definir una función de similitud entre dos consultas. Por ejemplo: número de palabras en común. Ahora, para cada consulta en nuestra base de datos, calculamos su similitud con cada consulta y recordamos las k consultas más similares. Las palabras no superpuestas de estas se pueden devolver como "términos relacionados".
También podemos tomar este enfoque con una base de datos de documentos que contienen información que los usuarios pueden estar buscando. Podemos definir la similitud entre dos términos de búsqueda como el número de documentos que contienen ambos dividido por el número de documentos que contienen cualquiera de ellos. Para decidir qué términos probar, podemos escanear los documentos y arrojar palabras que son demasiado comunes (''y'', ''el'', etc.) o que son demasiado oscuras.
Si nuestros datos lo permiten, entonces podríamos ver qué consultas llevaron a los usuarios a elegir qué resultados, en lugar de comparar documentos por contenido. Por ejemplo, si tuviéramos datos que nos mostraran que los usuarios que buscan "Celtics" y "Lakers" terminaron haciendo clic en espn.com, podríamos llamar a estos términos relacionados.
Si está comenzando desde cero sin datos sobre consultas de usuarios anteriores, puede probar Wikipedia o el conjunto de datos Bag of Words como una base de datos de documentos. Si está buscando una base de datos de términos y resultados de búsqueda de usuarios, y si se siente aventurero, puede echar un vistazo a los datos de búsqueda de AOL.
Dadas algunas palabras de entrada, quiero tener una utilidad que devuelva un conjunto diverso de términos, frases o conceptos relevantes. Una advertencia es que para empezar tendría que tener un gran gráfico de términos, o la característica no sería muy útil.
Por ejemplo, volver a enviar "béisbol" volvería
["shortstop", "Babe Ruth", "foul ball", "steroids", ... ]
Google Sets es el mejor ejemplo que puedo encontrar de este tipo de características, pero no puedo usarlo ya que no tienen una API pública (y no iré en contra de sus TOS). Además, la entrada de una sola palabra no genera un conjunto muy diverso de resultados. Estoy buscando una solución que suene en tangentes.
Lo más parecido que he experimentado es usar la API de WikiPedia para buscar Categorías y Backlinks, pero no hay manera de ordenar directamente esos resultados por "relevancia" o "popularidad" . Sin eso, la lista de sugerencias es masiva y está por todas partes, lo cual no es inmediatamente útil y muy difícil de reducir.
El uso de un diccionario de sinónimos también podría funcionar mínimamente, pero eso dejaría de lado los nombres propios o los términos tangencialmente relevantes (como cualquiera de los resultados enumerados anteriormente).
Reutilizaría felizmente un servicio abierto, si existe, pero no he encontrado nada suficiente.
Estoy buscando ya sea una forma de implementar esto ya sea internamente con un conjunto de inicio decente lleno , o reutilizar un servicio gratuito que ofrece esto.
¿Tienes una solución? Gracias de antemano!
ACTUALIZACIÓN: Gracias por las respuestas increíblemente densas e informativas. Elegiré una respuesta ganadora en 6 a 12 meses, cuando espero comprender lo que todos han sugerido =)
Es posible que esté interesado en WordNet . Se necesita un poco de conocimiento lingüístico para comprender la API, pero básicamente el sistema es una base de datos de enlaces basados en el significado de palabras en inglés, que es más o menos lo que está buscando. Estoy seguro de que puedo obtener más información si lo desea.
Peter Norvig (director de investigación en Google) habló sobre cómo lo hacen en Google (mencionando específicamente los Conjuntos de Google) en una charla técnica de Facebook . La idea es que un algoritmo relativamente simple en un gran conjunto de datos (por ejemplo, toda la web) es mucho mejor que un algoritmo complicado en un pequeño conjunto de datos.
Puede ver la colección de n-grams de Google como punto de partida. Comenzarías a ver qué conceptos están agrupados. Norvig insinuó que internamente Google tiene hasta 7 gramos para usar en cosas como Google Translate .
Si es más ambicioso, puede descargar todos los artículos de Wikipedia en el idioma que desee y crear su propia base de datos de n-gramas.
El problema es aún más complicado si solo tienes una sola palabra; echa un vistazo a esta tesis reciente para obtener más detalles sobre la desambiguación del sentido de la palabra.
No es un problema fácil, pero es útil como lo mencionaste. Al final, creo que encontrará que una implementación realmente exitosa tendrá un algoritmo relativamente simple y una gran cantidad de datos.