write traductor traducir significa qué oraciones ingles gratis frases español diccionario buscar python string nlp similarity cosine-similarity

python - traductor - Calcule la similitud coseno dada 2 cadenas de oraciones



traductor de oraciones de ingles a español (4)

Bueno, si conoce las incrustaciones de palabras como Glove / Word2Vec / Numberbatch, su trabajo está medio hecho. Si no, déjame explicarte cómo se puede abordar esto. Convierta cada oración en tokens de palabras, y represente cada uno de estos tokens como vectores de alta dimensión (usando las incrustaciones de palabras preentregadas, o ¡puede train usted mismo!). Por lo tanto, ahora simplemente no captura su similitud de superficie sino que extrae el significado de cada palabra que comprende la oración como un todo. Después de esto calcula su similitud coseno y estás listo.

Desde Python: tf-idf-cosine: para encontrar la similitud del documento , es posible calcular la similitud del documento utilizando tf-idf cosine. Sin importar bibliotecas externas, ¿hay alguna forma de calcular la similitud del coseno entre 2 cadenas?

s1 = "This is a foo bar sentence ." s2 = "This sentence is similar to a foo bar sentence ." s3 = "What is this string ? Totally not related to the other two lines ." cosine_sim(s1, s2) # Should give high cosine similarity cosine_sim(s1, s3) # Shouldn''t give high cosine similarity value cosine_sim(s2, s3) # Shouldn''t give high cosine similarity value


Gracias @vpekar por su implementación. Ayudó mucho. Acabo de descubrir que pierde el peso de tf-idf mientras calcula la similitud del coseno. El contador (palabra) devuelve un diccionario que tiene la lista de palabras junto con su ocurrencia.

cos (q, d) = sim (q, d) = (q · d) / (| q || d |) = (suma (qi, di) / (sqrt (suma (qi2))) * (sqrt ( sum (vi2))) donde i = 1 a v)

  • qi es el peso tf-idf del término i en la consulta.
  • di es el tf-idf
  • peso del término i en el documento. | q | y | d | son las longitudes de q y d.
  • Esta es la similitud cosenoidal de q y d. . . . . . o, de manera equivalente, el coseno del ángulo entre q y d.

Por favor, siéntase libre de ver mi código here . Pero primero tendrá que descargar el paquete anaconda. Le establecerá automáticamente la ruta de Python en Windows. Agregue este intérprete de Python en Eclipse.


La respuesta corta es "no, no es posible hacerlo de una manera principista que funcione ni remotamente bien". Es un problema no resuelto en la investigación del procesamiento del lenguaje natural y también es el tema de mi trabajo doctoral. Resumiré muy brevemente dónde estamos y le señalaremos algunas publicaciones:

Significado de las palabras

La suposición más importante aquí es que es posible obtener un vector que represente cada palabra en la oración en quesion. Este vector generalmente se elige para capturar los contextos en los que puede aparecer la palabra. Por ejemplo, si solo consideramos los tres contextos "comer", "rojo" y "esponjoso", la palabra "gato" podría representarse como [98, 1 , 87], porque si tuvieras que leer un texto muy largo (unos cuantos miles de millones de palabras no son poco comunes para el estándar actual), la palabra "gato" aparecería muy a menudo en el contexto de "esponjoso" y "comer" , pero no tan a menudo en el contexto de "rojo". De la misma manera, "perro" podría representarse como [87,2,34] y "paraguas" podría ser [1,13,0]. Imagenndo estos vectores como puntos en el espacio 3D, "gato" está claramente más cerca de "perro" que de "paraguas", por lo tanto, "gato" también significa algo más similar a "perro" que a "paraguas".

Esta línea de trabajo ha sido investigada desde principios de los años 90 (por ejemplo, this trabajo de Greffenstette) y ha arrojado resultados sorprendentemente buenos. Por ejemplo, aquí hay algunas entradas aleatorias en un diccionario de sinónimos que construí recientemente al hacer que mi computadora lea wikipedia:

theory -> analysis, concept, approach, idea, method voice -> vocal, tone, sound, melody, singing james -> william, john, thomas, robert, george, charles

Estas listas de palabras similares se obtuvieron por completo sin la intervención del ser humano: usted ingresa el texto y regresa unas horas más tarde.

El problema con las frases

Puede preguntar por qué no estamos haciendo lo mismo con frases más largas, como "zorros de jengibre aman la fruta". Es porque no tenemos suficiente texto. Para que podamos establecer de manera confiable a qué se parece X, necesitamos ver muchos ejemplos de X en contexto. Cuando X es una sola palabra como "voz", esto no es demasiado difícil. Sin embargo, a medida que X se alarga, las probabilidades de encontrar ocurrencias naturales de X se vuelven exponencialmente más lentas. Para comparar, Google tiene alrededor de 1B páginas que contienen la palabra "zorro" y ni una sola página que contenga "jengibre zorros ama la fruta", a pesar de que es una frase en inglés perfectamente válida y todos entendemos lo que significa.

Composición

Para abordar el problema de la escasez de datos, queremos realizar una composición, es decir, tomar vectores de palabras, que son fáciles de obtener a partir del texto real, y juntarlos de una manera que capture su significado. La mala noticia es que nadie ha podido hacerlo tan bien hasta ahora.

La forma más simple y más obvia es agregar o multiplicar los vectores de palabras individuales juntos. Esto lleva a efectos secundarios indeseables que "gatos persiguen perros" y "perros persiguen gatos" significarían lo mismo para su sistema. Además, si está multiplicando, debe tener mucho cuidado o todas las oraciones terminarán representadas por [0,0,0, ..., 0], lo que anula el punto.

Otras lecturas

No discutiré los métodos más sofisticados para la composición que se han propuesto hasta ahora. Le sugiero que lea Katrin Erk, "Modelos de espacio vectorial de significado de palabras y significado de frases: una encuesta" . Esta es una muy buena encuesta de alto nivel para que comiences. Lamentablemente, no está disponible de forma gratuita en el sitio web del editor, envíe un correo electrónico al autor directamente para obtener una copia. En ese documento encontrará referencias a muchos más métodos concretos. Los más comprensibles son Mitchel y Lapata (2008) y Baroni y Zamparelli (2010) .

Editar después de comentar por @vpekar: La conclusión de esta respuesta es enfatizar el hecho de que si bien existen métodos ingenuos (por ejemplo, adición, multiplicación, similitud de superficie, etc.), estos son fundamentalmente defectuosos y, en general, no se debe esperar un gran rendimiento de ellos.


Una simple implementación pura de Python sería:

import re, math from collections import Counter WORD = re.compile(r''/w+'') def get_cosine(vec1, vec2): intersection = set(vec1.keys()) & set(vec2.keys()) numerator = sum([vec1[x] * vec2[x] for x in intersection]) sum1 = sum([vec1[x]**2 for x in vec1.keys()]) sum2 = sum([vec2[x]**2 for x in vec2.keys()]) denominator = math.sqrt(sum1) * math.sqrt(sum2) if not denominator: return 0.0 else: return float(numerator) / denominator def text_to_vector(text): words = WORD.findall(text) return Counter(words) text1 = ''This is a foo bar sentence .'' text2 = ''This sentence is similar to a foo bar sentence .'' vector1 = text_to_vector(text1) vector2 = text_to_vector(text2) cosine = get_cosine(vector1, vector2) print ''Cosine:'', cosine

Huellas dactilares:

Cosine: 0.861640436855

La fórmula coseno utilizada aquí se describe here .

Esto no incluye la ponderación de las palabras por tf-idf, pero para usar tf-idf, necesita tener un corpus razonablemente grande para estimar los pesos de tfidf.

También puede desarrollarlo aún más, utilizando una forma más sofisticada para extraer palabras de un texto, derivarlo o lematizarlo, etc.