¿Cómo extraer información estructurada de texto usando Python y expresiones regulares?
Puntos débiles
Muchas personas tienen que lidiar con una gran cantidad de texto en su trabajo diario.
Por ejemplo, los académicos necesitan leer una gran cantidad de literatura para encontrar inspiración, datos y argumentos.
Los estudiantes necesitan leer muchos libros de texto y trabajos, y luego escribir sus propios informes o hacer diapositivas.
Los analistas financieros necesitan encontrar pistas sobre las tendencias de desarrollo de la industria y la dinámica de las empresas objetivo a partir de una gran cantidad de informes de noticias.
No todo el procesamiento de textos es tan fresco e interesante.
Una tarea importante pero tediosa es extraer información estructurada de una gran cantidad de texto.
Muchos escenarios de análisis de datos requieren el ingreso de información estructurada.
Por ejemplo, presentamos antes "Préstamo o no préstamo: ¿Cómo utilizar Python y el aprendizaje automático para ayudarle a tomar decisiones?" " y "¿Cómo utilizar Python y redes neuronales profundas para dirigirse a clientes que están a punto de abandonar? 》, ha visto que los modelos de máquinas prefieren alimentarse con información tabular estructurada.
Sin embargo, la información estructurada no necesariamente está ahí, esperando a que usted la utilice. Muchas veces, está incrustado en texto no estructurado previamente generado.
Es posible que esté acostumbrado desde hace mucho tiempo a leer manualmente información de texto, extraer puntos clave y luego copiarlos y pegarlos en una tabla. En principio, esto no tiene nada de malo. Pero en el funcionamiento real, la eficiencia es demasiado baja y resulta demasiado problemática.
La mayoría de las personas no están dispuestas a realizar un trabajo tan simple, repetitivo y aburrido.
Repita mecánicamente el rango de demarcación del mouse una y otra vez, "Ctrl C", cambie al documento de la tabla, busque la posición de entrada correcta y luego "Ctrl V"...
Este tipo de cosas. Hacer demasiado puede tener efectos adversos en las articulaciones de los hombros y los codos, e incluso en su salud física y mental.
¿Te gustaría probar una forma automatizada más sencilla de completar rápidamente estos molestos pasos? ?
Después de leer este artículo, espero que puedas encontrar la respuesta.
Ejemplo
Aquí damos un ejemplo extremadamente simplificado de cómo extraer información de un texto chino.
El motivo de esto es evitar perder demasiado tiempo interpretando los datos.
Espero que puedas centrarte en métodos para dominar nuevos conocimientos.
Supongamos que un profesor de secundaria le pide que cuente los destinos de graduación de los estudiantes después del examen de ingreso a la universidad. El monitor llevó a cabo una investigación seria y luego hizo el siguiente informe:
Zhang Hua fue admitido en la Universidad de Pekín
Li Ping ingresó a una escuela técnica secundaria
Han Meimei entré a una tienda departamental
...
Para que se familiarice lo suficiente con los ejemplos e incluso los entienda, aquí "tomé prestado" parte del contenido del Edición de 1998 del Diccionario Xinhua.
¿Es lo suficientemente considerado?
En la vida real, probablemente hay más de 3 personas en una clase, así que puedes imaginar que es una lista larga de frases.
Pero en realidad, el director tenía un significado implícito que no fue expresado, a saber:
¡Quiero un formulario!
Así que, cuando veas esta larga serie de frases, podrás imaginar su expresión.
El líder del escuadrón probablemente también esté avergonzado:
¡Si quieres el formulario, deberías habérmelo dicho antes!
En este momento, supongamos que eres el monitor, ¿qué debes hacer?
La información está en el texto. Pero si necesita convertirlo en una tabla, debe buscar y procesar los puntos de información uno por uno.
De hecho, para una clase de cuarenta o cincuenta personas, el manejo manual no es demasiado difícil.
Pero imagina, ¿qué pasaría si la cantidad de datos que necesitas procesar fuera diez veces, cien veces o incluso decenas de millones de veces mayor que la de este ejemplo?
¿Seguir insistiendo en el procesamiento manual?
Esto no sólo es problemático, sino también poco realista.
Necesitamos encontrar un método sencillo que nos ayude a extraer automáticamente la información correspondiente.
El método que utilizamos aquí es una expresión regular.
Regular
El nombre "expresión regular" suena misterioso al principio. De hecho, se traduce del inglés "expresión regular".
Si se traduce a la lengua vernácula, es "una forma de expresión regular".
¿Suena esto más realista?
Sin embargo, déjame darte un repaso del curso "Falso experto 101":
¿A quién puedes asustar cuando dices algo que otros pueden entender?
Por convención, sigamos usando “expresión regular” para llamarlo.
Desde su creación, ha aportado una alta eficiencia al procesamiento de textos.
Sin embargo, las principales personas que lo utilizan no son escritores, editores, académicos y empleados que a menudo tratan con palabras, sino...
¡Programadores!
El código escrito por los programadores es texto; gran parte de los datos procesados por los programadores también están en formato de texto. Hay muchos patrones obvios a seguir.
Es precisamente confiando en los secretos únicos de las expresiones regulares que los programadores pueden completar en media hora muchas tareas que tardarían toda una semana en la oscuridad, y luego tomar café y esperar a que bajen. trabajar.
Incluso hoy en día, con la inteligencia artificial, las expresiones regulares todavía tienen muchas aplicaciones inesperadas.
Por ejemplo, sistema de diálogo persona-ordenador.
Es posible que haya leído noticias y siempre haya pensado que el diálogo entre humanos y máquinas se logra apoyándose en gráficos de conocimiento o aprendizaje profundo.
No se puede decir que no exista la participación de las tecnologías geniales mencionadas anteriormente. Pero, en el mejor de los casos, representan sólo una parte, quizá sólo una pequeña parte.
En la práctica de producción, detrás de una gran cantidad de reglas de diálogo no hay una red neuronal mágica y profunda, sino un montón de expresiones regulares.
Quizás te preocupes: ¿podrás dominar una tecnología de aplicaciones de tan alta gama?
La respuesta es:
¡Por supuesto!
Las expresiones regulares no son difíciles de aprender.
Especialmente cuando lo combinas con Python, es simplemente un artefacto de eficiencia.
Echemos un vistazo a cómo las expresiones regulares pueden ayudarnos a identificar la información de "nombre" y "destino" en el texto de muestra.
Prueba
Abra un navegador y escriba esta URL (/).
Verás la siguiente interfaz.
Es una herramienta útil para experimentos de expresiones regulares. Cuando impartí el curso INFO 5731, los estudiantes rápidamente comenzaron a jugar con expresiones regulares después de dominar esta herramienta.
Una herramienta tan buena debe ser cara, ¿verdad?
No, es gratis. Siéntete libre de usarlo.
Primero ajustamos el lenguaje de programación de la izquierda del PHP predeterminado a Python.
Después de eso, pegue el texto que necesita ser procesado en el gran cuadro de texto en blanco en el medio.
Intentemos “hacer coincidir” a continuación.
¿Qué es emparejar?
Es decir, escribes una expresión y la computadora usará plumas de pollo como flechas para buscar cuidadosamente cualquier párrafo de texto que coincida con la expresión en cada línea de texto.
Si está presente, quedará resaltado.
Aquí observamos y encontramos que en cada oración, aparece la palabra "了" delante de donde se dirige la persona.
Bien, ingresemos la palabra "了" en el pequeño cuadro de texto en la parte superior del medio.
Como puedes ver, las palabras "了" en las tres oraciones están todas iluminadas.
Este es el primer método de comparación que encontrarás: encontrar contenido coherente basado en el significado original de los caracteres.
Debido a la regularidad del texto de muestra, podemos considerar "Le" como un localizador, y detrás de él, hasta el final de la oración, está la información de "destino".
¿No es la mitad de la información estructurada que necesitamos para encontrar justamente este “destino”?
Intentamos hacer coincidir "dónde ir".
¿Cómo combinar? ¿Las palabras en cada línea son diferentes esta vez?
No importa, ahora se revela el poder de las expresiones regulares.
Puedes utilizar un punto, es decir, ., para representar cualquier carácter.
Letras, números, puntuación... incluso se puede abarcar el chino.
Entonces sigamos pensando en ello. ¿Cuántas palabras habrá en la información del destino?
Difícil de decir.
Las tres oraciones simples del ejemplo pueden ser "4 palabras" o "6 palabras".
Por lo tanto, no podemos especificar la longitud de los caracteres en la información de destino.
Pero eso no importa, solo necesitamos usar un asterisco (*) para representar el número de ocurrencias, que van desde ?0 hasta el infinito.
Por supuesto, en situaciones reales, el infinito no ocurrirá realmente.
Basándonos en lo que acabamos de ingresar, agregamos .* y el resultado se ve así:
¡Nada mal!
Sin embargo, parece que la información del destino y la palabra "Le" están resaltadas en el mismo color. ¿No estarían simplemente mezclados?
No queremos esto.
¿Qué hacer?
Intente agregar un par de paréntesis a ambos lados de .*? (tenga en cuenta que no utilice símbolos chinos de ancho completo).
Verá que esta vez la "llegada" todavía se expresa en azul y la información de destino posterior se ha vuelto verde.
Este par de paréntesis es muy importante. Se llama "agrupación" y es la unidad básica para extraer información.
La mitad de nuestra tarea está resuelta, ¿verdad?
Intentemos extraer los nombres de las personas juntas.
Busquemos la posición de anclaje del nombre de la persona.
Si miras con atención, podrás encontrar fácilmente que hay un verbo detrás del nombre de cada persona.
Los estudiantes que van a la educación superior usan la palabra "kao", mientras que los estudiantes que están empleados usan la palabra "jin".
Probemos primero con la palabra “kao”.
Aquí intentamos poner la palabra "kao" directamente antes de la palabra "了". Pero encontrará que no hay resultados coincidentes.
¿Por qué?
Al mirar los datos, encontrará que la palabra original utilizada es "aprobó el examen".
Por supuesto que podemos ingresar la palabra "上" aquí. Pero hay que considerar el caso más general.
Por ejemplo, ¿qué debo hacer si "aprobé el examen"? ¿Qué pasa con "aprobó el examen"?
Una mejor manera es continuar usando el "gran truco" que acabamos de aprender e insertar un .* entre "prueba" y "了".
En este momento, su expresión regular se parece a?test.* (.*)
Mira, la información en la primera línea coincide correctamente, ¿verdad?
Pero, ¿qué debo hacer si todavía quedan dos filas que no coinciden?
Si seguimos el mismo patrón, encontraremos que usar .* (.*)? puede hacer coincidir correctamente las dos últimas líneas.
Aquí viene el problema:
Lo que coincide con la primera línea no puede coincidir con las dos siguientes, y viceversa.
Esto no es bueno. Esperamos escribir expresiones que sean más generales.
¿Qué hacer?
Veamos la representación de la relación “o” en expresiones regulares.
Aquí podemos separar los dos personajes con una barra vertical y rodearlos con corchetes, lo que significa que si alguno de los dos personajes aparece, se considerará una coincidencia exitosa.
Es decir, escriba la expresión regular así: [高考|ENT].*了(.*)
Genial, el contenido de las tres líneas ha coincidido correctamente.
Aquí, la frase verbal y "LE" que representa el tiempo se utilizan como información de anclaje intermedia. Podemos extraer de forma segura y audaz la información del nombre anterior.
Es decir, se escribe así: (.*)[Entrada|Enter].*了(.*)
Tenga en cuenta que en este momento, el nombre del grupo es verde y el grupo de destino es rojo.
¡Extrajimos con éxito dos conjuntos de información! ¡Celebrar!
Sin embargo, si le muestra los resultados aquí al director, probablemente no quedará satisfecho.
¡Forma, quiero forma!
No te preocupes, es hora de que aparezca Python.
Ahora intentamos extraer formalmente los datos en Python.
Medio ambiente
He colocado el código fuente de soporte para este artículo en Github.
Puedes responder "regex" en el fondo de mi cuenta pública "Yushu Zhilan" (nkwangshuyi) para ver el enlace del código completo.
Si estás satisfecho con mi tutorial, haz clic en la estrella en la esquina superior derecha de la página para agregarme una estrella. ¡Gracias!
Ten en cuenta que en el centro de esta página hay un botón que dice "Abrir en Colab". Por favor haga clic en él.
Entonces Google Colab se abrirá automáticamente.
Te sugiero que hagas clic en el botón “COPIAR EN LA UNIDAD” rodeado en rojo en la imagen de arriba. De esta manera, puede guardarlo en su propio Google Drive para acceder y revisar fácilmente.
Colab le proporciona un entorno operativo completo. Solo necesita ejecutar el código en secuencia para reproducir los resultados de este tutorial.
Si no estás familiarizado con Google Colab, está bien. Tengo un tutorial aquí que explica específicamente las características y el uso de Google Colab.
Para que pueda aprender y comprender el código más profundamente, le recomiendo que abra un nuevo Notebook en Google Colab, ingrese el código y lo ejecute de acuerdo con lo siguiente. En el camino, comprenda completamente lo que significa el código.
Esta forma aparentemente torpe es en realidad una forma eficaz de aprender.
Código
Primero, lea el paquete de expresiones regulares de Python.
importar re
Luego, preparamos los datos. Tenga en cuenta que para demostrar la versatilidad del código, agregué una línea de texto al final para distinguirlo de las reglas de texto anteriores y ver si nuestro código puede manejarlo correctamente.
data = """Zhang Hua fue admitido en la Universidad de Pekín
Li Ping ingresó a una escuela técnica secundaria
Han Meimei ingresó a unos grandes almacenes
Todos tienen un futuro brillante"""
Entonces, es hora de escribir expresiones regulares. ¿Realmente necesitas escribirlo manualmente?
Por supuesto que no.
El potente sitio web regex101 nos ha ayudado a prepararnos.
Haga clic en el botón rodeado en rojo en la imagen de arriba y el sitio web preparará una plantilla de código inicial para usted que puede coincidir con el patrón que necesita.
No es necesario copiar el código exactamente. Existe una frase así, que es muy importante. Simplemente cópiela y péguela en Colab Notebook.
regex = r"(.*)[考|Enter].*了(.*)"
Lo anterior es cómo debería verse su expresión regular en Python.
Preparamos una lista vacía para recibir datos.
mylist = []
A continuación, escribe un bucle.
para línea en data.split('n'):
?mysearch = re.search(regex, line)
?if mysearch: p> p>
nombre = mibúsqueda.grupo(1)
destino = mibúsqueda.grupo(2)
milista.append((nombre, destino))
Déjame explicarte el significado de cada declaración en este bucle:
data.split('n')? Dividir los datos del texto por filas. De esta forma podemos obtener datos para cada fila. mysearch = re.search(regex, line)? Esta oración intenta hacer coincidir el patrón con el contenido de la línea. if mysearch? Esta declaración de juicio permite al programa determinar si la línea tiene el patrón que estamos buscando. Por ejemplo, la última línea de texto no contiene el patrón de texto que analizamos anteriormente. Si encuentra una línea de este tipo, omítala directamente. name = mysearch.group(1) significa que el primer grupo de contenido coincidente, es decir, el grupo de nombres representado en verde en el sitio web regex101, se almacena en la variable de nombre. La siguiente frase sigue sucesivamente. Tenga en cuenta que ?grupo? corresponde al orden en que aparecen los paréntesis en su expresión regular, contando desde 1. mylist.append((nombre, destino))? Almacena la información extraída de la fila en la lista vacía que definimos antes.
Tenga en cuenta que si no agrega la oración ?mysearch = re.search(regex, line)?, el programa intentará hacer coincidir cada línea y extraer el contenido del grupo, y el resultado será un error así:
Como ve, cuando utiliza expresiones regulares para extraer información, no puede ser imprudente.
En este punto, revisemos el contenido de la lista:
mylist
El resultado es:
[(' Zhang Hua ', 'Universidad de Pekín'), ('Li Ping', 'Escuela Técnica Secundaria'), ('Han Meimei', 'Grandes Almacenes')]
No está mal, uno no es demasiado, el El otro no es demasiado, exactamente lo que necesitamos.
Vamos a exportarlo a una tabla. Existen muchos métodos, pero el más fácil y conveniente es utilizar el paquete de software de análisis de datos Pandas.
importar pandas como pd
Simplemente usando la función ?pd.DataFrame?, podemos convertir una estructura bidimensional compuesta por la lista y la tupla anteriores en un cuadro de datos.
df = pd.DataFrame(mylist)
df.columns = ['name', 'destination']
Ojo que aquí también somos muy cuidadosos Encabezado modificado.
Mira los frutos de tu trabajo:
df
Con el marco de datos, convertirlo a Excel es solo una línea de código:
df.to_excel("dest.xlsx", index=False)
Ingrese a la pestaña Archivos, actualice y vea el contenido del directorio actual:
Esto?dest. xlsx? es el resultado de salida. Después de la descarga, podemos abrirlo con Excel para verlo.
¡Misión cumplida!
Puedes enviar los resultados al profesor de la clase y ver su sonrisa de satisfacción.
Resumen
En este tutorial, hablamos sobre cómo usar patrones de caracteres de texto para extraer información estructurada con la ayuda de Python y expresiones regulares.
Espero que hayas dominado las siguientes habilidades:
Comprender la función de las expresiones regulares;
Utilizar el sitio web regex101 para probar la coincidencia de expresiones regulares y generar código preliminar. ;
Utilice Python para extraer información en lotes y exportar datos estructurados al formato especificado según los requisitos.
Me gustaría enfatizar nuevamente que, para un ejemplo tan simple, usar el método anterior es definitivamente una gran oportunidad para matar mosquitos.
Sin embargo, si los datos que necesitas procesar son masivos, el tiempo que te ahorrarás con este método será muy considerable.
Espero que puedas sacar conclusiones de un ejemplo y aplicarlo de manera flexible en tu propio trabajo.
Para obtener más conocimientos de Python, preste atención a: ¡Sitio web de autoaprendizaje de Python! !