Para una tarea de PNL, tengo varias rebajas que almacenan mis datos de entrenamiento.

##intent:greet
- Hi
- Hello
- Good Day
- Good Morning
- Good Evening

##intent:say_thank_you
- Thank you
- Thx
- awesome
- great
- thank you very much

Genero nuevos datos de entrenamiento mientras me comunico con el bot. Después de cargar, limpiar, etc. obtendré un dict.

{0 : {
    'intent':'greet',
    'data':'good day sir'
    },
1 : {
    'intent':'greet',
    'data':'good afternoon'
    },
2 : {
    'intent':'say_thank_you',
    'data':'good job
    }
}

Ahora quiero agregar las oraciones a mi archivo md. Creo que la forma más sencilla es directamente después de ##intent:<intentname>

Mi primer enfoque estático fue el siguiente:

intent = 'greet'
identifier = "##intent:"+intent
with open('<myPath.md>') as myfile:
    if identifier in myfile.read():
        print("found intent")
    else:
        print("no intent with name greet")

Aunque tengo un archivo md válido con una intención greet, no puedo encontrar la línea en el código. Supongo que no puedo buscar la sintaxis de rebajas en un archivo de esta manera.

¿Hay alguna forma de buscar rebajas en un archivo md sin cambiar el archivo? Noté algunas sugerencias para transformar el archivo en HTML, pero ¿hay una manera más fácil de hacerlo?

1
mexwell 25 ago. 2020 a las 13:26

1 respuesta

La mejor respuesta

Mi estrategia sería crear un nuevo archivo, copiarle líneas. Cuando encuentre la sección que está buscando, agregue nuevas líneas. Cuando haya terminado, elimine la fuente y use el nuevo archivo.

Algo como esto debería funcionar:

from pathlib import Path

def add_identifier(filename: str, key: str, item: str):
    source_file = Path(filename) # intent.txt
    dest_file = source_file.with_suffix('.replaced' + source_file.suffix) # intent.replaced.txt
    
    found = False
    with open(source_file) as f, open(dest_file, 'w') as rf:
        for line in f:
            # copy line 
            rf.write(line)
            if f'##intent:{key}' in line:
                found = True
                # insert new identifier
                rf.write(f'- {item}\n')
        if not found:
            # create a new section and add the identifier
            rf.write(f'\n\n##intent:{key}\n')
            rf.write(f'- {item}\n')
        
    # remove original and rename new file
    # source_file.unlink()
    # dest_file.rename(source_file)
    
# usage
add_identifier('intent.txt', key='greet', item="hello m'lady")

Agregué una marca para agregar una nueva sección si no existe en el archivo original.

1
abdusco 25 ago. 2020 a las 10:56