Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • tiphaine.viard/mapaie
1 result
Show changes
Commits on Source (2)
%% 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>
%% Cell type:code id: tags:
``` python
# TEST TO SAVE IMAGE des graph AMR :
# self.aps = {} # parsed and possibly modified PENMAN AMRs
# # initial version of Penman graph
# for sentnum, cursentence in enumerate(self.amrdoc.sentences, start=1):
# if sentnum % 10 == 0:
# print("%d initialized" % sentnum, end="\r")
# ap = amreditor.AMRProcessor()
# self.aps[sentnum] = ap
# ap.lastpm = cursentence.amr
# ap.comments = cursentence.comments
# dataformat = 'png'
# for ix, x in enumerate(self.aps, 1):
# ap = self.aps[x]
# if not ap.isparsed:
# ap.readpenman(ap.lastpm)
# pm, svg, svg_canon = ap.show(format=dataformat)
# if svg:
# print("%d.%s" % (ix, dataformat), svg)
# # show()
# try:
# pm = penman.encode(penman.Graph(self.triples, top=self.top))
# self.readpenman(pm)
# self.lastsvg = self.dot(highlightinstances, highlightrelations, format=dataformat)
# self.lastsvg_canonised = self.dot(highlightinstances, highlightrelations, format=dataformat, inverse_of=True)
# self.isDisconnected = False
# except penman.exceptions.LayoutError:
# print("not yet correct")
# print(self.triples)
```
%% Cell type:code id: tags:
``` python
import metamorphosed.amreditor as amreditor
dataformat = 'png'
sentnum = 1
cursentence = amr_mapaie.sentences[0]
# for sentnum, cursentence in enumerate(amr_mapaie.sentences, start=1):
# pass
ap = amreditor.AMRProcessor()
ap.lastpm = cursentence.amr
ap.comments = cursentence.comments
if not ap.isparsed:
ap.readpenman(ap.lastpm)
ap.vars
```
%% Output
{'p': 'possible-01',
'f': 'facilitate-01',
'o': 'or',
'r': 'regulate-01',
'e': 'exist-01',
'r2': 'regulate-01',
'n': 'new-01',
'o2': 'or',
'a': 'accountable-02',
'a2': 'algorithm',
'f2': 'fair-01',
'a3': 'amr-unknown',
'f3': 'first-of-all'}
%% Cell type:code id: tags:
``` python
ap.triples
# 1- Vérifier values ap.vars == fairness et récupérer la clé (id)
# 2- Récupérer triplet F_tag (ap.triples[2]==id) (id_P, type_F_tag, id)
# 3- Sortir le parent P (ap.vars[id_P] => concept)
# 4- Sortir triplet V_tag (ap.triples[0]==id_P and ap.triples[1]!=':instance') (id_p, type_V_tag,id_V)
# 5- Sortir le voisin V (ap.vars[id_V] => concept)
# enfants_F = [x for x in ap.triples if x[0]==id and x[2]!=fearness]
# ids_E=[x[2] for x in enfants_F]
# 6- Nombre branche fairness : len(enfants_F)
# 7- concept enfant : [ap.vars[x] for x in ids_E]
# 8- Nb petit-enfant : len(ap.triples if x[0]==ids_E and != ap.vars[ids_E]|concept)
```
%% Output
[('p', ':instance', 'possible-01'),
('p', ':ARG1', 'f'),
('p', ':mod', 'f3'),
('f', ':instance', 'facilitate-01'),
('f', ':ARG0', 'o'),
('f', ':ARG1', 'o2'),
('f', ':manner', 'a3'),
('o', ':instance', 'or'),
('o', ':op1', 'r'),
('o', ':op2', 'r2'),
('r', ':instance', 'regulate-01'),
('r', ':ARG1-of', 'e'),
('e', ':instance', 'exist-01'),
('r2', ':instance', 'regulate-01'),
('r2', ':ARG1-of', 'n'),
('n', ':instance', 'new-01'),
('o2', ':instance', 'or'),
('o2', ':op1', 'a'),
('o2', ':op2', 'f2'),
('a', ':instance', 'accountable-02'),
('a', ':mod', 'a2'),
('a2', ':instance', 'algorithm'),
('f2', ':instance', 'fair-01'),
('a3', ':instance', 'amr-unknown'),
('f3', ':instance', 'first-of-all')]
......
This diff is collapsed.