Rilevamento di entità con un dizionario personalizzato

Se disponi di una serie fissa di termini che desideri individuare, come un elenco di nomi di prodotti o organizzazioni, puoi creare un dizionario. La ricerca nel dizionario è molto veloce e richiede poche risorse.

Watson I dizionari per l'elaborazione del linguaggio naturale offrono funzionalità di corrispondenza avanzate che vanno oltre la semplice corrispondenza di stringhe, tra cui:

  • I termini del dizionario possono essere costituiti da un singolo termine, ad esempio «ruota», oppure da più termini, ad esempio «volante ».
  • La corrispondenza dei termini nel dizionario può tenere conto o meno delle maiuscole e delle minuscole. Con una ricerca che distingue tra maiuscole e minuscole, puoi assicurarti che gli acronimi, come ABS, non vengano associati a termini del linguaggio comune, come "abs", che hanno un significato diverso.
  • È possibile specificare come raggruppare i risultati quando più voci del dizionario corrispondono allo stesso testo. Considerate le due voci del dizionario, Watson e Watson Natural Language Processing, è possibile configurare quale voce debba corrispondere all'espressione "I like Watson Natural Language Processing": solo Watson Natural Language Processing, poiché contiene Watson, oppure entrambe.
  • È possibile specificare di cercare il lemma invece di elencare tutte le forme flesse. In questo modo, l'unica voce del dizionario "mouse" rileverà sia "mouse" che "mice" nel testo.
  • È possibile associare un'etichetta a ciascuna voce del dizionario, ad esempio "Categoria organizzazione", per includere metadati aggiuntivi nella corrispondenza.

Tutte queste funzionalità sono configurabili, così potrai scegliere l'opzione più adatta alle tue esigenze.

Tipi di file di dizionario

Watson L'elaborazione del linguaggio naturale supporta due tipi di file di dizionario:

  • Elenco dei termini (che terminano con .dict)

    Esempio di elenco di termini:

    Arthur
    Allen
    Albert
    Alexa
    
  • Tabella (che termina con .csv)

    Esempio di tabella:

    "label", "entry"
    "ORGANIZATION", "NASA"
    "COUNTRY", "USA"
    "ACTOR", "Christian Bale"
    

È possibile utilizzare più dizionari durante la stessa estrazione. È anche possibile utilizzare entrambi i tipi contemporaneamente, ad esempio eseguendo una singola estrazione con tre dizionari, un elenco di termini e due tabelle.

Creazione di file di dizionario

Inizia creando una directory "module" all'interno del tuo notebook. Si tratta di una directory all'interno del file system del notebook che verrà utilizzata temporaneamente per archiviare i file del dizionario.

Per creare file di dizionario nel tuo notebook:

  1. Crea una directory per i moduli. Si noti che il nome della cartella del modulo non può contenere trattini, poiché ciò causerebbe degli errori.
    import os
    import watson_nlp
    module_folder = "NLP_Dict_Module_1"
    os.makedirs(module_folder, exist_ok=True)
    
  2. Crea i file di dizionario e salvali nella directory del modulo. È possibile importare un elenco esterno o un fil CSV, oppure creare file di dizionari in questo modo:
    # Create a term list dictionary
    term_file = "names.dict"
    with open(os.path.join(module_folder, term_file), 'w') as dictionary:
        dictionary.write('Bruce')
        dictionary.write('\n')
        dictionary.write('Peter')
        dictionary.write('\n')
    
    # Create a table dictionary
    table_file = 'Places.csv'
    with open(os.path.join(module_folder, table_file), 'w') as places:
        places.write("\"label\", \"entry\"")
        places.write("\n")
        places.write("\"SIGHT\", \"Times Square\"")
        places.write("\n")
        places.write("\"PLACE\", \"5th Avenue\"")
        places.write("\n")
    

Caricamento dei dizionari e configurazione delle opzioni di corrispondenza

I dizionari possono essere caricati utilizzando i seguenti metodi di supporto.

  • Per caricare un singolo dizionario, usa watson_nlp.toolkit.rule_utils.DictionaryConfig (<dictionary configuration>)
  • Per caricare più dizionari, usa watson_nlp.toolkit.rule_utils.DictionaryConfig.load_all([<dictionary configuration>)])

Per ogni dizionario è necessario specificare una configurazione. La configurazione del dizionario è un dizionario di tipo « Python », con i seguenti attributi:

Attributo Valore Descrizione Obbligatorio
name stringa Il nome del dizionario Vero
source stringa Il percorso del dizionario, relativo a module_folder Vero
dict_type file o tabella Se l'elemento del dizionario è un elenco di termini (file) o una tabella di mappature (tabella) Num. L'impostazione predefinita è il file
consolidate ContainedWithin (Conserva la corrispondenza più lunga ed elimina i duplicati) / NotContainedWithin (Conserva la corrispondenza più breve ed elimina i duplicati) / ContainsButNotEqual (Conserva la corrispondenza più lunga, ma mantieni le corrispondenze duplicate) / ExactMatch (Elimina i duplicati) / LeftToRight (Conserva la sequenza più lunga non sovrapposta più a sinistra) Come gestire le corrispondenze del dizionario che si sovrappongono. Num. L'impostazione predefinita prevede che le corrispondenze non vengano raggruppate.
case esatto / insensibile Corrispondere esattamente alle maiuscole e alle minuscole oppure ignorare le maiuscole e le minuscole. Num. L'impostazione predefinita è la corrispondenza esatta.
lemma Vero / Falso Abbina i termini del dizionario ai lemmi presenti nel testo. Il dizionario dovrebbe contenere solo le forme dei lemmi. Ad esempio, aggiungi mouse nel dizionario per trovare sia mouse che mice nel testo. Non aggiungere mice nel dizionario. Per trovare corrispondenze con termini composti da più token nel testo, separare i lemmi di tali termini nel dizionario con uno spazio. Num. Il valore predefinito è False.
mappings.columns (mappature delle as attribute of colonne: {}) elenco [ stringa ] Elenco delle intestazioni delle colonne nello stesso ordine in cui compaiono nel file CSV della tabella Sì, se dict_type: table
mappings.entry (mappature as attribute of delle voci: {}) stringa Il nome dell'intestazione della colonna che contiene la stringa da confrontare con il documento. Sì, se dict_type: table
label stringa L'etichetta da applicare sui fiammiferi. N

Esempio di codice

Seleziona l'esempio di codice in base all'ambiente che stai utilizzando:

  • Gli ambienti che includono la libreria di elaborazione del linguaggio naturale Watson utilizzano:

    # Load the dictionaries
    # Use the following helper method
    dictionaries = watson_nlp.toolkit.rule_utils.DictionaryConfig.load_all([{
        'name': 'Names',
        'source': term_file,
        'case':'insensitive'
    }, {
        'name': 'places_and_sights_mappings',
        'source': table_file,
        'dict_type': 'table',
        'mappings': {
            'columns': ['label', 'entry'],
            'entry': 'entry'
        }
    }])
    

Addestrare un modello che contiene dizionari

Dopo aver caricato i dizionari, crea un modello di dizionario e addestralo utilizzando il RBR.train() metodo. Nel metodo, specificare:

  • La directory del modulo
  • La lingua delle voci del dizionario
  • I dizionari da consultare

Esempio di codice

custom_dict_block = watson_nlp.resources.feature_extractor.RBR.train(module_folder,
language='en', dictionaries=dictionaries)

Applicazione del modello a nuovi dati

Dopo aver addestrato i dizionari, applica il modello ai nuovi dati utilizzando il run() metodo, proprio come faresti con qualsiasi altro blocco pre-addestrato esistente.

Esempio di codice

custom_dict_block.run('Bruce is at Times Square')

Risultato dell'esempio di codice:

{(0, 5): ['Names'], (12, 24): ['SIGHT']}

Per visualizzare le etichette o il nome del dizionario:

RBR_result = custom_dict_block.executor.get_raw_response('Bruce is at Times Square', language='en')
print(RBR_result)

Risultato con le etichette:

{'annotations': {'View_Names': [{'label': 'Names', 'match': {'location': {'begin': 0, 'end': 5}, 'text': 'Bruce'}}], 'View_places_and_sights_mappings': [{'label': 'SIGHT', 'match': {'location': {'begin': 12, 'end': 24}, 'text': 'Times Square'}}]}, 'instrumentationInfo': {'annotator': {'version': '1.0', 'key': 'Text match extractor for NLP_Dict_Module_1'}, 'runningTimeMS': 3, 'documentSizeChars': 32, 'numAnnotationsTotal': 2, 'numAnnotationsPerType': [{'annotationType': 'View_Names', 'numAnnotations': 1}, {'annotationType': 'View_places_and_sights_mappings', 'numAnnotations': 1}], 'interrupted': False, 'success': True}}