Spaces:
Running
Running
Oskar van der Wal
commited on
Commit
•
97a1414
1
Parent(s):
6e551eb
First initial commit
Browse files- README.md +6 -7
- app.py +148 -0
- contrastive_pair.md +1 -0
- description.md +9 -0
- notice.md +8 -0
- simple_translation.md +5 -0
README.md
CHANGED
@@ -1,13 +1,12 @@
|
|
1 |
---
|
2 |
-
title:
|
3 |
-
emoji:
|
4 |
-
colorFrom:
|
5 |
-
colorTo:
|
6 |
sdk: gradio
|
7 |
-
sdk_version: 3.
|
8 |
app_file: app.py
|
9 |
pinned: false
|
10 |
-
license: mit
|
11 |
---
|
12 |
|
13 |
-
|
|
|
1 |
---
|
2 |
+
title: Bias in MT
|
3 |
+
emoji: 🌍
|
4 |
+
colorFrom: yellow
|
5 |
+
colorTo: indigo
|
6 |
sdk: gradio
|
7 |
+
sdk_version: 3.3
|
8 |
app_file: app.py
|
9 |
pinned: false
|
|
|
10 |
---
|
11 |
|
12 |
+
A demo showing how gender bias could manifest in MT models when translating from Hungarian to English.
|
app.py
ADDED
@@ -0,0 +1,148 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio
|
2 |
+
import inseq
|
3 |
+
from inseq.data.aggregator import AggregatorPipeline, SubwordAggregator, SequenceAttributionAggregator, PairAggregator
|
4 |
+
import torch
|
5 |
+
|
6 |
+
if torch.cuda.is_available():
|
7 |
+
DEVICE = "cuda"
|
8 |
+
else:
|
9 |
+
DEVICE = "cpu"
|
10 |
+
|
11 |
+
def swap_pronoun(sentence):
|
12 |
+
if "He" in sentence:
|
13 |
+
return sentence.replace("He", "She")
|
14 |
+
elif "She" in sentence:
|
15 |
+
return sentence.replace("She", "He")
|
16 |
+
else:
|
17 |
+
return sentence
|
18 |
+
|
19 |
+
def run_counterfactual(occupation):
|
20 |
+
occupation = occupation.split(" (")[0]
|
21 |
+
|
22 |
+
model_name = f"Helsinki-NLP/opus-mt-hu-en"
|
23 |
+
|
24 |
+
# "egy" means something like "a", but is used less frequently than in English.
|
25 |
+
#source = f"Ő egy {occupation}."
|
26 |
+
source = f"Ő {occupation}."
|
27 |
+
|
28 |
+
model = inseq.load_model(model_name, "integrated_gradients")
|
29 |
+
model.device = DEVICE
|
30 |
+
target = model.generate(source)[0]
|
31 |
+
#target_modified = swap_pronoun(target)
|
32 |
+
|
33 |
+
out = model.attribute(
|
34 |
+
[
|
35 |
+
source,
|
36 |
+
source,
|
37 |
+
],
|
38 |
+
[
|
39 |
+
#target,
|
40 |
+
#target_modified,
|
41 |
+
target.replace("She", "He"),
|
42 |
+
target.replace("He", "She"),
|
43 |
+
],
|
44 |
+
n_steps=150,
|
45 |
+
return_convergence_delta=False,
|
46 |
+
attribute_target=False,
|
47 |
+
step_scores=["probability"],
|
48 |
+
internal_batch_size=100,
|
49 |
+
include_eos_baseline=False,
|
50 |
+
device=DEVICE,
|
51 |
+
)
|
52 |
+
#out = model.attribute(source, attribute_target=False, n_steps=150, device=DEVICE, return_convergence_delta=False, step_scores=["probability"])
|
53 |
+
|
54 |
+
squeezesum = AggregatorPipeline([SubwordAggregator, SequenceAttributionAggregator])
|
55 |
+
masculine = out.sequence_attributions[0].aggregate(aggregator=squeezesum)
|
56 |
+
feminine = out.sequence_attributions[1].aggregate(aggregator=squeezesum)
|
57 |
+
|
58 |
+
return masculine.show(aggregator=PairAggregator, paired_attr=feminine, return_html=True, display=True)
|
59 |
+
#return out.show(return_html=True, display=True)
|
60 |
+
|
61 |
+
def run_simple(occupation, lang, aggregate):
|
62 |
+
occupation = occupation.split(" (")[0]
|
63 |
+
|
64 |
+
model_name = f"Helsinki-NLP/opus-mt-hu-{lang}"
|
65 |
+
|
66 |
+
# "egy" means something like "a", but is used less frequently than in English.
|
67 |
+
#source = f"Ő egy {occupation}."
|
68 |
+
source = f"Ő {occupation}."
|
69 |
+
|
70 |
+
model = inseq.load_model(model_name, "integrated_gradients")
|
71 |
+
out = model.attribute([source], attribute_target=True, n_steps=150, device=DEVICE, return_convergence_delta=False)
|
72 |
+
|
73 |
+
if aggregate:
|
74 |
+
squeezesum = AggregatorPipeline([SubwordAggregator, SequenceAttributionAggregator])
|
75 |
+
return out.show(return_html=True, display=True, aggregator=squeezesum)
|
76 |
+
else:
|
77 |
+
return out.show(return_html=True, display=True)
|
78 |
+
|
79 |
+
with open("description.md") as fh:
|
80 |
+
desc = fh.read()
|
81 |
+
|
82 |
+
with open("simple_translation.md") as fh:
|
83 |
+
simple_translation = fh.read()
|
84 |
+
|
85 |
+
with open("contrastive_pair.md") as fh:
|
86 |
+
contrastive_pair = fh.read()
|
87 |
+
|
88 |
+
with open("notice.md") as fh:
|
89 |
+
notice = fh.read()
|
90 |
+
|
91 |
+
OCCUPATIONS = [
|
92 |
+
"nő (woman)",
|
93 |
+
"férfi (man)",
|
94 |
+
"nővér (nurse)",
|
95 |
+
"tudós (scientist)",
|
96 |
+
"mérnök (engineer)",
|
97 |
+
"pék (baker)",
|
98 |
+
"tanár (teacher)",
|
99 |
+
"esküvőszervező (wedding organizer)",
|
100 |
+
"vezérigazgató (CEO)",
|
101 |
+
]
|
102 |
+
|
103 |
+
LANGS = [
|
104 |
+
"en",
|
105 |
+
"fr",
|
106 |
+
"de",
|
107 |
+
]
|
108 |
+
|
109 |
+
with gradio.Blocks(title="Gender Bias in MT: Hungarian to English") as iface:
|
110 |
+
gradio.Markdown(desc)
|
111 |
+
|
112 |
+
print(simple_translation)
|
113 |
+
with gradio.Accordion("Simple translation", open=True):
|
114 |
+
gradio.Markdown(simple_translation)
|
115 |
+
|
116 |
+
with gradio.Accordion("Contrastive pair", open=False):
|
117 |
+
gradio.Markdown(contrastive_pair)
|
118 |
+
|
119 |
+
gradio.Markdown("**Does the model seem to rely on gender stereotypes in its translations?**")
|
120 |
+
|
121 |
+
with gradio.Tab("Simple translation"):
|
122 |
+
with gradio.Row(equal_height=True):
|
123 |
+
with gradio.Column(scale=4):
|
124 |
+
occupation_sel = gradio.Dropdown(label="Occupation", choices=OCCUPATIONS, value=OCCUPATIONS[0])
|
125 |
+
with gradio.Column(scale=4):
|
126 |
+
target_lang = gradio.Dropdown(label="Target Language", choices=LANGS, value=LANGS[0])
|
127 |
+
aggregate_subwords = gradio.Radio(
|
128 |
+
["yes", "no"], label="Aggregate subwords?", value="yes"
|
129 |
+
)
|
130 |
+
but = gradio.Button("Translate & Attribute")
|
131 |
+
out = gradio.HTML()
|
132 |
+
args = [occupation_sel, target_lang, aggregate_subwords]
|
133 |
+
but.click(run_simple, inputs=args, outputs=out)
|
134 |
+
|
135 |
+
with gradio.Tab("Contrastive pair"):
|
136 |
+
with gradio.Row(equal_height=True):
|
137 |
+
with gradio.Column(scale=4):
|
138 |
+
occupation_sel = gradio.Dropdown(label="Occupation", choices=OCCUPATIONS, value=OCCUPATIONS[0])
|
139 |
+
but = gradio.Button("Translate & Attribute")
|
140 |
+
out = gradio.HTML()
|
141 |
+
args = [occupation_sel]
|
142 |
+
but.click(run_counterfactual, inputs=args, outputs=out)
|
143 |
+
|
144 |
+
with gradio.Accordion("Notes & References", open=False):
|
145 |
+
gradio.Markdown(notice)
|
146 |
+
|
147 |
+
|
148 |
+
iface.launch()
|
contrastive_pair.md
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
This example is very similar to the **Simple translation** example, but now we ask how the model's behaviour would change if we change the translation of “ő” from “he” to “she”? The `probability` row at the bottom shows the difference in the probability between both versions of the translation.
|
description.md
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Gender Bias in MT: Hungarian to English
|
2 |
+
|
3 |
+
The Hungarian language has no grammatical gender and words like “he” and “she” are both translated as “ő”.
|
4 |
+
This makes it an interesting language to study gender bias in machine translation (MT) models, when translating to another language that does distinguish between “he” and “she”.
|
5 |
+
In this demo, we will test the OPUS-MT models (Tiedemann & Thottingal, 2020) from the *Language Technology Research Group at the University of Helsinki* ([Helsinki-NLP](https://github.com/Helsinki-NLP)).
|
6 |
+
|
7 |
+
For each translation, we also use the [Inseq library](https://github.com/inseq-team/inseq) to compute the feature attributions with integrated gradients: How important is each token in the source (Hungarian) for the translation of the target tokens (English)?
|
8 |
+
|
9 |
+
⚠️ Please note that this demo is just an illustration of how gender bias could manifest in MT models, but an actual assessment of its bias requires a more rigourous experiment.
|
notice.md
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
The idea for testing the gender bias in translations from Hungarian to English comes from Farkas and Németh (2022).
|
2 |
+
|
3 |
+
### References:
|
4 |
+
[Inseq: Intepretability for Sequence Generation Models 🔍](https://github.com/inseq-team/inseq). GitHub.
|
5 |
+
|
6 |
+
Tiedemann, J., & Thottingal, S. (2020). [OPUS-MT — Building open translation services for the World](https://helda.helsinki.fi/handle/10138/327852). Proceedings of the 22nd Annual Conferenec of the European Association for Machine Translation (EAMT).
|
7 |
+
|
8 |
+
Farkas, A., & Németh, R. (2022). [How to measure gender bias in machine translation: Real-world oriented machine translators, multiple reference points](https://www.sciencedirect.com/science/article/pii/S2590291121001352). Social Sciences & Humanities Open, 5(1), 100239.
|
simple_translation.md
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Select an occupation (or the word “woman”/“man”) from the dropdown menu and press `Translate & Attribute` to translate a sentence like “He/She is a nurse” from Hungarian:
|
2 |
+
|
3 |
+
> Ő nővér.
|
4 |
+
|
5 |
+
Which pronouns (“she”/“he”) do the MT models go for? Does it change depending on the occupation term you choose? And can we find a difference between the target languages (you can change it in the other dropdown menu on the right)?
|