Skip to content
Snippets Groups Projects
Commit 4a97cef2 authored by Nicolas Allègre's avatar Nicolas Allègre
Browse files

Add partie AMR et Notebook

parent ee8465e3
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags:
<center><img src="data:image/png;base64,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" /></center>
%% Cell type:markdown id: tags:
<h1><center><strong><font color="green">IA 717: CHAI & fairness: linguistics of AI ethics charters & manifestos<br/>PART4 : AMR</font></strong></center></h1>
<h3><center><font color="blue"><strong>Student Version</strong></font></center></h3>
<center>
<h3> Project Supervisor</h3>
<a>Maria Boritchev</a> <email>maria.boritchev@telecom-paris.fr</email>
<h3> Project student</h3>
<a>Josephine Bernard</a> <email>josephine.bernard@telecom-paris.fr</email><br/>
<a>Laury Magne</a> <email>laury.magne@telecom-paris.fr</email><br/>
<a>Dan Hayoun</a> <email>dan.hayoun@telecom-paris.fr</email><br/>
<a>Nicolas Allègre</a> <email>nicolas.allegre@telecom-paris.fr</email><br/>
<br/>
Year 2024-2025
</center>
------------------------
%% Cell type:markdown id: tags:
# <font color="green">**0 - Code Python initial**</font>
%% Cell type:markdown id: tags:
### 0.1) Première partie imports et fonctions globales
%% Cell type:code id: tags:
``` python
# python -m pip install matplotlib numpy scipy sklearn tabulate penman
# Global import
import importlib
import itertools
import math
import os
import shutil
import sys
import string
import typing
from collections.abc import Iterable
from itertools import islice
from pathlib import Path
from pprint import pprint
import matplotlib.pyplot as plt
import numpy as np
import numpy.typing as npt
import penman
from scipy.stats import norm # type: ignore[import-untyped]
from sklearn.feature_extraction.text import CountVectorizer
from tabulate import tabulate
import metamorphosed.amrdoc as amrdoc
from Corpus import Corpus
PATH_DATA_FOLDER = '../data'
PATH_LOG_FOLDER = '../log'
PATH_DATA_TXT = '../data/txts'
PATH_DATA_DOCS = '../data/docs'
PATH_DATA_PREPROCESSED = '../data/preprocessed'
PATH_DATA_CORTEX = '../data/corpus_cortext'
PATH_DATA_IRAMUTEQ = '../data/corpus_iramuteq'
PATH_DATA_AMR = '../data/AMR'
FILENAME_DATA_IRAMUTEQ = 'corpus.txt'
FILENAME_DATA_LANG = 'corpus_lang.csv'
FILENAME_DATA_LANG_PREPRO = 'corpus_lang_preprocessing.csv'
FILENAME_DATA_AMR = 'key_penmans.amr'
PATH_DATA_FILE_LANG = os.path.join(PATH_DATA_FOLDER, FILENAME_DATA_LANG)
PATH_DATA_FILE_LANG_PREPRO = os.path.join(PATH_DATA_FOLDER, FILENAME_DATA_LANG_PREPRO)
PATH_DATA_FILE_IRAMUTEQ = os.path.join(PATH_DATA_IRAMUTEQ, FILENAME_DATA_IRAMUTEQ)
PATH_DATA_FILE_AMR = os.path.join('..', FILENAME_DATA_AMR)
TYPE_METHOD = ['cortex', 'iramuteq', 'txt']
CHARSET = 'UTF-8'
sys.path.append('..')
def take(n: int, iterable: Iterable) -> list[any]:
"""Return the first n items of the iterable as a list."""
return list(islice(iterable, n))
#end def take
# Chargement de tout les corpus
# list_corpus = {method: Corpus(method) for method in TYPE_METHOD}
```
%% Cell type:markdown id: tags:
### 0.2) Deuxième partie chargement des données
%% Cell type:code id: tags:
``` python
amr_mapaie = amrdoc.AMRdoc(PATH_DATA_FILE_AMR)
```
%% Output
..\key_penmans.amr
1201 sentences read from ..\key_penmans.amr
%% Cell type:markdown id: tags:
# <font color="green">**4 - AMR**</font>
%% Cell type:markdown id: tags:
## **4.0) Intro et explication**
%% Cell type:markdown id: tags:
### 4.0.1) Mémo d'utilisation
%% Cell type:markdown id: tags:
##### **Variable Notebook `amr_mapaie` :**
- **`amr_mapaie`** : variable contenant le chargement du fichier AMR (classe amrdoc.AMRdoc)
- `amr_mapaie.sentences` : liste contenant toutes les phrases en AMR (classe amrdoc.AMRsentence)
- `amr_mapaie.sentences.tsv()` : liste de l'AMR au format Graph Penman (triplet)
- ATTENTION : le format Graph n'est pas unique à partir d'un AMR !!!
> *Conversion from a PENMAN string to a Tree, and vice versa, is straightforward and lossless. Conversion to a Graph, however, is potentially lossy as the same graph can be represented by different trees.*
- `amrdoc.relations_between_concepts([amr_mapaie])` : Permet d'avoir un comptage et des stats sommaires.
- Avec *, depth=1* comme argument, seulement les concepts
- Avec *, depth=2* (défaut) comme argument, les stats concepts et relation associés
##### **La classe `amrdoc.AMRsentence` :**
- `amr_mapaie.sentences[0].amr` : l'AMR de la phrase (non parsé)
- `amr_mapaie.sentences[0].text` : la phrase de l'AMR
- `amr_mapaie.sentences[0].comments[0]` : le numéro du fichier (Format : 'File xxx')
- `amr_mapaie.sentences[0].tsv()` : Graph de l'AMR (même remarque)
- égale à *penman.decode(amr_mapaie.sentences[0].amr)*
- `amr_mapaie.sentences[0].getconceptlist()` : Retourne la liste des concept de la phrase
##### **Le module `Penman` :**
À utiliser pour plus de précision sur le parcours des graphes/arbres de la syntaxe AMR.
- https://penman.readthedocs.io/en/latest/api/penman.html
- https://penman.readthedocs.io/en/latest/api/penman.graph.html
```python
amr = amr_mapaie.sentences[0].amr
g = penman.decode(amr)
top = g.top # Sommet de l'arbre
concepts = {}
# for s, p, o in amr_mapaie.sentences[0].tsv():
for s, p, o in g.instances():
# s = source – the source variable of the triple (g.top est le sommet)
# p = role – the edge label between the source and target
# o = target – the target variable or constant => C'est le concept pour les noeuds
if p == ":instance":
concepts[s] = o
...
```
%% Cell type:markdown id: tags:
### 4.0.2) Aide analyse AMR
%% Cell type:markdown id: tags:
Le fichier AMR de mapaie, `key_penmans.amr` est un fichier brut pouvant être lu en texte.
- La ligne *::snt* est la phrase originelle
- Suivie du numéro de fichier*
- Suivie de la syntaxe AMR (Penman)
Normalement, il n'y a pas besoin de lire directement ce fichier, juste à utiliser la variable `amr_mapaie`.
Aide sur la syntaxe AMR : https://github.com/amrisi/amr-guidelines/blob/master/amr.md
%% Cell type:markdown id: tags:
### 4.0.3) Exemple d'utilisation dans amrdoc :
%% Cell type:code id: tags:
``` python
def relations_between_concepts(ads, depth=2):
output = []
concepts = {} # {concept: {relation: {concept: freq}}}
for ad in ads:
for sent in ad.sentences:
instances = {} # inst: concept
for s, p, o in sent.tsv():
if p == ":instance":
instances[s] = o
for s, p, o in sent.tsv():
if p != ":instance":
sclass = instances[s]
oclass = instances.get(o, "lit:" + o)
if depth == 1:
if sclass in concepts:
concepts[sclass] += 1
else:
concepts[sclass] = 1
continue
if sclass in concepts:
relations = concepts[sclass]
else:
relations = {}
concepts[sclass] = relations
if depth == 2:
if p in relations:
relations[p] += 1
else:
relations[p] = 1
continue
if p in relations:
objectconcepts = relations[p]
else:
objectconcepts = {}
relations[p] = objectconcepts
if oclass in objectconcepts:
objectconcepts[oclass] += 1
else:
objectconcepts[oclass] = 1
for c in sorted(concepts):
if depth == 1:
#print(c, concepts[c], sep="\t")
output.append("%s\t%s" % (c, concepts[c]))
continue
#print(c)
output.append(c)
for r in sorted(concepts[c]):
if depth == 2:
#print(" %s\t%s" % (r, concepts[c][r]))
output.append(" %s\t%s" % (r, concepts[c][r]))
continue
#print(" ", r)
output.append(" " + r)
for oc in sorted(concepts[c][r]):
#print(" %s\t%s" % (oc, concepts[c][r][oc]))
output.append(" %s\t%s" % (oc, concepts[c][r][oc]))
return output
```
%% Cell type:markdown id: tags:
### **4.1) Initialisation utilisation**
%% Cell type:code id: tags:
``` python
c1 = [x.split('\t') for x in amrdoc.relations_between_concepts([amr_mapaie], depth=1)]
c2=[x.split('\t') for x in amrdoc.relations_between_concepts([amr_mapaie], depth=2)]
# Concepts présents dans les AMR de mapaie
concepts = set(x[0] for x in c1)
# Type de relation présents dans les AMR de mapaie
relations = set(x[0] for x in c2) - concepts
```
%% Cell type:markdown id: tags:
Il faut chercher dans cette liste ceux qui se rapporte à **fairness** pour pourvoir effectuer les analyses à faire.
- Une première méthode simple est de regarder cette liste `concepts` dans la lettre 'f' :
>'face-01', 'facet', 'facilitate-01', 'facility', 'fact', 'factor', 'factor-01', 'fail-01', 'fair-01', 'fairness', 'fairwash-01', 'fall-01', 'fall-04', 'fallacy', 'familiarize-01', 'fatality', 'feasibility', 'feature', 'feature-01', 'federate-01', 'feed-01', 'feed-02', 'feedback', 'feel-01', 'few', 'fidelity', 'field', 'fight-01', 'figure', 'fill-01', 'fill-in-05', 'find-01', 'find-02', 'fine-04', 'fire-02', 'firm', 'fit-01', 'fit-03', 'fit-06', 'fix-03', 'flaw-01', 'flexibility', 'flow-01', 'focus-01', 'follow-01', 'follow-02', 'follow-04', 'follow-through-07', 'foresee-01', 'foreword', 'forgive-01', 'form', 'form-01', 'formalize-01', 'formula', 'formulate-01', 'foster-01', 'found-01', 'foundation', 'frame', 'frame-06', 'framework', 'free-04', 'frequent-02', 'friendly-01', 'from', 'fulfill-01', 'full-09', 'fun-01', 'function', 'function-01', 'functional-03', 'fund', 'fund-01', 'furnish-01', 'fuse-01', 'future'
- **'fair-01', 'fairness', 'fairwash-01'** pourrait nous interresser.
- *À noter que 'fairness' n'existe pas dans les concepts de probBank*
- Une deuxième méthode serait pour chaque phrase qui ne contient pas les concepts AMR 'fair-01', 'fairness', regarder manuellement comment le mot fairness a été transcrit.
Ensuite, on pourrait se renseigner au sens des mots choisis dans les fichiers XML de probBank [lien](https://github.com/propbank/propbank-frames/tree/main/frames) (ou sur l'application metamorphosed).
%% Cell type:code id: tags:
``` python
stat_concept = dict.fromkeys(sorted(concepts), 0)
for x in c1:
stat_concept[x[0]] = int(x[1])
stat_relation = dict.fromkeys(sorted(relations), 0)
stat_concept_relation = dict.fromkeys(sorted(concepts), {})
tmp_concept = list(stat_concept_relation.keys())[0]
for x in c2:
if len(x) == 1 and x[0] in concepts: # C'est un concept
tmp_concept = x[0]
stat_concept_relation[tmp_concept] = dict.fromkeys(sorted(relations), 0)
continue
if len(x) > 1: # C'est une relation associé au concept précédant
stat_relation[x[0]] += int(x[1])
stat_concept_relation[tmp_concept][x[0]] = int(x[1])
# stat_concept : contient les stats d'utilisation des concepts
# stat_relation : contient les stats d'utilisation du type de relation
# stat_concept_relation : contient les stats d'utilisation des type de relation par concept
```
%% Cell type:code id: tags:
``` python
tmp = dict(sorted(stat_concept.items(), key=lambda item: item[1], reverse=True))
pprint({k: tmp[k] for i, k in enumerate(tmp) if i < 20}, sort_dicts=False)
# tmp = dict(sorted(stat_relation.items(), key=lambda item: item[1], reverse=True))
# pprint({k: tmp[k] for i, k in enumerate(tmp) if i < 20}, sort_dicts=False)
```
%% Output
{'and': 5658,
'name': 2995,
'multi-sentence': 1020,
'or': 572,
'possible-01': 569,
'publication-91': 395,
'person': 379,
'publication': 362,
'intelligent-01': 354,
'use-01': 354,
'have-degree-91': 334,
'mean-01': 305,
'date-entity': 300,
'principle': 278,
'recommend-01': 257,
'fair-01': 256,
'develop-02': 249,
'system': 246,
'cause-01': 234,
'ensure-01': 233}
%% Cell type:code id: tags:
``` python
# Première initialisation des concepts AMR liés à FAIRNESS :
list_concept_tosee = ['fair-01', 'fairness', 'fairwash-01']
# Filtre pour l'affichage
list_relation_tosee = set([y for x in list_concept_tosee for y in stat_concept_relation[x] if stat_concept_relation[x][y] != 0])
# tmp = {x: {y.strip(): stat_concept_relation[x][y] for y in list_relation_tosee} for x in list_concept_tosee}
# print(tabulate(tmp.values(), showindex=list_concept_tosee, headers='keys', tablefmt='pipe'))
tmpbis = {y.strip(): {x: stat_concept_relation[x][y] for x in list_concept_tosee} for y in list_relation_tosee}
print(tabulate(tmpbis.values(), showindex=list_relation_tosee, headers='keys', tablefmt='pipe'))
```
%% Output
| | fair-01 | fairness | fairwash-01 |
|:-------------|----------:|-----------:|--------------:|
| :mod | 13 | 105 | 0 |
| :polarity | 58 | 42 | 0 |
| :topic | 0 | 10 | 0 |
| :li | 0 | 2 | 0 |
| :ARG0 | 5 | 0 | 1 |
| :ARG1 | 156 | 0 | 1 |
| :degree | 1 | 0 | 0 |
| :source | 0 | 1 | 0 |
| :prep-on | 0 | 1 | 0 |
| :beneficiary | 0 | 2 | 0 |
| :domain | 1 | 5 | 0 |
| :ARG3 | 1 | 1 | 0 |
| :quant | 0 | 1 | 0 |
| :manner | 5 | 6 | 1 |
| :location | 3 | 5 | 0 |
| :poss | 0 | 15 | 0 |
| :ARG2 | 6 | 0 | 0 |
| :ARG4 | 1 | 0 | 0 |
| :prep-in | 0 | 9 | 0 |
| :example | 0 | 1 | 0 |
| :condition | 6 | 0 | 0 |
| :time | 0 | 1 | 0 |
%% Cell type:markdown id: tags:
### **4.2) Analyse à parti AMR**
%% Cell type:markdown id: tags:
Nous nous interressons au voisinage de l'utilisation du mot fairness dans le graph AMR :
<pre style='font=font-family:Courier New, Courier, monospace;'>
=====
= P =
=====
/ \
V_tag / \ F_tag
/ \
===== =====
= V = = F =
===== =====
|
| E_tag
|
-------
| E |
| ... |
-------
</pre>
**Explications :**
- F : Le noeud où le concept de *fairness* apparait
- P : le concept parent
- V : le concept voisin, lié à *fairness* par le parent
- E : les concepts enfants
- x_tag : les tags AMR associés
### Recherche à faire :
<font color="red">Faire les statistiques puis analyser avec les précédents constats de notre analyse PosTag :
- P( P )
- P( F_tag )
- P( V )
- P( V \ P)
- P( V_tag, F_tag )
- P( E_tag )
- P( {E}=∅ ) : Fairness n'a pas d'enfant
- P( rang(E)=1 ) : Fairness n'a qu'un enfant
- P( rang(E)>1 ) : Fairness à plusieurs enfants
</font>
......@@ -45,8 +45,6 @@ import penman
import logging
logging.getLogger('penman').setLevel(logging.ERROR)
from metamorphosed.exception import ServerException
#from exception import ServerException
ONESPACE = re.compile("[ \n\t]+")
......@@ -152,7 +150,7 @@ class AMRsentence:
if rtc:
return rtc
except Exception as e:
raise ServerException('bad regular expression "%s": %s' % (regex, e))
raise Exception('bad regular expression "%s": %s' % (regex, e))
return [] #False
......@@ -164,7 +162,7 @@ class AMRsentence:
if rtc:
return rtc
except Exception as e:
raise ServerException('bad regular expression "%s": %s' % (regex, e))
raise Exception('bad regular expression "%s": %s' % (regex, e))
return [] #False
......@@ -175,7 +173,7 @@ class AMRsentence:
if rtc:
return True
except Exception as e:
raise ServerException('bad regular expression "%s": %s' % (regex, e))
raise Exception('bad regular expression "%s": %s' % (regex, e))
return False
......@@ -194,9 +192,9 @@ class AMRdoc:
self.sentences = []
self.ids = {} # id: sentence
self.fn = fn
if isinstance(fn, str):
ifp = open(fn)
ifp = open(fn, encoding='utf-8')
else:
# here fn is a opened file or sys.stdin etc
ifp = fn
......@@ -380,6 +378,10 @@ def relations_between_concepts(ads, depth=2):
objectconcepts[oclass] += 1
else:
objectconcepts[oclass] = 1
if concepts.get(None) != None:
concepts['_None'] = concepts.pop(None)
for c in sorted(concepts):
if depth == 1:
#print(c, concepts[c], sep="\t")
......@@ -398,6 +400,7 @@ def relations_between_concepts(ads, depth=2):
#print(" %s\t%s" % (oc, concepts[c][r][oc]))
output.append(" %s\t%s" % (oc, concepts[c][r][oc]))
# return concepts
return output
......@@ -493,7 +496,7 @@ def stats(ads, conceptlist, plotting=True, outdir="."):
def graph(dico, fn, mean, med, logscale=True):
# print(sorted(dico.values()))
plt.rcParams["font.family"] = "Lato"
# plt.rcParams["font.family"] = "Lato"
plt.rcParams["figure.figsize"] = [6.4, 2] # default 6.4, 4.8
plt.bar(range(len(dico)), sorted(dico.values(), reverse=True),
color="#ff7900")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment