Python: normalización de un archivo de texto
-
28-10-2019 - |
Pregunta
Tengo un archivo de texto que contiene varias variantes de ortografía de muchas palabras:
Por ejemplo
identification ... ID .. identity...contract.... contr.... contractor...medicine...pills..tables
Por lo tanto, quiero tener un archivo de texto de sinónimo que contenga las palabras sinónimos y me gustaría reemplazar todas las variantes con la palabra principal. Esencialmente, quiero la normalización del archivo de entrada.
Para por ejemplo, mi archivo de lista de sinónimos se vería como
identification = ID identify
contracting = contract contractor contractors contra......
word3 = word3_1 word3_2 word3_3 ..... word3_n
.
.
.
.
medicine = pills tables drugs...
Quiero que se vea el archivo de salida final
identification ... identification .. identification...contractor.... contractor.... contractor...medicine...medicine..medicine
¿Cómo tengo sobre la programación en Python?
¡¡¡Muchas gracias por tu ayuda!!!
Solución
Puede leer el archivo de sinónimo y convertirlo en un diccionario, table
:
import re
table={}
with open('synonyms','r') as syn:
for line in syn:
match=re.match(r'(\w+)\s+=\s+(.+)',line)
if match:
primary,synonyms=match.groups()
synonyms=[synonym.lower() for synonym in synonyms.split()]
for synonym in synonyms:
table[synonym]=primary.lower()
print(table)
rendimientos
{'word3_1': 'word3', 'word3_3': 'word3', 'word3_2': 'word3', 'contr': 'contracting', 'contract': 'contracting', 'contractor': 'contracting', 'contra': 'contracting', 'identify': 'identification', 'contractors': 'contracting', 'word3_n': 'word3', 'ID': 'identification'}
A continuación, podría leer en el archivo de texto y reemplazar cada palabra con su sinónimo principal de table
:
with open('textfile','r') as f:
for line in f:
print(''.join(table.get(word.lower(),word)
for word in re.findall(r'(\W+|\w+)',line)))
rendimientos
identification identification identity contracting contracting contracting medicine medicine medicine
re.findall(r'(\w+|\W+)',line)
se usó dividido cada unoline
mientras preserva el espacio en blanco. Si el espacio en blanco no es de interés, también podría usar lo más fácilline.split()
.table.get(word,word)
devolucionestable[word]
Si la palabra esta entable
, y simplemente regresaword
siword
no esta en el sinónimotable
.
Otros consejos
Solo un pensamiento: en lugar de tener una lista de todos Variación de una palabra, eche un vistazo a difflib
>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']
>>> import keyword
>>> get_close_matches('wheel', keyword.kwlist)
['while']
>>> get_close_matches('apple', keyword.kwlist)
[]
>>> get_close_matches('accept', keyword.kwlist)
['except']