Estoy tratando de resolver el siguiente problema: tengo un conjunto de oraciones como mi conjunto de datos, y quiero poder escribir una nueva oración y encontrar la oración con la que la nueva es más similar en el conjunto de datos. Un ejemplo se vería así:
Nueva oración: " I opened a new mailbox
"
Predicción basada en el conjunto de datos:
Sentence | Similarity
A dog ate poop 0%
A mailbox is good 50%
A mailbox was opened by me 80%
He leído que la similitud de coseno se puede usar para resolver este tipo de problemas emparejados con tf-idf (y los RNN no deberían aportar mejoras significativas a los métodos básicos), o también se usa word2vec para problemas similares. ¿Son realmente viables para su uso en este caso específico también? ¿Existen otras técnicas / algoritmos para resolver esto (preferiblemente con Python y SKLearn, pero también estoy abierto a aprender sobre TensorFlow)?
fuente
Respuestas:
Su problema se puede resolver con Word2vec y Doc2vec. Doc2vec daría mejores resultados porque toma en cuenta las oraciones al entrenar el modelo.
Solución Doc2vec
Puede entrenar su modelo doc2vec siguiendo este enlace . Es posible que desee realizar algunos pasos de preprocesamiento, como eliminar todas las palabras de detención (palabras como "the", "an", etc. que no agregan mucho significado a la oración). Una vez que haya entrenado su modelo, puede encontrar oraciones similares usando el siguiente código.
Resultados:
Los resultados anteriores son una lista de tuplas para
(label,cosine_similarity_score)
. Puede asignar salidas a oraciones haciendotrain[29670]
.Tenga en cuenta que el enfoque anterior solo dará buenos resultados si su modelo doc2vec contiene incrustaciones para las palabras que se encuentran en la nueva oración. Si trata de obtener similitud para alguna oración de galimatías
sdsf sdf f sdf sdfsdffg
, le dará pocos resultados, pero esas podrían no ser las oraciones similares reales ya que su modelo entrenado puede no haber visto estas palabras de galimatías mientras entrenaba el modelo. Así que trate de entrenar a su modelo en tantas oraciones como sea posible para incorporar tantas palabras para obtener mejores resultados.Solución de Word2vec
Si está usando word2vec, necesita calcular el vector promedio para todas las palabras en cada oración y usar la similitud de coseno entre vectores.
Calcular similitud
fuente
sentence_1.split()
hace lo mismoWord Mover's Distance (WMD) es un algoritmo para encontrar la distancia entre oraciones. WMD se basa en incrustaciones de palabras (por ejemplo, word2vec) que codifican el significado semántico de las palabras en vectores densos.
Por ejemplo:
Fuente: Documento "De incrustaciones de palabras a distancias de documentos"
El paquete gensim tiene una implementación de ADM .
Para su problema, compararía la oración ingresada con todas las otras oraciones y devolvería la oración que tenga las ADM más bajas.
fuente
Puede probar una solución fácil usando sklearn y funcionará bien.
Use tfidfvectorizer para obtener una representación vectorial de cada texto
Ajuste el vectorizador con sus datos, eliminando palabras de detención.
Transforme la nueva entrada con el vectorizador previamente entrenado
Calcule la similitud de coseno entre esta representación y cada representación de los elementos en su conjunto de datos.
Si tiene un conjunto de datos hugh, puede agruparlo (por ejemplo, utilizando KMeans de scikit learn) después de obtener la representación y antes de predecir nuevos datos.
Este código realiza todos estos pasos. Puedes consultarlo en mi repositorio de Github .
fuente
Hay algunos trabajos recientes basados en el codificador automático variable en modelos RNN. Generando oraciones desde un espacio continuo , con implementaciones de pytorch : código github .
lograron comprimir la característica semántica y sintáctica global de una oración en un espacio latente expresado quizás con algunas variables aleatorias finitas independientes de 10 a 30 (distribución factorizada).
La idea novedosa en este trabajo, se interpolan entre dos oraciones. y los resultados fueron bastante sorprendentes.
fuente
La solución generalizada consta de los siguientes pasos:
Una vez que consigues la inserción de palabras de cada palabra, puedes aplicar cualquiera de las métricas de similitud como coseno, etc. en cada oración para medir la similitud con otras.
fuente