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!!!

¿Fue útil?

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

  1. re.findall(r'(\w+|\W+)',line) se usó dividido cada uno line 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ácil line.split().
  2. table.get(word,word) devoluciones table[word] Si la palabra esta en table, y simplemente regresa word si word no esta en el sinónimo table.

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']
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top