You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

683 lines
25 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "80e0cc42",
"metadata": {},
"source": [
"# 0 : Cosa c'è in questo notebook\n",
"Scaricamanto ed utilizzo modelli di Natural Language Processing da huggingface.com per fare un po di esperimenti ed esempi con dati testuali per il progetto __geografia__.\n",
"\n",
"In particolare si esplorano un po di metodi e strumenti per la comprensione e annotazione dei testi, sfruttando modelli già allenati su task che ci posssono interessare come ad esempio :\n",
"- __Mask-Filling__ (con huggingface transformer): predice un token mancante in una frase\n",
"- __Zero-Shot classification__ (con huggingface transformer): classifica una frase rispetto a delle classi variabili (utile per topic analysis, sentiment retrival e menate generiche)\n",
"- __Pos-Tagging__ (con la libreria spacy) : analisi grammaticale e sintattica del testo\n",
"\n",
"#### 0.1 Transformer Models da hugging face\n",
"I modelli pre-allenati sono stati sottoposti ad estensivi training con tantissimi dati, in genere macinati per giorni. i task non-supervisionati tipici utilizzati per l'allenamento sono in genere:\n",
"- next sentence prediction ( prendi un paragrafo, lo splitti sulla base del carattere '.' ed usi la prima frase come dato e la seconda come label da predirre)\n",
"- fill-mask: predirre la parola mancante di una frase ( nel training si prendono frasi complete e si maschera un termine a random per frase)\n",
"\n",
"Accanto a questi task usati per allenare la struttura della rete neurale (aka \"il grosso\" dei nodi profondi), i modelli di huggingface possono essere già \"fine-tunati\" rispetto ad ulteriori downstream task (tipo sentiment analysis o zero shot) e quindi utilizzabili direttamente. per alcune coppie di modelli-task invece è necessario un ulteriore sessione di fine-tuning con un dataset rilevante per il task d'interesse.\n",
"Qua c'è una lista delle tipologie di task piu comuni:\n",
"https://huggingface.co/tasks\n",
" \n",
"Infine un altra differenza sostanziale che ci interessa è se il modello sia:\n",
"- monolingua\n",
"- multilingua\n",
"\n",
"i modelli considerati per questo girovagare sono:\n",
"- il modello __dbmdz/bert-base-italian-cased__ è piu leggero e solo in italiano, ma di task ready-to-go disponibili c'è solo fill-mask e pos-tag\n",
"- il modello __facebook/bart-large-mnli__ è molto pesante, ma è multilingua ed ha implementato lo zero-shot-classification\n",
"- il modello __bert-base-cased__ solo inglese ma con praticamente tutti i downstream task già pronti all'utilizzo\n",
"\n",
"#### 0.2 Spacy Library\n",
"https://spacy.io/\n",
"libreria python piu semplice ed efficiente rispetto ai modelli transformer di hugging face, ma meno versatile per quantità di task possibili. ottima per pulire testi e tokenization (preprocessing), molto buono il pos-tagging\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "756d5d05",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/agropunx/anaconda3/envs/geografia/lib/python3.8/site-packages/tqdm/auto.py:22: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
" from .autonotebook import tqdm as notebook_tqdm\n",
"2022-07-06 20:22:23.485088: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n",
"2022-07-06 20:22:23.485116: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n"
]
}
],
"source": [
"from transformers import AutoModel, AutoTokenizer \n",
"from transformers import pipeline\n",
"multilingual_model_name = \"facebook/bart-large-mnli\" # 1.5 GB\n",
"italian_model_name = \"dbmdz/bert-base-italian-cased\" # 422 MB\n",
"alltask_model_name = \"bert-base-cased\" \n",
"\n",
"## Download model and configuration from huggingface.co and cache. \n",
"#muli_tokenizer = AutoTokenizer.from_pretrained(multilingual_model_name)\n",
"#muli_model = AutoModel.from_pretrained(multilingual_model_name)\n"
]
},
{
"cell_type": "markdown",
"id": "1f1657a9",
"metadata": {},
"source": [
"## 1 : Fill-Mask task example"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "2ace43c4",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Some weights of the model checkpoint at dbmdz/bert-base-italian-cased were not used when initializing BertForMaskedLM: ['cls.seq_relationship.weight', 'cls.seq_relationship.bias']\n",
"- This IS expected if you are initializing BertForMaskedLM from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n",
"- This IS NOT expected if you are initializing BertForMaskedLM from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n"
]
},
{
"data": {
"text/plain": [
"[{'score': 0.9144049286842346,\n",
" 'token': 482,\n",
" 'token_str': 'stato',\n",
" 'sequence': 'Umberto Eco è stato un grande scrittore'},\n",
" {'score': 0.025699790567159653,\n",
" 'token': 5801,\n",
" 'token_str': 'diventato',\n",
" 'sequence': 'Umberto Eco è diventato un grande scrittore'},\n",
" {'score': 0.022715440019965172,\n",
" 'token': 409,\n",
" 'token_str': 'anche',\n",
" 'sequence': 'Umberto Eco è anche un grande scrittore'},\n",
" {'score': 0.006274252198636532,\n",
" 'token': 1402,\n",
" 'token_str': 'oggi',\n",
" 'sequence': 'Umberto Eco è oggi un grande scrittore'},\n",
" {'score': 0.004773850552737713,\n",
" 'token': 14743,\n",
" 'token_str': 'divenuto',\n",
" 'sequence': 'Umberto Eco è divenuto un grande scrittore'}]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fill = pipeline('fill-mask',model=italian_model_name)\n",
"masked_sentence = 'Umberto Eco è [MASK] un grande scrittore'\n",
"fill(masked_sentence)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "df12c632",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[{'score': 0.1162119209766388,\n",
" 'token': 7607,\n",
" 'token_str': 'troviamo',\n",
" 'sequence': 'a che ora ci troviamo?'},\n",
" {'score': 0.06763438880443573,\n",
" 'token': 17567,\n",
" 'token_str': 'aspettiamo',\n",
" 'sequence': 'a che ora ci aspettiamo?'},\n",
" {'score': 0.06530702114105225,\n",
" 'token': 1303,\n",
" 'token_str': 'sarà',\n",
" 'sequence': 'a che ora ci sarà?'},\n",
" {'score': 0.05703262239694595,\n",
" 'token': 4238,\n",
" 'token_str': 'vediamo',\n",
" 'sequence': 'a che ora ci vediamo?'},\n",
" {'score': 0.05302278324961662,\n",
" 'token': 17387,\n",
" 'token_str': 'vedete',\n",
" 'sequence': 'a che ora ci vedete?'}]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"masked_sentence = 'a che ora ci [MASK]?'\n",
"fill(masked_sentence)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "6d87ab9c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[{'score': 0.36587169766426086,\n",
" 'token': 510,\n",
" 'token_str': 'cosa',\n",
" 'sequence': 'a che cosa ci troviamo?'},\n",
" {'score': 0.046960778534412384,\n",
" 'token': 739,\n",
" 'token_str': 'modo',\n",
" 'sequence': 'a che modo ci troviamo?'},\n",
" {'score': 0.04375715181231499,\n",
" 'token': 212,\n",
" 'token_str': 'non',\n",
" 'sequence': 'a che non ci troviamo?'},\n",
" {'score': 0.023330960422754288,\n",
" 'token': 1302,\n",
" 'token_str': 'livello',\n",
" 'sequence': 'a che livello ci troviamo?'},\n",
" {'score': 0.02314317226409912,\n",
" 'token': 1711,\n",
" 'token_str': 'condizioni',\n",
" 'sequence': 'a che condizioni ci troviamo?'}]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"masked_sentence = 'a che [MASK] ci troviamo?'\n",
"fill(masked_sentence)"
]
},
{
"cell_type": "markdown",
"id": "ffa2e70f",
"metadata": {},
"source": [
"## 2 : Zero-Shot classification task example\n",
"\n",
"uso modello multilingua ( unico disponibile su huggingface in grado di performare l'inferenza zero-shot in italiano)\n",
" \n",
"link generico in italiano sullo __zero-shot__ learning e inference: https://zephyrnet.com/it/Zero-shot-learning-puoi-classificare-un-oggetto-senza-vederlo-prima/"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "ba49a3f4",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Some weights of the model checkpoint at dbmdz/bert-base-italian-cased were not used when initializing BertForSequenceClassification: ['cls.seq_relationship.bias', 'cls.predictions.transform.LayerNorm.weight', 'cls.predictions.decoder.weight', 'cls.predictions.transform.dense.bias', 'cls.seq_relationship.weight', 'cls.predictions.transform.LayerNorm.bias', 'cls.predictions.transform.dense.weight', 'cls.predictions.bias']\n",
"- This IS expected if you are initializing BertForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n",
"- This IS NOT expected if you are initializing BertForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n",
"Some weights of BertForSequenceClassification were not initialized from the model checkpoint at dbmdz/bert-base-italian-cased and are newly initialized: ['classifier.weight', 'classifier.bias']\n",
"You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n",
"Failed to determine 'entailment' label id from the label2id mapping in the model config. Setting to -1. Define a descriptive label2id mapping in the model config to ensure correct outputs.\n"
]
}
],
"source": [
"zs = pipeline(\"zero-shot-classification\",model=italian_model_name)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f11053eb",
"metadata": {},
"outputs": [],
"source": [
"zs('che merda di giornata', candidate_labels=['positivo','negativo'],hypothesis_template='questa frase ha un tono {}',) #multiclass"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9c151ae8",
"metadata": {},
"outputs": [],
"source": [
"zs(sequences='dove vai stasera?',hypothesis_template='questa frase è una {}',candidate_labels=['affermazione','domanda'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "87c76244",
"metadata": {},
"outputs": [],
"source": [
"zs(sequences='where are you going?',hypothesis_template='this phrase is a {}',candidate_labels=['question','affirmation'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4a29d6a5",
"metadata": {},
"outputs": [],
"source": [
"zs(sequences='Voglio uscire con voi stasera, ma devo pulire casa prima',candidate_labels=['dubbio','invito','carro','positivo','negativo'], multiclass=True)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "fcf8ff42",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'sequence': 'Sono felice di uscire con voi stasera',\n",
" 'labels': ['relax',\n",
" 'pace',\n",
" 'indifferenza',\n",
" 'interesse',\n",
" 'fastidio',\n",
" 'dubbio',\n",
" 'noia',\n",
" 'rabbia',\n",
" 'sconforto',\n",
" 'calma',\n",
" 'tristezza',\n",
" 'eccitazione',\n",
" 'gioia',\n",
" 'felicità'],\n",
" 'scores': [0.07741541415452957,\n",
" 0.07665539532899857,\n",
" 0.0763017013669014,\n",
" 0.07597608864307404,\n",
" 0.07575443387031555,\n",
" 0.07570748031139374,\n",
" 0.0756787359714508,\n",
" 0.07537700980901718,\n",
" 0.07522716373205185,\n",
" 0.07521089166402817,\n",
" 0.07490663230419159,\n",
" 0.07221430540084839,\n",
" 0.07031130790710449,\n",
" 0.02326352894306183]}"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#https://www.google.it/search?q=thayer+mood+plane+italia&biw=1528&bih=788&tbm=isch&source=iu&ictx=1&vet=1&fir=idr_CWra3dTA3M%252C3vr2PPAMir9TdM%252C_%253BEhLHcfw0fkhWHM%252CEh6xJHBGzk4cMM%252C_%253BaP-KPSMboAJg2M%252CnleMstLur1huUM%252C_%253BxHGASYvcnwBR5M%252CrZKJnx3na11TtM%252C_%253Bl2JjpwGxrk9aOM%252CEh6xJHBGzk4cMM%252C_%253BGC1du1ZkYglw-M%252Co4brRqZQk5p8CM%252C_%253BO8E8kjpRcFlMWM%252CnleMstLur1huUM%252C_%253BoYYMLq4zR-JFeM%252Co4brRqZQk5p8CM%252C_%253B1CIJmqw2RNg0VM%252C5o_XDTGFr1iuXM%252C_%253BaDO14J7XISRjIM%252CEh6xJHBGzk4cMM%252C_&usg=AI4_-kSIgRNOu3F0-x0YYMbNCEIyLXfEzg&sa=X&ved=2ahUKEwiyqNDN_cD3AhVc7rsIHWi3CFYQ9QF6BAghEAE#imgrc=EhLHcfw0fkhWHM\n",
"moods=['fastidio','rabbia','sconforto','tristezza','noia','pace','relax','calma','felicità','gioia','indifferenza','interesse','dubbio','eccitazione']\n",
"zs(sequences='Sono felice di uscire con voi stasera',candidate_labels=moods)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "8ec3e16f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'sequence': 'ti ammazzo',\n",
" 'labels': ['noia',\n",
" 'eccitazione',\n",
" 'pace',\n",
" 'dubbio',\n",
" 'gioia',\n",
" 'rabbia',\n",
" 'indifferenza',\n",
" 'tristezza',\n",
" 'sconforto',\n",
" 'felicità',\n",
" 'fastidio',\n",
" 'calma',\n",
" 'relax',\n",
" 'interesse'],\n",
" 'scores': [0.07284864038228989,\n",
" 0.07268563657999039,\n",
" 0.07168520241975784,\n",
" 0.07163083553314209,\n",
" 0.07157977670431137,\n",
" 0.07146152853965759,\n",
" 0.07145626842975616,\n",
" 0.07143832743167877,\n",
" 0.07120247930288315,\n",
" 0.07110902667045593,\n",
" 0.07106047123670578,\n",
" 0.07105831056833267,\n",
" 0.07071790099143982,\n",
" 0.07006552070379257]}"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sentenza = 'ti ammazzo'\n",
"zs(sequences=sentenza,candidate_labels=moods)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "6a806191",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'sequence': 'non capisco perchè te la prendi con me, ti ho già regalato tutte le mi capre, non posso darti anche il bue',\n",
" 'labels': ['eccitazione',\n",
" 'indifferenza',\n",
" 'gioia',\n",
" 'relax',\n",
" 'felicità',\n",
" 'dubbio',\n",
" 'tristezza',\n",
" 'fastidio',\n",
" 'pace',\n",
" 'rabbia',\n",
" 'noia',\n",
" 'interesse',\n",
" 'sconforto',\n",
" 'calma'],\n",
" 'scores': [0.07354768365621567,\n",
" 0.07300304621458054,\n",
" 0.07294241338968277,\n",
" 0.07219138741493225,\n",
" 0.07172053307294846,\n",
" 0.07144749164581299,\n",
" 0.07143128663301468,\n",
" 0.07104679197072983,\n",
" 0.07093875855207443,\n",
" 0.07085791230201721,\n",
" 0.0706729143857956,\n",
" 0.07063259184360504,\n",
" 0.07041624188423157,\n",
" 0.06915094703435898]}"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sentenza = 'non capisco perchè te la prendi con me, ti ho già regalato tutte le mi capre, non posso darti anche il bue'\n",
"zs(sequences=sentenza,candidate_labels=moods, multiclass=True)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "0d2d0f93",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'sequence': 'le tue orecchie sono bruttissime, non uscirò mai con te',\n",
" 'labels': ['logica', 'attualità', 'cotillons', 'estetica'],\n",
" 'scores': [0.2509896755218506,\n",
" 0.25027403235435486,\n",
" 0.24949680268764496,\n",
" 0.2492394745349884]}"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"zs(sequences='le tue orecchie sono bruttissime, non uscirò mai con te',candidate_labels=['estetica','logica','attualità','cotillons'], multiclass=True)"
]
},
{
"cell_type": "markdown",
"id": "64c9b9af",
"metadata": {},
"source": [
"## 3 : POS-TAG task example\n",
"\n",
"Positional tagging, task già noto alla maggior parte delle persone aventi la terza elementare come __analisi grammaticale__\n",
"Nell'analisi grammaticale italiana ogni parola può appartenere ad una delle nove categorie lessicali dell'italiano, cinque variabili: articolo, aggettivo, sostantivo o nome, pronome, verbo, e quattro invariabili: avverbio, preposizione, congiunzione, interiezione o esclamazione. "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "118e6275",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 15,
"id": "9b74db59",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"testo originale ---> San Francisco prevede di bandire i robot di consegna porta a porta\n",
"\n",
"*** Pos-Tagging\n",
"WORD POS-TAG SYNTACTIC DEP\n",
"-------------------------------------\n",
"San PROPN nsubj\n",
"Francisco PROPN flat:name\n",
"prevede VERB ROOT\n",
"di ADP mark\n",
"bandire VERB xcomp\n",
"i DET det\n",
"robot NOUN obj\n",
"di ADP case\n",
"consegna NOUN nmod\n",
"porta VERB advcl\n",
"a ADP case\n",
"porta NOUN obl\n",
"\n",
"*** Analisi Entità specifiche nel testo:\n",
"ENTITY NAME LABEL\n",
"-------------------------------------\n",
"San Francisco LOC\n"
]
}
],
"source": [
"import spacy\n",
"from spacy.lang.it.examples import sentences \n",
"\n",
"try:\n",
" nlp = spacy.load(\"it_core_news_lg\")\n",
"except:\n",
" !python -m spacy download it_core_news_lg\n",
" nlp = spacy.load(\"it_core_news_lg\")\n",
"doc = nlp(sentences[2])\n",
"print('testo originale ---> ',doc.text)\n",
"print('\\n*** Pos-Tagging')\n",
"print('WORD', ' '*(10-len('word')), 'POS-TAG',' '*(10-len('POS-TAG')), 'SYNTACTIC DEP')\n",
"print('-------------------------------------')\n",
"for token in doc:\n",
" print(token.text,' '*(10-len(token.text)), token.pos_,' '*(10-len(token.pos_)), token.dep_ )\n",
"\n",
"print('\\n*** Analisi Entità specifiche nel testo:') \n",
"print('ENTITY NAME',' '*(20-len('ENTITY NAME')), 'LABEL')\n",
"print('-------------------------------------')\n",
"for ent in doc.ents:\n",
" print(ent.text ,' '*(20-len(ent.text)), ent.label_)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "92712a0d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"testo originale ---> Londra è una grande città del Regno Unito.\n",
"\n",
"*** Pos-Tagging\n",
"WORD POS-TAG SYNTACTIC DEP\n",
"-------------------------------------\n",
"Londra PROPN nsubj\n",
"è AUX cop\n",
"una DET det\n",
"grande ADJ amod\n",
"città NOUN ROOT\n",
"del ADP case\n",
"Regno PROPN nmod\n",
"Unito PROPN flat:name\n",
". PUNCT punct\n",
"\n",
"*** Analisi Entità specifiche nel testo:\n",
"ENTITY NAME LABEL\n",
"-------------------------------------\n",
"Londra LOC\n",
"Regno Unito LOC\n"
]
}
],
"source": [
"doc = nlp(sentences[3])\n",
"print('testo originale ---> ',doc.text)\n",
"print('\\n*** Pos-Tagging')\n",
"print('WORD', ' '*(10-len('word')), 'POS-TAG',' '*(10-len('POS-TAG')), 'SYNTACTIC DEP')\n",
"print('-------------------------------------')\n",
"for token in doc:\n",
" print(token.text,' '*(10-len(token.text)), token.pos_,' '*(10-len(token.pos_)), token.dep_ )\n",
"\n",
"print('\\n*** Analisi Entità specifiche nel testo:') \n",
"print('ENTITY NAME',' '*(20-len('ENTITY NAME')), 'LABEL')\n",
"print('-------------------------------------')\n",
"for ent in doc.ents:\n",
" print(ent.text ,' '*(20-len(ent.text)), ent.label_)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "7ab8299b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"testo originale ---> non capisco perchè te la prendi con Giacomo, ti ha già regalato tutte le sue capre, non può darti anche il bue\n",
"\n",
"*** Pos-Tagging\n",
"WORD POS-TAG SYNTACTIC DEP\n",
"-------------------------------------\n",
"non ADV advmod\n",
"capisco VERB ROOT\n",
"perchè SCONJ mark\n",
"te PRON expl\n",
"la PRON obj\n",
"prendi VERB ccomp\n",
"con ADP case\n",
"Giacomo PROPN obl\n",
", PUNCT punct\n",
"ti PRON iobj\n",
"ha AUX aux\n",
"già ADV advmod\n",
"regalato VERB conj\n",
"tutte DET det:predet\n",
"le DET det\n",
"sue DET det:poss\n",
"capre NOUN obj\n",
", PUNCT punct\n",
"non ADV advmod\n",
"può AUX aux\n",
"darti VERB conj\n",
"anche ADV advmod\n",
"il DET det\n",
"bue NOUN obj\n",
"\n",
"*** Analisi Entità specifiche nel testo:\n",
"ENTITY NAME LABEL\n",
"-------------------------------------\n",
"Giacomo PER\n"
]
}
],
"source": [
"doc = nlp(sentenza.replace('me','Giacomo').replace('mi','sue').replace('ho','ha').replace('posso','può'))\n",
"print('testo originale ---> ',doc.text)\n",
"print('\\n*** Pos-Tagging')\n",
"print('WORD', ' '*(10-len('word')), 'POS-TAG',' '*(10-len('POS-TAG')), 'SYNTACTIC DEP')\n",
"print('-------------------------------------')\n",
"for token in doc:\n",
" print(token.text,' '*(10-len(token.text)), token.pos_,' '*(10-len(token.pos_)), token.dep_ )\n",
"\n",
"print('\\n*** Analisi Entità specifiche nel testo:') \n",
"print('ENTITY NAME',' '*(20-len('ENTITY NAME')), 'LABEL')\n",
"print('-------------------------------------')\n",
"for ent in doc.ents:\n",
" print(ent.text ,' '*(20-len(ent.text)), ent.label_)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1f5fafff",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "geografia",
"language": "python",
"name": "geografia"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}