Skip to content

Commit dafc754

Browse files
committed
include wikidata metadata in uk-new corpus
1 parent 268b52c commit dafc754

1 file changed

Lines changed: 89 additions & 3 deletions

File tree

backend/corpora/parliament/uk-new.py

Lines changed: 89 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,64 @@ def lookup_person_atttribute_date(lookup_tuple):
104104
return date_string[:10]
105105
else:
106106
return None
107+
108+
def find_current_positions(metadata_dict, date):
109+
current_positions = {}
110+
for person in metadata_dict:
111+
current_position_list = []
112+
for position in metadata_dict[person]['positions']:
113+
if 'startTime' in position and 'endTime' in position:
114+
try:
115+
date_range = (datetime.strptime(position['startTime'][:10], "%Y-%m-%d"),
116+
datetime.strptime(position['endTime'][:10], "%Y-%m-%d"))
117+
except ValueError:
118+
continue #disregard missing dates
119+
if date_range[0] < datetime.strptime(date, "%Y-%m-%d") < date_range[1]:
120+
current_position_list.append(position)
121+
elif 'startTime' in position:
122+
current_position_list.append(position)
123+
current_positions[person] = current_position_list
124+
return current_positions
125+
126+
127+
def lookup_current_ministerial_position(lookup_tuple):
128+
positions_dict, id, name = lookup_tuple
129+
id = id.split('/')[-1] if id else None
130+
if id in positions_dict:
131+
for position in positions_dict[id]:
132+
if position['minister']:
133+
return position['positionLabel']
134+
return None
135+
136+
def get_current_positions(positions_dict, id):
137+
id = id.split('/')[-1] if id else None
138+
if id and id in positions_dict:
139+
return positions_dict[id]
140+
else:
141+
return []
142+
143+
144+
def lookup_current_parliamentary_position(lookup_tuple):
145+
positions_dict, id, name = lookup_tuple
146+
current_positions = get_current_positions(positions_dict, id)
147+
for position in current_positions:
148+
if position['member_parliament']:
149+
return position['positionLabel']
150+
return None
151+
152+
def lookup_current_party(lookup_tuple):
153+
positions_dict, id, name = lookup_tuple
154+
current_positions = get_current_positions(positions_dict, id)
155+
if current_positions:
156+
for position in current_positions:
157+
if 'partyLabel' in position:
158+
return position['partyLabel']
159+
elif 'partyBackupLabel' in position:
160+
return position['partyBackupLabel']
161+
else:
162+
continue
163+
else:
164+
return None
107165

108166
class ParliamentUKNew(Parliament, XMLCorpusDefinition):
109167
title = 'Talking Empire (UK 2022-2025)'
@@ -124,7 +182,7 @@ class ParliamentUKNew(Parliament, XMLCorpusDefinition):
124182

125183
def sources(self, start: datetime, end: datetime):
126184
metadata = {}
127-
with open(os.path.join(self.data_directory, 'all_person_metadata_twfy_keys.json'), 'r', encoding='utf-8') as file:
185+
with open(os.path.join(self.data_directory, 'merged_metadata_twfy_keys.json'), 'r', encoding='utf-8') as file:
128186
all_person_metadata = json.load(file)
129187

130188
for directory in [dir for dir in Path(self.data_directory).iterdir() if dir.is_dir()]:
@@ -140,6 +198,8 @@ def sources(self, start: datetime, end: datetime):
140198
for id in metadata['speaker_ids']:
141199
if id in all_person_metadata:
142200
metadata['speaker_metadata'][id] = all_person_metadata[id]
201+
metadata['current_positions'] = find_current_positions(metadata['speaker_metadata'], metadata['date'])
202+
143203
yield str(full_path), metadata
144204

145205
_speech_id_extractor = Cache(XML(attribute='id'))
@@ -255,7 +315,32 @@ def sources(self, start: datetime, end: datetime):
255315
Constant('wikidata_uri'),
256316
transform=lookup_person_attribute
257317
)
258-
318+
319+
ministerial_role = field_defaults.ministerial_role()
320+
ministerial_role.extractor = Combined(
321+
Metadata('current_positions'),
322+
XML(attribute='person_id'),
323+
XML(attribute='speakername'),
324+
transform=lookup_current_ministerial_position
325+
)
326+
ministerial_role.search_filter.option_count = 45
327+
328+
parliamentary_role = field_defaults.parliamentary_role()
329+
parliamentary_role.extractor = Combined(
330+
Metadata('current_positions'),
331+
XML(attribute='person_id'),
332+
XML(attribute='speakername'),
333+
transform=lookup_current_parliamentary_position
334+
)
335+
336+
party = field_defaults.party()
337+
party.extractor = Combined(
338+
Metadata('current_positions'),
339+
XML(attribute='person_id'),
340+
XML(attribute='speakername'),
341+
transform=lookup_current_party
342+
)
343+
259344
topic = field_defaults.topic()
260345
topic.extractor = Combined(
261346
_speech_id_extractor,
@@ -286,5 +371,6 @@ def __init__(self):
286371
self.speaker, self.speaker_id,
287372
self.speaker_gender, self.speaker_birthdate,
288373
self.speaker_deathdate, self.speaker_birthplace,
289-
self.speaker_wikidata,
374+
self.speaker_wikidata, self.ministerial_role,
375+
self.parliamentary_role, self.party
290376
]

0 commit comments

Comments
 (0)