es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Buscar todas las palabras en una oración relacionadas con una palabra clave.

Tengo el siguiente texto y quiero aislar una parte de la oración relacionada con una palabra clave, en este caso keywords = ['pizza', 'chips'].

text = "The pizza is great but the chips aren't the best"

Salida esperada:

{'pizza': 'The pizza is great'}
{'chips': "the chips aren't the best"}

He intentado usar el Dependecy Matcher de Spacy, pero admito que no estoy seguro de cómo funciona. Intenté el siguiente patrón para chips, pero no se obtienen coincidencias.

import spacy
from spacy.matcher import DependencyMatcher

nlp = spacy.load("es_core_news_sm")

pattern = [
  {
    "RIGHT_ID": "chips_id",
    "RIGHT_ATTRS": {"ORTH": "chips"}
  },
  {
    "LEFT_ID": "chips_id",
    "REL_OP": "<<",
    "RIGHT_ID": "other_words",
    "RIGHT_ATTRS": {"POS": '*'}
  }
]

matcher = DependencyMatcher(nlp.vocab)
matcher.add("chips", [pattern])

doc = nlp("La pizza es genial pero las papas fritas no son las mejores")
for id, (other_words,) in matcher(doc):
    print(doc[other_words])

EDITADO:

Ejemplos adicionales de frases:

example_sentences = [
    "Las pizzas están bien, las papas fritas están crujientes y el servicio es mediocre",
    "Luego vinieron los platos principales y la pizza - estas eran realmente promedio - las papas fritas tenían mucho aceite y eran malas",
    "Buena pizza recién hecha al pedido, la comida tiene un buen precio, pero las papas fritas no están tan bien de precio.",
    "Las pizzas y las papas fritas tienen un sabor realmente bueno y el Tango Ice Blast es refrescante"
]
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución para aislar la parte de la oración relacionada con una palabra clave utilizando Python, SpaCy y expresiones regulares es iterar sobre cada palabra clave en la lista keywords y encontrar sus coincidencias en la cadena text utilizando expresiones regulares. Luego, podemos extraer el subárbol del árbol de análisis que contiene la palabra coincidente y utilizarlo para crear el diccionario de salida.

    Aquí hay una posible implementación:

    import spacy
    import re
    
    nlp = spacy.load("es_core_news_sm")
    
    def extraer_palabra_clave(palabra_clave, texto):
        # definir un patrón que coincida con la palabra clave, posiblemente con signos de puntuación circundantes
        patron = re.compile(rf"\b{palabra_clave}\b")
    
        # encontrar todas las coincidencias del patrón en el texto
        coincidencias = [(m.start(), m.end()) for m in re.finditer(patron, texto)]
    
        # extraer el subárbol de la oración que contiene la palabra clave
        salida = {}
        for inicio, fin in coincidencias:
            span = nlp(texto[inicio:fin])
            subarbol = span.root.subtree
            salida[palabra_clave] = " ".join(token.text for token in subarbol)
    
        return salida
    
    
    texto = "La pizza es genial pero las papas no son las mejores"
    palabras_clave = ["pizza", "papas"]
    salida = {}
    for palabra_clave in palabras_clave:
        salida.update(extraer_palabra_clave(palabra_clave, texto))
    
    print(salida)
    # salida esperada: {'pizza': 'La pizza es genial', 'papas': 'las papas no son las mejores'}
    

    Este código define una función extraer_palabra_clave que toma una palabra_clave y un texto como entradas, y devuelve un diccionario con la palabra clave como clave y la subcadena coincidente como valor. Para encontrar las coincidencias, utilizamos un patrón de expresión regular que coincide con la palabra clave rodeada por límites de palabra (es decir, espacios, signos de puntuación o inicio/fin de línea). Luego, utilizamos SpaCy para analizar la subcadena del texto que contiene la coincidencia, y extraer el subárbol del árbol de análisis que contiene el token coincidente (es decir, el “root” del subárbol es el token que coincide con la palabra clave). Finalmente, devolvemos el diccionario de salida con la palabra clave y su subcadena relacionada.

    Para aplicar esta función a una lista de frases de ejemplo, simplemente podemos recorrer las frases y las palabras clave, y agregar los diccionarios de salida:

    frases_ejemplo = [
        "Las pizzas están bien, las papas están duras y el servicio es mediocre",
        "Luego vinieron los platos principales y las pizzas - estas estuvieron bastante promedio - las papas tenían mucho aceite y estaban malas",
        "Rica pizza recién hecha a pedido, la comida está bien de precio, pero las papas no están tan bien de precio",
        "Las pizzas y las papas tienen muy buen sabor y el Tango Ice Blast está refrescante"
    ]
    
    palabras_clave = ["pizza", "papas"]
    
    salida = {}
    for frase in frases_ejemplo:
        for palabra_clave in palabras_clave:
            salida.update(extraer_palabra_clave(palabra_clave, frase))
    
    print(salida)
    # salida esperada: {'pizza': 'las pizzas están bien, estas estuvieron bastante promedio', 'papas': 'las papas están duras y el servicio es mediocre, tenían mucho aceite y estaban malas, no están tan bien de precio, tienen muy buen sabor y'}
    

    Este código produce la salida esperada al agregar los diccionarios de salida de cada frase y palabra clave. Tenga en cuenta que la coincidencia para “pizza” es menos estricta (es decir, coincide con “pizzas” y “estas estuvieron bastante promedio”), pero esto se puede ajustar refinando el patrón de expresión regular.

Comments are closed.