Vai al contenuto

Applicazioni pratiche di deep learning/Elaborazione del linguaggio naturale

Wikibooks, manuali e libri di testo liberi.

L'elaborazione del linguaggio naturale ( PNL ) è un sottocampo della linguistica , dell'informatica e dell'intelligenza artificiale che si occupa delle interazioni tra computer e linguaggio umano, in particolare come programmare i computer per elaborare e analizzare grandi quantità di dati del linguaggio naturale . Di seguito si analizzano alcuni esempi in italiano che si possono provare in un documento di Google Colab. Atri esempi si trovano nel tutorial di Hugging Face qui .

Caricamento librerie :

!pip install datasets transformers[sentencepiece]

L'Analisi del sentimento o sentyment analysis è la capacità di un modello di estrarre informazioni soggettive di solito da una serie di documenti. Spesso si utilizzano recensioni online per identificare le tendenze dell'opinione pubblica nei social media, per il marketing ecc. Attraverso il modello "MilaNLProc/feel-it-italian-sentiment" di Hugging Face si vuole valutare il sentimento della frase 'Oggi sono proprio contento!' . Il risultato come si vede è Probabilities: Negative 0.0003 - Positive 0.9997 , quindi tale frase è positiva con una probabilità del 99,97% :

import torch
import numpy as np 
from transformers import AutoTokenizer, AutoModelForSequenceClassification

# Load model and tokenizer
tokenizer = AutoTokenizer.from_pretrained("MilaNLProc/feel-it-italian-sentiment")
model = AutoModelForSequenceClassification.from_pretrained("MilaNLProc/feel-it-italian-sentiment")

sentence = 'Oggi sono proprio contento!'
inputs = tokenizer(sentence, return_tensors="pt")

# Call the model and get the logits
labels = torch.tensor([1]).unsqueeze(0)  # Batch size 1
outputs = model(**inputs, labels=labels)
loss, logits = outputs[:2]
logits = logits.squeeze(0)

# Extract probabilities
proba = torch.nn.functional.softmax(logits, dim=0)

# Unpack the tensor to obtain negative and positive probabilities
negative, positive = proba
print(f"Probabilities: Negative {np.round(negative.item(),4)} - Positive {np.round(positive.item(),4)}")
Probabilities: Negative 0.0003 - Positive 0.9997

Generazione di testo: Attraverso il modello "GroNLP/gpt2-small-italian" di Hugging Face si genera del testo completando una frase:

from transformers import pipeline

pipe = pipeline("text-generation", model="GroNLP/gpt2-small-italian")

pipe("In quel corso ha insegnato come")
[{'generated_text': "In quel corso ha insegnato come si deve fare la conoscenza della vita di una  persona, nel suo rapporto con gli altri ed in un confronto diretto tra i propri interessi e le proprie esigenze personali. L'approccio all'educazione interculturale è stato uno dei punti cardine del percorso formativo promosso dall'Istituto nazionale per l'integrazione dell'immigrazione (ISPES), che mira a fornire strumenti adeguati allo studio delle culture immigrate nei diversi contesti d'accoglienza: dalle scuole medie ad istituti superiori; dai centri"}]

Riempimento di un tag: Attraverso il modello "xlm-roberta-base" di Hugging face in una frase si sostituisce il tag <mask> con una parola più o meno probabile . Come si vede dall'elaborazione la parola più probabile nella frase è "nuovo" .

from transformers import pipeline
unmasker = pipeline('fill-mask', model='xlm-roberta-base')
unmasker("Ciao, io sono un <mask> modello.")
[{'score': 0.22852873802185059,
 'sequence': 'Ciao, io sono un nuovo modello.',
 'token': 15077,
 'token_str': 'nuovo'},
{'score': 0.041416723281145096,
 'sequence': 'Ciao, io sono un super modello.',
 'token': 1601,
 'token_str': 'super'},
{'score': 0.03438141196966171,
 'sequence': 'Ciao, io sono un altro modello.',
 'token': 23283,
 'token_str': 'altro'},
{'score': 0.03232891485095024,
 'sequence': 'Ciao, io sono un bravo modello.',
 'token': 140947,
 'token_str': 'bravo'},
{'score': 0.030004248023033142,
 'sequence': 'Ciao, io sono un buon modello.',
 'token': 29832,
 'token_str': 'buon'}]

Riconoscimento di entità nominative (NER): Dato un flusso di testo, determinare quali elementi nel testo mappano a nomi propri, come persone o luoghi, e qual è il tipo di ciascuno di questi nomi (ad es. persona, luogo, organizzazione) . Attraverso il modello "Babelscape/wikineural-multilingual-ner" nella frase "Il mio nome è Gianni e vivo a Roma" si identifica Gianni come nome proprio con 82,83% di probabilità e Roma come luogo col 99,95% di probabilità.

from transformers import AutoTokenizer, AutoModelForTokenClassification
from transformers import pipeline

tokenizer = AutoTokenizer.from_pretrained("Babelscape/wikineural-multilingual-ner")
model = AutoModelForTokenClassification.from_pretrained("Babelscape/wikineural-multilingual-ner")

nlp = pipeline("ner", model=model, tokenizer=tokenizer)
example = "Il mio nome è Gianni e vivo a Roma"

ner_results = nlp(example)
print(ner_results)
[{'entity': 'B-PER', 'score': 0.8283051, 'index': 5, 'word': 'Gianni', 'start': 14, 'end': 20}, {'entity': 'B-LOC', 'score': 0.9995623, 'index': 9, 'word': 'Roma', 'start': 30, 'end': 34}]

Risposte alle domande: Data una domanda in linguaggio umano, determina la sua risposta a partire da un testo che la contiene . Attraverso il modello "mrm8488/bert-italian-finedtuned-squadv1-it-alfa" alla domanda 'Per quale lingua stai lavorando?' si ottiene la risposta español con un'accuratezza del 99,3%

from transformers import pipeline

nlp_qa = pipeline(
    'question-answering',
    model='mrm8488/bert-italian-finedtuned-squadv1-it-alfa',
    tokenizer='mrm8488/bert-italian-finedtuned-squadv1-it-alfa'
)

nlp_qa(
    {
        'question': 'Per quale lingua stai lavorando?',
        'context': 'Manuel Romero è colaborando attivamente con HF / trasformatori per il trader del poder de las últimas ' +
       'técnicas di procesamiento de lenguaje natural al idioma español'
    }
)
{'answer': 'español', 'end': 165, 'score': 0.9930939674377441, 'start': 158}

Traduzione automatica: Tradurre automaticamente il testo da una lingua ad un'altra. Questo è uno dei problemi più difficili e fa parte di una classe di problemi chiamata colloquialmente " AI-completa ", ovvero richiede tutti i diversi tipi di conoscenza che gli esseri umani possiedono (grammatica, semantica, fatti del mondo reale, ecc. .) per risolverla correttamente. Attraverso il modello "facebook/m2m100_418M" si traduce una frase dall'inglese all'italiano:

from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer

en_text = "Life is like a box of chocolate."

model = M2M100ForConditionalGeneration.from_pretrained("facebook/m2m100_418M")
tokenizer = M2M100Tokenizer.from_pretrained("facebook/m2m100_418M")

# translate English to Italian
tokenizer.src_lang = "en"
encoded_hi = tokenizer(en_text, return_tensors="pt")
generated_tokens = model.generate(**encoded_hi, forced_bos_token_id=tokenizer.get_lang_id("it"))
tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
['La vita è come una scatola di cioccolato.']