import os import re import json import pickle import itertools import pandas as pd from simplemma import lemmatize def load_json(path): """ Load gazetteers from a file :param path: path to the gazetteer file :return: a dict of gazetteers """ with open(path, 'r') as file: data = json.load(file) return data def save_json(data, path): """ Save gazetteers to a file :param path: path to the gazetteer file :param gazetteers: a dict of gazetteers """ with open(path, 'w') as file: json.dump(data, file, indent=4) def merge_gazetteers(*gazetteers): """ Merge multiple gazetteer dictionaries into a single gazetteer dictionary. Returns: dict: A merged gazetteer dictionary containing all the keys and values from the input gazetteers. """ # Initialize a new dictionary to store merged results merged_gazetteers = {} # Iterate over each dictionary provided for gaz in gazetteers: # Iterate over each key and set in the current dictionary for key, value_set in gaz.items(): if key in merged_gazetteers: # If the key already exists in the result, union the sets merged_gazetteers[key] |= value_set else: # Otherwise, initialize the key with the set from the current dictionary merged_gazetteers[key] = value_set.copy() # Use copy to avoid mutating the original sets return merged_gazetteers #################################################################################################### ### PREPROCESSING OF GAZETTEERS ################################################################### #################################################################################################### def remove_all_brackets(text): return re.sub(r'[\(\{\[].*?[\)\}\]]', '', text) def lemmatizing(x): if x == "": return "" return lemmatize(x, lang="cs") def multi_lemmatizing(x): words = x.split(" ") phrase = "" for word in words: phrase += lemmatizing(word) + " " return phrase.strip() def build_reverse_dictionary(dictionary, apply_lemmatizing=False): reverse_dictionary = {} for key, values in dictionary.items(): for value in values: reverse_dictionary[value] = key if apply_lemmatizing: temp = lemmatizing(value) if temp != value: reverse_dictionary[temp] = key return reverse_dictionary def split_gazetteers_for_single_token_match(gazetteers): result = {} for k, v in gazetteers.items(): result[k] = set([x for xs in [vv.split(" ") for vv in v] for x in xs]) result[k] = {x for x in result[k] if len(x) > 2} return result def preprocess_gazetteers(gazetteers, config): if config["remove_brackets"]: for k, values in gazetteers.items(): gazetteers[k] = {remove_all_brackets(vv).strip() for vv in values if len(remove_all_brackets(vv).strip()) > 2} if config["split_person"]: gazetteers["per"].update(set([x for x in list(itertools.chain(*[v.split(" ") for v in gazetteers["per"]])) if len(x) > 2])) if config["techniq_for_matching"] == "single": gazetteers = split_gazetteers_for_single_token_match(gazetteers) if config["lemmatize"]: for k, values in gazetteers.items(): gazetteers[k] = set(list(itertools.chain(*[(vv, lemmatizing(vv)) for vv in values if len(vv) > 2]))) elif config["lemmatize"]: for k, values in gazetteers.items(): gazetteers[k] = set(list(itertools.chain(*[(value, multi_lemmatizing(value)) for value in values if len(value) > 2]))) if config["remove_numeric"]: for k, values in gazetteers.items(): gazetteers[k] = {vv for vv in values if not vv.isnumeric()} for k, values in gazetteers.items(): gazetteers[k] = list(values) return gazetteers def load_json_as_pickle(json_path, pickle_path): """ Load data from a JSON file and save it as a pickle file. Parameters: json_path (str): Path to the JSON file. pickle_path (str): Path where the pickle file will be saved. """ # Load data from the JSON file with open(json_path, 'r') as file: data = json.load(file) # Save data to a pickle file with open(pickle_path, 'wb') as file: pickle.dump(data, file) print(f"Data from {json_path} has been loaded and saved as a pickle file at {pickle_path}.")