Strumenti Utente

Strumenti Sito


esplorazione_ud

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Entrambe le parti precedenti la revisione Revisione precedente
Prossima revisione
Revisione precedente
esplorazione_ud [2021/10/25 13:56]
65.21.180.48 versione precedente ripristinata (2021/06/03 11:45)
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, il sistema UD non include nel record della singola parola unità l'identificativo della frase che la contiene. Come mostra lo script, l’aggiunta di questo campo può essere tuttavia utile per l’esplorazione del corpus.+Lo script seguente contiene una classe python finalizzata all’esplorazione di un treebank UD. A differenza di quanto accade in altri sistemi di annotazione, il formato UD non include nel record della singola parola unità l'identificativo della frase che la contiene. Come mostra lo script, l’aggiunta di questo campo può essere tuttavia molto utile per l’esplorazione del corpus. 
 +<code python ud_explorer2.py> 
 +# -*- coding: utf-8 -*- 
 +#Copyright 2023 P. Milizia CC-BY 4.0 (https://creativecommons.org/licenses/by/4.0/
 +#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('ID FORM LEMMA UPOS XPOS FEATS HEAD DEPREL DEPS MISC SID')
 + 
 + 
 +#CLASSE PYTHON PER LA LETTURA DI UN TREEBANK UD
 +class UD:
 + def __init__(self, dir_name: str = '.'):
 + #legge i file
 + files=glob.glob(dir_name+'/*conllu')
 + data=''
 + for filepath in files:
 + with open(filepath, 'r') as file:
 + data+=file.read()
 + 
 + #ordina i file e crea una variabile text_list con l'elenco dei testi
 + data=data.split('# newdoc ')[1:]
 + data.sort()
 + data='# newdoc '+'# newdoc '.join(data)
 + self.text_list=re.findall('#\snewdoc\s.*', data)
 + 
 + #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, text):
 + sid_expr=re.compile('(?<=sent_id\s=\s).*')
 + text=re.split('\n',text)
 + output=''
 + sid=''
 + for line in text:
 + found=re.search(sid_expr,line)
 + if found != None:
 + sid=found.group()
 + if line !='' and line[0] != '#':
 + line = line+'\t'+sid
 + output += line+'\n'
 + return output
 + 
 + #crea la lista dei tokens
 + def create_tokens(self, data):
 + expr=re.compile('\n([0-9]*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t([0-9]*?)\t(.*?)\t(.*?)\t(.*?)\t(.*)')
 + tokens = re.findall(expr, data)
 + for i in range(len(tokens)):
 + tokens[i]=list(tokens[i])
 + for ii in (5,9):
 + tokens[i][ii]=re.split('\|',tokens[i][ii])
 + 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, l)) for l in tokens ] 
 + return tokens
 + 
 + #crea il dizionario delle frasi
 + def create_sentences(self, tokens):
 + sentences={}
 + sid=''
 + for t in tokens:
 + if t[SID] != sid:
 + sid=t[SID]
 + sentences[sid]=['root']
 + sentences[sid].append(t)
 + return sentences
 + 
 + #funzioni di interrogazione
 + def parent_of(self, x):
 + return self.sentences[x[SID]][x[HEAD]]
 + 
 + def grandparent_of(self, occurrence):
 + return self.parent_of(self.parent_of(occurrence))
 + 
 + def right_of(self, x, n: int = 1):
 + try:
 + outp=self.sentences[x[SID]][x[ID]+n]
 + except IndexError:
 + outp=None
 + return outp
 + 
 + def left_of(self, x, n: int = 1):
 + if x[0]-n > 0:
 + outp=self.sentences[x[SID]][x[ID]-n]
 + else:
 + outp=None
 + return outp
 + 
 + def children_of(self,x):
 + return [t for t in self.sentences[x[SID]][1:] if self.parent_of(t)==x]
 + 
 + def lineage_of(self, x):
 + output = [x]
 + while x != 'root':
 + y=self.parent_of(x)
 + output.append(y)
 + x=y
 + return output
 + 
 + #funzione per estrarre il testo di una frase
 + def get_sentence(self, x):
 + 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],x[SID],x[ID])
 + 
 +#ESEMPI DI UTILIZZO
 +
 +#Si assume che i file del treebank di copto siano in una sottocartella denominata 'connlu'
 +
 +treebank=UD('conllu')
 +
 +
 +#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] =='obj' and treebank.parent_of(token)[LEMMA]=='ⲉⲓⲣⲉ':
 + print(form_and_position_of(token))
 +
 +
 +#trova tutte le occorrenze di 'ⲙⲙⲟ' e di 'ⲛ' come marca dell'oggetto diretto
 +#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]=='ⲁ' and child[UPOS]=='AUX':
 + answer = True
 + break
 + return answer
 + 
 +for token in treebank.tokens:
 + if (token[FORM] == 'ⲙⲙⲟ' or token[FORM] == 'ⲛ') and token[DEPREL]=='case':
 + try:
 + regens = treebank.grandparent_of(token)
 + noun_pronoun = treebank.parent_of(token)
 + if noun_pronoun[DEPREL]=='obj' and is_past(regens) and (token[ID] - regens[ID])>1:
 + found_tokens.append(token)
 + except:
 + pass
 + 
 +for o in found_tokens:
 + print(o)
 +</code>
 <code python ud_explorer.py> <code python ud_explorer.py>
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
Linea 7: Linea 160:
 import re import re
 import glob import glob
- +  
 + 
 #CLASSE PYTHON PER LA LETTURA DI UN TREEBANK UD #CLASSE PYTHON PER LA LETTURA DI UN TREEBANK UD
 class UD: class UD:
- def __init__(self, data):+ def __init__(self, dir_name: str = '.'): 
 + #legge i file 
 + files=glob.glob(dir_name+'/*conllu'
 + data='' 
 + for filepath in files: 
 + with open(filepath, 'r'as file: 
 + data+=file.read() 
 +  
 + #ordina i file e crea una variabile text_list con l'elenco dei testi 
 + data=data.split('# newdoc ')[1:
 + data.sort() 
 + data='# newdoc '+'# newdoc '.join(data) 
 + self.text_list=re.findall('#\snewdoc\s.*', data) 
 +  
 + #crea le variabili fondamentali
  self.data=self.add_sent_id(data)  self.data=self.add_sent_id(data)
  self.tokens=self.create_tokens(self.data)  self.tokens=self.create_tokens(self.data)
  self.sentences=self.create_sentences(self.tokens)  self.sentences=self.create_sentences(self.tokens)
- + 
  #aggiunge il campo sent_id  #aggiunge il campo sent_id
  def add_sent_id(self, text):  def add_sent_id(self, text):
Linea 30: Linea 197:
  output += line+'\n'  output += line+'\n'
  return output  return output
- + 
  #crea la lista dei tokens  #crea la lista dei tokens
  def create_tokens(self, data):  def create_tokens(self, data):
- expr=re.compile('\n([^#].*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*)')+ expr=re.compile('\n([0-9]*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t([0-9]*?)\t(.*?)\t(.*?)\t(.*?)\t(.*)')
  tokens = re.findall(expr, data)  tokens = re.findall(expr, data)
  for i in range(len(tokens)):  for i in range(len(tokens)):
Linea 39: Linea 206:
  for ii in (5,9):  for ii in (5,9):
  tokens[i][ii]=re.split('\|',tokens[i][ii])  tokens[i][ii]=re.split('\|',tokens[i][ii])
- try: + tokens[i][0]=int(tokens[i][0]) 
- tokens[i][0]=int(tokens[i][0]) + tokens[i][6]=int(tokens[i][6])
- except ValueError: +
- pass +
- try: +
- tokens[i][6]=int(tokens[i][6]) +
- except ValueError: +
- pass+
  return tokens  return tokens
 + 
  #crea il dizionario delle frasi  #crea il dizionario delle frasi
  def create_sentences(self, tokens):  def create_sentences(self, tokens):
Linea 57: Linea 218:
  sid=t[10]  sid=t[10]
  sentences[sid]=['root']  sentences[sid]=['root']
- if type(t[0])==int: + sentences[sid].append(t)
- tt=t[:+
- sentences[sid].append(tt)+
  return sentences  return sentences
  
- def parent_of(self, occurrence): + #funzioni di interrogazione 
- x=self.sentences[occurrence[10]][occurrence[0]]+ def parent_of(self, x):
  return self.sentences[x[10]][x[6]]  return self.sentences[x[10]][x[6]]
 + 
  def grandparent_of(self, occurrence):  def grandparent_of(self, occurrence):
  return self.parent_of(self.parent_of(occurrence))  return self.parent_of(self.parent_of(occurrence))
- +  
- def subsequent_of(self, occurrence):+ def right_of(self, x, n: int = 1):
  try:  try:
- outp=self.sentences[occurrence[10]][occurrence[0]+1]+ outp=self.sentences[x[10]][x[0]+n]
  except IndexError:  except IndexError:
  outp=None  outp=None
  return outp  return outp
- +  
- def precedent_of(self, occurrence): + def left_of(self, x, n: int = 1): 
- try+ if x[0]-n > 0
- outp=self.sentences[occurrence[10]][occurrence[0]-1+ outp=self.sentences[x[10]][x[0]-n
- except IndexError: + else:
- outp=None +
- except TypeError:+
  outp=None  outp=None
  return outp  return outp
-  +  
- def children_of(self,occurrence): + def children_of(self,x): 
- x=self.sentences[occurrence[10]][occurrence[0]] + return [t for t in self.sentences[x[10]][1:] if self.parent_of(t)==x] 
- return [t for t in self.sentences[occurrence[10]][1:] if self.parent_of(t)==x] +  
- + def lineage_of(self, x):
- def ancestors_of(self, occurrence): +
- x=self.sentences[occurrence[10]][occurrence[0]]+
  output = [x]  output = [x]
  while x != 'root':  while x != 'root':
Linea 98: Linea 253:
  return output  return output
  
 + #funzione per estrarre il testo di una frase
  def get_sentence(self, x):  def get_sentence(self, x):
  return [j[1] for j in self.sentences[x][1:]]  return [j[1] for j in self.sentences[x][1:]]
- + 
- +
-#PREPARAZIONE DEI DATI PER LA CLASSE +
- +
-#lettura file +
-directory_name='testi/UD_Coptic-Scriptorium-master' +
-path = directory_name+'/*conllu' +
-files=glob.glob(path) +
-data='' +
-for filepath in files: +
- with open(filepath, 'r') as file: +
- file_data=file.read() +
- data+=file_data +
-#ordina i file e crea una variabile text_list con l'elenco dei testi +
-data=data.split('# newdoc ')[1:+
-data.sort() +
-data='# newdoc '+'# newdoc '.join(data) +
-text_list=re.findall('#\snewdoc\s.*', data) +
- +
 #ESEMPIO DI UTILIZZO #ESEMPIO DI UTILIZZO
 + 
 #trova tutte le occorrenze di 'ⲙⲙⲟ' e di 'ⲛ' come marca dell'oggetto diretto #trova tutte le occorrenze di 'ⲙⲙⲟ' e di 'ⲛ' come marca dell'oggetto diretto
 #alle seguenti condizioni: #alle seguenti condizioni:
 #1) che la frase sia al passato perfettivo positivo #1) che la frase sia al passato perfettivo positivo
 #2) che almeno un elemento sia interposto tra verbo e preposizione #2) che almeno un elemento sia interposto tra verbo e preposizione
- +  
-coptic=UD(data+coptic=UD('testi/UD_Coptic-Scriptorium-master'
 + 
 found_tokens=[] found_tokens=[]
 + 
 def is_past(o): def is_past(o):
  answer = False  answer = False
Linea 138: Linea 275:
  break  break
  return answer  return answer
 + 
 for token in coptic.tokens: for token in coptic.tokens:
  if (token[1] == 'ⲙⲙⲟ' or token[1] == 'ⲛ') and token[7]=='case':  if (token[1] == 'ⲙⲙⲟ' or token[1] == 'ⲛ') and token[7]=='case':
Linea 144: Linea 281:
  regens = coptic.grandparent_of(token)  regens = coptic.grandparent_of(token)
  noun_pronoun = coptic.parent_of(token)  noun_pronoun = coptic.parent_of(token)
- if noun_pronoun[7]=='obj' and is_past(regens) and (int(token[0]int(regens[0]))>1:+ if noun_pronoun[7]=='obj' and is_past(regens) and (token[0] - regens[0])>1:
  found_tokens.append(token)  found_tokens.append(token)
  except:  except:
  pass  pass
 + 
 for o in found_tokens: for o in found_tokens:
  print(o)  print(o)
 </code> </code>
esplorazione_ud.1635170204.txt.gz · Ultima modifica: 2021/10/25 13:56 da 65.21.180.48