-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWEAT-Experiments.py
257 lines (187 loc) · 11.4 KB
/
WEAT-Experiments.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
from WEAT import call
import wordSets as ws
import logging, os, util
from gensim.models import KeyedVectors
'''
WEAT execution on predefined word sets from previous literature on several different models.
The model can be loaded by the "load_model" script or manually alternatively.
The functions below are organised by source.
'''
########################################################################################################################
########################################################################################################################
def greenwald(model, m_name, lower=False):
"""
Conduct all WEAT comparisons of the nosek_harvest paper on the given model and save it in a text file in directory
:param model: Model to conduct the experiment
:param m_name: Model tag
:return: None
"""
file = open('./OUT_weat/greenwald/' + m_name + '#greenwaldB.txt', 'w')
print(lower)
print('#######################')
# Experiment 1
#file.writelines(call(model, ws.gw_flow, ws.gw_insec, ws.gw_pos, ws.gw_neg, 'gw_flowInsec', lower_case=lower))
#file.writelines(call(model, ws.gw_instr, ws.gw_weapon, ws.gw_pos, ws.gw_neg, 'gw_instrWeap_posneg', lower_case=lower))
# Experiment 2
file.writelines(call(model, ws.gw_Korean_names, ws.gw_Japanese_names, ws.gw_pos, ws.gw_neg, 'gw_japaneseKorean', lower_case=lower))
file.writelines(call(model, ws.gw_Korean_names, ws.gw_Truncated_Japanese_names, ws.gw_pos, ws.gw_neg, 'gw_japaneseKorean_truncted', lower_case=lower))
# Experiment 3
file.writelines(call(model, ws.gw_White_American_male_names, ws.gw_Black_American_male_names, ws.gw_pos, ws.gw_neg, 'gw_blackWhite_male', lower_case=lower))
file.writelines(call(model, ws.gw_White_American_female_names, ws.gw_Black_American_female_names, ws.gw_pos, ws.gw_neg, 'gw_blackWhite_female', lower_case=lower))
file.writelines(call(model, ws.European_American, ws.African_American, ws.gw_pos, ws.gw_neg, 'gw_blackWhite_MF', lower_case=lower))
file.close()
def greenwald_asian(model, m_name, lower=False): # Experiment 2
file = open('./OUT_weat/' + m_name + '#greenwald_asianNames.txt', 'w')
korean = [name for name in ws.gw_Korean_names] #if name in model]
japanese = [name for name in ws.gw_Japanese_names] # if name in model]
japanese_t = [name for name in ws.gw_Truncated_Japanese_names] # if list in model]
if korean and japanese:
file.writelines(call(model, korean, japanese, ws.gw_pos, ws.gw_neg, 'gw_japaneseKorean', lower_case=lower))
else:
logging.error('korean or japanese empty')
if korean and japanese_t:
file.writelines(call(model, korean, japanese_t, ws.gw_pos, ws.gw_neg, 'gw_japaneseKorean_truncted', lower_case=lower))
else:
logging.error('japanese truncated empty')
file.close()
def greenwald_black_white(model, m_name, lower=False): # Experiment 3
file = open('./OUT_weat/' + m_name + '#greenwald_blackWhite.txt', 'w')
white_m = [x for x in ws.gw_White_American_male_names] # if x in model]
white_f = [x for x in ws.gw_White_American_female_names] # if x in model]
black_m = [x for x in ws.gw_Black_American_male_names] # if x in model]
black_f = [x for x in ws.gw_Black_American_female_names] # if x in model]
white = white_f + white_m
black = black_f + black_m
file.writelines(call(model, white_m, black_m, ws.gw_pos, ws.gw_neg, 'gw_blackWhite_male', lower_case=lower))
file.writelines(call(model, white_f, black_m, ws.gw_pos, ws.gw_neg, 'gw_blackWhite_female', lower_case=lower))
file.writelines(call(model, white, black, ws.gw_pos, ws.gw_neg, 'gw_blackWhite_MF', lower_case=lower))
file.close()
########################################################################################################################
########################################################################################################################
def nosek(model, m_name, lower=False):
"""
Conduct all WEAT comparisons of the nosek paper on the given model and save it in a text file in directory
:param model: Model to conduct the experiment
:param m_name: Model tag
:return: None
"""
file = open('./OUT_weat/nosek/' + m_name + '#nosek.txt', 'w')
pleasant_all = list(set(ws.Pleasant_1 + ws.Pleasant_2 + ws.Pleasant_3))
unpleasant_all = ws.Unpleasant_1 + ws.Unpleasant_2 + ws.Unpleasant_3
math = list(set(ws.Mathematics + ws.Mathematics_2 + ws.Science))
arts = list(set(ws.Language + ws.Arts))
# Math - attitude
n_ma_1 = call(model, math, arts, pleasant_all, unpleasant_all, 'nosek_MAcombi_PosNegcombi', lower_case=lower)
n_ma_2 = call(model, ws.Mathematics, ws.Arts, pleasant_all, unpleasant_all, 'nosek_MA_PosNegcombi', lower_case=lower)
# Math -identity
n_mi_1 = call(model, math, arts, ws.harvest_self, ws.harvest_other, 'nosek_MIcombi_SelfOther', lower_case=lower)
n_mi_2 = call(model, ws.Mathematics, ws.Arts, ws.harvest_self, ws.harvest_other, 'nosek_MI_SelfOther', lower_case=lower)
# Math-gender stereotype
n_gs_1 = call(model, math, arts, ws.Masculine, ws.Feminine, 'nosek_GScombi_MF', lower_case=lower)
n_gs_2 = call(model, ws.Mathematics, ws.Arts, ws.Masculine, ws.Feminine, 'nosek_GS_MF', lower_case=lower)
for res in [n_ma_1, n_ma_2, n_mi_1, n_mi_2, n_gs_1, n_gs_2]:
file.writelines(res)
file.close()
return False
def nosek_harvest(model, m_name, lower=False):
"""
Conduct all WEAT comparisons of the nosek_harvest paper on the given model and save it in a text file in directory
:param model: Model to conduct the experiment
:param m_name: Model tag
:return: None
"""
file = open('./OUT_weat/nosek_harvest/' + m_name + '#nosek_harvest.txt', 'w')
# Race attitude
file.writelines(call(model, ws.harvest_white, ws.harvest_black, ws.harvest_good, ws.harvest_bad, 'race', lower_case=lower))
# Age attitude
file.writelines(call(model, ws.harvest_young, ws.harvest_old, ws.harvest_good, ws.harvest_bad, 'age', lower_case=lower))
# (c) gender– career stereotype, measuring the association of male-female terms with career and family terms
file.writelines(call(model, ws.harvest_m, ws.harvest_f, ws.harvest_career, ws.harvest_family, 'gendercareer_N', lower_case=lower))
file.writelines(call(model, ws.harvest_mII, ws.harvest_fII, ws.harvest_career, ws.harvest_family, 'gendercareer_T', lower_case=lower))
# (d) gender–science stereotype, measuring the association of male-female terms with science and liberal arts terms
file.writelines(call(model, ws.harvest_m, ws.harvest_f, ws.harvest_science, ws.harvest_libArts, 'Science_N', lower_case=lower))
file.writelines(call(model, ws.harvest_mII, ws.harvest_fII, ws.harvest_science, ws.harvest_libArts, 'Science_T', lower_case=lower))
# (e) self-esteem, measuring attitudes toward self versus other
file.writelines(call(model, ws.harvest_self, ws.harvest_other, ws.harvest_good, ws.harvest_bad, 'selfEsteem', lower_case=lower))
# (f) math–arts attitude;
file.writelines(call(model, ws.harvest_arts, ws.harvest_math, ws.harvest_good, ws.harvest_bad, 'Math', lower_case=lower))
file.writelines(call(model, ws.harvest_m, ws.harvest_f, ws.harvest_math, ws.harvest_arts, 'Math_N', lower_case=lower))
file.writelines(call(model, ws.harvest_mII, ws.harvest_fII, ws.harvest_math, ws.harvest_arts, 'Math_T', lower_case=lower))
file.close()
def monteith_pettit(model, m_name, lower=False):
"""
Conduct all WEAT comparisons of the mp paper on the given model and save it in a text file in directory
:param model: Model to conduct the experiment
:param m_name: Model tag
:return: None
"""
mp = open('./OUT_weat/mp/' + m_name + '#mp', 'w')
depressed = ws.mp_depressed
physic_ill = ws.mp_physic_ill
permanent = ws.mp_permanent
temp = ws.mp_temporary
#depressed = [x for x in ws.mp_depressed if x in model]
#physic_ill = [x for x in ws.mp_physic_ill if x in model]
#delete = ['delete: '] + [x for x in ws.mp_depressed+ws.mp_physic_ill if x not in model]
#permanent = [x for x in ws.mp_permanent if x in model]
#temp = [x for x in ws.mp_temporary if x in model]
#delete.extend(x for x in ws.mp_permanent if x not in model)
#delete.extend(x for x in ws.mp_temporary if x not in model)
#print(delete)
#mp.writelines(delete)
mp.writelines(call(model, depressed, physic_ill, permanent, temp, 'mp_stability', lower_case=lower))
mp.writelines(call(model, depressed, physic_ill, ws.mp_controllable, ws.mp_uncontrollable, 'mp_controllability', lower_case=lower))
mp.writelines(call(model, depressed, physic_ill, ws.mp_mental, ws.mp_physical, 'mp_etiology', lower_case=lower))
mp.writelines(call(model, depressed, physic_ill, ws.mp_good, ws.mp_bad, 'mp_stability', lower_case=lower))
mp.close()
def monteith_pettit_reverse(model, m_name, lower=False):
"""
Conduct all WEAT comparisons of the mp paper on the given model and save it in a text file in directory
:param model: Model to conduct the experiment
:param m_name: Model tag
:return: None
"""
mp = open('./OUT_weat/mp/' + m_name + '#mp', 'w')
depressed = ws.mp_depressed
physic_ill = ws.mp_physic_ill
permanent = ws.mp_permanent
temp = ws.mp_temporary
mp.writelines(call(model, permanent, temp, depressed, physic_ill, 'mpR_stability', lower_case=lower))
mp.writelines(call(model, ws.mp_controllable, ws.mp_uncontrollable, depressed, physic_ill,'mpR_controllability', lower_case=lower))
mp.writelines(call(model, ws.mp_mental, ws.mp_physical, depressed, physic_ill, 'mpR_etiology', lower_case=lower))
mp.writelines(call(model, ws.mp_good, ws.mp_bad, depressed, physic_ill, 'mpR_stability', lower_case=lower))
mp.close()
good = ws.harvest_good + ws.mp_good + ws.gw_pos
bad = ws.harvest_bad + ws.mp_bad + ws.gw_neg
black = ws.harvest_black + ws.gw_Black_American_male_names + ws.gw_Black_American_female_names
white = ws.harvest_white + ws.gw_White_American_male_names + ws.gw_White_American_female_names
def do_all(model, m_name, lower=False):
print('lower', lower)
#greenwald(model, m_name, lower)
#greenwald_black_white(model, m_name, lower)
#greenwald_asian(model, m_name, lower)
#nosek(model, m_name, lower)
nosek_harvest(model, m_name, lower)
#monteith_pettit(model, m_name, lower)
os.system('spd-say "calculation finished"')
def exe_all_models():
# m = KeyedVectors.load_word2vec_format('./models/modelsGoogle/GoogleNews-vectors-negative300.bin', binary=True)
# do_all(m, 'Goo_stan', lower=False)
# logging.info('googleStan done')
# m = KeyedVectors.load_word2vec_format('./models/modelsGoogle/word2vec-slim/GoogleNews-vectors-negative300-SLIM.bin', binary=True)
# do_all(m, 'Goo_slim', lower=False)
# logging.info('googleSlim done')
models = util.get_all_model_tags()
CBOW = models[0]
SG = models[1]
for elem in CBOW:
nosek_harvest(KeyedVectors.load(elem[1]), 'CB_' + elem[0], lower=True)
for elem in SG:
nosek_harvest(KeyedVectors.load(elem[1]), 'SG_' + elem[0], lower=True)
# for elem in CBOW:
# do_all(KeyedVectors.load(elem[1]), 'CB_' + elem[0], lower=True)
# for elem in SG:
# do_all(KeyedVectors.load(elem[1]), 'SG_' + elem[0], lower=True)
exe_all_models()
# nosek(KeyedVectors.load('./models/models/SG//Afr_sla_5'), 'TEST_Afr_sla_5', lower=True)
os.system('spd-say "calculation finished"')