Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
| Entrambe le parti precedenti la revisione Revisione precedente Prossima revisione | Revisione precedente | ||
|
esplorazione_ud [2021/06/05 07:46] 31.156.199.251 |
esplorazione_ud [2023/06/16 13:50] (versione attuale) admin |
||
|---|---|---|---|
| Linea 1: | Linea 1: | ||
| ====== Esplorazione di un treebank UD ====== | ====== Esplorazione di un treebank UD ====== | ||
| Lo script seguente contiene una classe python finalizzata all’esplorazione di un treebank UD. A differenza di quanto accade in altri sistemi di annotazione, | Lo script seguente contiene una classe python finalizzata all’esplorazione di un treebank UD. A differenza di quanto accade in altri sistemi di annotazione, | ||
| + | <code python ud_explorer2.py> | ||
| + | # -*- coding: utf-8 -*- | ||
| + | #Copyright 2023 P. Milizia CC-BY 4.0 (https:// | ||
| + | #La presente versione presuppone che sia installato il modulo sympy (se si dispone di pip, digitare "pip3 install sympy" o "pip install sympy" secondo la configurazione del sistema) | ||
| + | import re | ||
| + | import glob | ||
| + | from sympy import symbols | ||
| + | ID, FORM, LEMMA, UPOS, XPOS, FEATS, HEAD, DEPREL, DEPS, MISC, SID = symbols(' | ||
| + | |||
| + | |||
| + | #CLASSE PYTHON PER LA LETTURA DI UN TREEBANK UD | ||
| + | class UD: | ||
| + | def __init__(self, | ||
| + | #legge i file | ||
| + | files=glob.glob(dir_name+'/ | ||
| + | data='' | ||
| + | for filepath in files: | ||
| + | with open(filepath, | ||
| + | data+=file.read() | ||
| + | |||
| + | #ordina i file e crea una variabile text_list con l' | ||
| + | data=data.split('# | ||
| + | data.sort() | ||
| + | data='# | ||
| + | self.text_list=re.findall('# | ||
| + | |||
| + | #crea le variabili fondamentali | ||
| + | self.data=self.add_sent_id(data) | ||
| + | self.tokens=self.create_tokens(self.data) | ||
| + | self.sentences=self.create_sentences(self.tokens) | ||
| + | |||
| + | #aggiunge il campo sent_id | ||
| + | def add_sent_id(self, | ||
| + | sid_expr=re.compile(' | ||
| + | text=re.split(' | ||
| + | output='' | ||
| + | sid='' | ||
| + | for line in text: | ||
| + | found=re.search(sid_expr, | ||
| + | if found != None: | ||
| + | sid=found.group() | ||
| + | if line !='' | ||
| + | line = line+' | ||
| + | output += line+' | ||
| + | return output | ||
| + | |||
| + | #crea la lista dei tokens | ||
| + | def create_tokens(self, | ||
| + | expr=re.compile(' | ||
| + | tokens = re.findall(expr, | ||
| + | for i in range(len(tokens)): | ||
| + | tokens[i]=list(tokens[i]) | ||
| + | for ii in (5,9): | ||
| + | tokens[i][ii]=re.split(' | ||
| + | tokens[i][0]=int(tokens[i][0]) | ||
| + | tokens[i][6]=int(tokens[i][6]) | ||
| + | keys = [ID, FORM, LEMMA, UPOS, XPOS, FEATS, HEAD, DEPREL, DEPS, MISC, SID] | ||
| + | tokens=[dict(zip(keys, | ||
| + | return tokens | ||
| + | |||
| + | #crea il dizionario delle frasi | ||
| + | def create_sentences(self, | ||
| + | sentences={} | ||
| + | sid='' | ||
| + | for t in tokens: | ||
| + | if t[SID] != sid: | ||
| + | sid=t[SID] | ||
| + | sentences[sid]=[' | ||
| + | sentences[sid].append(t) | ||
| + | return sentences | ||
| + | |||
| + | #funzioni di interrogazione | ||
| + | def parent_of(self, | ||
| + | return self.sentences[x[SID]][x[HEAD]] | ||
| + | |||
| + | def grandparent_of(self, | ||
| + | return self.parent_of(self.parent_of(occurrence)) | ||
| + | |||
| + | def right_of(self, | ||
| + | try: | ||
| + | outp=self.sentences[x[SID]][x[ID]+n] | ||
| + | except IndexError: | ||
| + | outp=None | ||
| + | return outp | ||
| + | |||
| + | def left_of(self, | ||
| + | if x[0]-n > 0: | ||
| + | outp=self.sentences[x[SID]][x[ID]-n] | ||
| + | else: | ||
| + | outp=None | ||
| + | return outp | ||
| + | |||
| + | def children_of(self, | ||
| + | return [t for t in self.sentences[x[SID]][1: | ||
| + | |||
| + | def lineage_of(self, | ||
| + | output = [x] | ||
| + | while x != ' | ||
| + | y=self.parent_of(x) | ||
| + | output.append(y) | ||
| + | x=y | ||
| + | return output | ||
| + | |||
| + | #funzione per estrarre il testo di una frase | ||
| + | def get_sentence(self, | ||
| + | return [j[FORM] for j in self.sentences[x][1: | ||
| + | |||
| + | #funzione per estrarre la posizione di un token | ||
| + | def form_and_position_of(x): | ||
| + | return (x[FORM], | ||
| + | |||
| + | #ESEMPI DI UTILIZZO | ||
| + | |||
| + | #Si assume che i file del treebank di copto siano in una sottocartella denominata ' | ||
| + | |||
| + | treebank=UD(' | ||
| + | |||
| + | |||
| + | #mostra forma e posizione di tutti i token che figurano in funzione di oggetto diretto di forme del lessema ⲉⲓⲣⲉ | ||
| + | |||
| + | for token in treebank.tokens: | ||
| + | if token[DEPREL] ==' | ||
| + | print(form_and_position_of(token)) | ||
| + | |||
| + | |||
| + | #trova tutte le occorrenze di ' | ||
| + | #alle seguenti condizioni: | ||
| + | #1) che la frase sia al passato perfettivo positivo | ||
| + | #2) che almeno un elemento sia interposto tra verbo e preposizione | ||
| + | |||
| + | found_tokens=[] | ||
| + | |||
| + | def is_past(o): | ||
| + | answer = False | ||
| + | for child in treebank.children_of(o): | ||
| + | if child[FORM]==' | ||
| + | answer = True | ||
| + | break | ||
| + | return answer | ||
| + | |||
| + | for token in treebank.tokens: | ||
| + | if (token[FORM] == ' | ||
| + | try: | ||
| + | regens = treebank.grandparent_of(token) | ||
| + | noun_pronoun = treebank.parent_of(token) | ||
| + | if noun_pronoun[DEPREL]==' | ||
| + | found_tokens.append(token) | ||
| + | except: | ||
| + | pass | ||
| + | |||
| + | for o in found_tokens: | ||
| + | print(o) | ||
| + | </ | ||
| <code python ud_explorer.py> | <code python ud_explorer.py> | ||
| # -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
| Linea 12: | Linea 165: | ||
| class UD: | class UD: | ||
| def __init__(self, | def __init__(self, | ||
| - | # | + | # |
| files=glob.glob(dir_name+'/ | files=glob.glob(dir_name+'/ | ||
| data='' | data='' | ||
| Linea 84: | Linea 237: | ||
| def left_of(self, | def left_of(self, | ||
| if x[0]-n > 0: | if x[0]-n > 0: | ||
| - | outp=self.sentences[x[10]][x[0]-1] | + | outp=self.sentences[x[10]][x[0]-n] |
| else: | else: | ||
| outp=None | outp=None | ||