usar reemplazar latinos especiales escribir caracteres cambiar agregar acentos python nlp fuzzy-comparison

latinos - reemplazar acentos en python



ComparaciĆ³n de cadenas borrosas (4)

Hay un módulo en la biblioteca estándar (llamado difflib ) que puede comparar cadenas y devolver una puntuación en función de su similitud. La clase SequenceMatcher debe hacer lo que está buscando.

EDITAR: Pequeño ejemplo desde el prompt de Python:

>>> from difflib import SequenceMatcher as SM >>> s1 = '' It was a dark and stormy night. I was all alone sitting on a red chair. I was not completely alone as I had three cats.'' >>> s2 = '' It was a murky and stormy night. I was all alone sitting on a crimson chair. I was not completely alone as I had three felines.'' >>> SM(None, s1, s2).ratio() 0.9112903225806451

HTH!

Lo que me esfuerzo por completar es un programa que se lee en un archivo y comparará cada oración de acuerdo con la oración original. La oración que coincida perfectamente con el original recibirá un puntaje de 1 y una oración que es el total opuesto recibirá un 0. Todas las demás oraciones difusas recibirán una calificación entre 1 y 0.

No estoy seguro de qué operación usar para permitirme completar esto en Python 3.

He incluido el texto de muestra en el que el Texto 1 es el original y las otras cadenas anteriores son las comparaciones.

Texto: muestra

Texto 1: Fue una noche oscura y tormentosa. Estaba solo, sentado en una silla roja. No estaba completamente solo ya que tenía tres gatos.

Texto 20: Fue una noche turbia y tormentosa. Estaba completamente solo sentado en una silla carmesí. No estaba completamente solo ya que tenía tres felinos // Debería puntuar alto pero no 1

Texto 21: Fue una noche turbia y tempestuosa. Estaba completamente solo sentado en una cátedra carmesí. No estaba completamente solo ya que tenía tres felinos // Debía tener una puntuación inferior al texto 20

Texto 22: Estaba solo sentado en una cátedra carmesí. No estaba completamente solo ya que tenía tres felinos. Fue una noche turbia y tempestuosa. // Debe puntuar más bajo que el texto 21 pero NO 0

Texto 24: Fue una noche oscura y tormentosa. No estaba solo. No estaba sentado en una silla roja. Tenía tres gatos // ¡Debería anotar un 0!


Hay un paquete llamado fuzzywuzzy . Instalar a través de pip:

pip install fuzzywuzzy

Uso simple:

>>> from fuzzywuzzy import fuzz >>> fuzz.ratio("this is a test", "this is a test!") 96

El paquete está construido sobre difflib . ¿Por qué no solo usas eso, preguntas? Además de ser un poco más simple, tiene una serie de métodos de coincidencia diferentes (como insensibilidad de orden de token, coincidencia de cadena parcial) que lo hacen más poderoso en la práctica. Las funciones process.extract son especialmente útiles: encuentre las mejores cadenas y ratios coincidentes de un conjunto. De su léame:

Parcial Ratio

>>> fuzz.partial_ratio("this is a test", "this is a test!") 100

Índice de clasificación de fichas

>>> fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear") 90 >>> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear") 100

Proporción del conjunto de fichas

>>> fuzz.token_sort_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear") 84 >>> fuzz.token_set_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear") 100

Proceso

>>> choices = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"] >>> process.extract("new york jets", choices, limit=2) [(''New York Jets'', 100), (''New York Giants'', 78)] >>> process.extractOne("cowboys", choices) ("Dallas Cowboys", 90)


La tarea se llama identificación de paráfrasis, que es un área activa de investigación en procesamiento del lenguaje natural. He vinculado varios documentos de última generación, muchos de los cuales puedes encontrar en código fuente abierto en GitHub.

Tenga en cuenta que todas las preguntas respondidas asumen que existe una similitud de cadena / superficie entre las dos oraciones, mientras que en realidad dos oraciones con poca similitud de cadena pueden ser semánticamente similares.

Si está interesado en ese tipo de similitud, puede usar Skip-Thoughts . Instale el software de acuerdo con las guías de GitHub y vaya a la sección parafrasear detección en el archivo Léame:

import skipthoughts model = skipthoughts.load_model() vectors = skipthoughts.encode(model, X_sentences)

Esto convierte tus oraciones (X_sentences) en vectores. Más tarde puede encontrar la similitud de dos vectores por:

similarity = 1 - scipy.spatial.distance.cosine(vectors[0], vectors[1])

donde asumimos el vector [0] y el vector 1 es el vector correspondiente a X_sentences [0], X_sentences 1 en el que deseaba encontrar sus puntajes.

Hay otros modelos para convertir una oración en un vector que puedes encontrar aquí .

Una vez que conviertes tus oraciones en vectores, la similitud es solo una cuestión de encontrar la similitud Coseno entre esos vectores.


fuzzyset es mucho más rápido que fuzzywuzzy ( difflib ) para la indexación y la búsqueda.

from fuzzyset import FuzzySet corpus = """It was a murky and stormy night. I was all alone sitting on a crimson chair. I was not completely alone as I had three felines It was a murky and tempestuous night. I was all alone sitting on a crimson cathedra. I was not completely alone as I had three felines I was all alone sitting on a crimson cathedra. I was not completely alone as I had three felines. It was a murky and tempestuous night. It was a dark and stormy night. I was not alone. I was not sitting on a red chair. I had three cats.""" corpus = [line.lstrip() for line in corpus.split("/n")] fs = FuzzySet(corpus) query = "It was a dark and stormy night. I was all alone sitting on a red chair. I was not completely alone as I had three cats." fs.get(query) # [(0.873015873015873, ''It was a murky and stormy night. I was all alone sitting on a crimson chair. I was not completely alone as I had three felines'')]

Advertencia: tenga cuidado de no mezclar unicode y bytes en su fuzzyset.