| | import os
|
| | import sys
|
| | from tqdm import tqdm
|
| | from typing import List
|
| |
|
| |
|
| | def concat_data(
|
| | data_dir: str,
|
| | out_dir: str,
|
| | lang_pair_list: List[List[str]],
|
| | out_src_lang: str = "SRC",
|
| | out_tgt_lang: str = "TGT",
|
| | split: str = "train",
|
| | ):
|
| | """
|
| | Concatenate data files from different language pairs and writes the output to a specified directory.
|
| |
|
| | Args:
|
| | data_dir (str): path of the directory containing the data files for language pairs.
|
| | out_dir (str): path of the directory where the output files will be saved.
|
| | lang_pair_list (List[List[str]]): a list of language pairs, where each pair is a list of two strings.
|
| | out_src_lang (str, optional): suffix to use for the source language (default: "SRC").
|
| | out_tgt_lang (str, optional): suffix to use for the source language (default: "TGT").
|
| | split (str, optional): name of the split (e.g. "train", "dev", "test") to concatenate (default: "train").
|
| | """
|
| | os.makedirs(out_dir, exist_ok=True)
|
| |
|
| | out_src_fname = os.path.join(out_dir, f"{split}.{out_src_lang}")
|
| | out_tgt_fname = os.path.join(out_dir, f"{split}.{out_tgt_lang}")
|
| |
|
| | print()
|
| | print(out_src_fname)
|
| | print(out_tgt_fname)
|
| |
|
| |
|
| | if os.path.isfile(out_src_fname):
|
| | os.unlink(out_src_fname)
|
| | if os.path.isfile(out_tgt_fname):
|
| | os.unlink(out_tgt_fname)
|
| |
|
| | for src_lang, tgt_lang in tqdm(lang_pair_list):
|
| | print("src: {}, tgt:{}".format(src_lang, tgt_lang))
|
| |
|
| | in_src_fname = os.path.join(data_dir, f"{src_lang}-{tgt_lang}", f"{split}.{src_lang}")
|
| | in_tgt_fname = os.path.join(data_dir, f"{src_lang}-{tgt_lang}", f"{split}.{tgt_lang}")
|
| |
|
| | if not os.path.exists(in_src_fname) or not os.path.exists(in_tgt_fname):
|
| | continue
|
| |
|
| | print(in_src_fname)
|
| | os.system("cat {} >> {}".format(in_src_fname, out_src_fname))
|
| |
|
| | print(in_tgt_fname)
|
| | os.system("cat {} >> {}".format(in_tgt_fname, out_tgt_fname))
|
| |
|
| | corpus_stats(data_dir, out_dir, lang_pair_list, split)
|
| |
|
| |
|
| | def corpus_stats(data_dir: str, out_dir: str, lang_pair_list: List[List[str]], split: str):
|
| | """
|
| | Computes statistics for the given language pairs in a corpus and
|
| | writes the results to a file in the output directory.
|
| |
|
| | Args:
|
| | data_dir (str): path of the directory containing the corpus data.
|
| | out_dir (str): path of the directory where the output file should be written.
|
| | lang_pair_list (List[List[str]]): a list of language pairs as lists of strings in the form "`[src_lang, tgt_lang]`".
|
| | split (str): a string indicating the split (e.g. 'train', 'dev', 'test') of the corpus to consider.
|
| | """
|
| | meta_fname = os.path.join(out_dir, f"{split}_lang_pairs.txt")
|
| | with open(meta_fname, "w", encoding="utf-8") as lp_file:
|
| |
|
| | for src_lang, tgt_lang in tqdm(lang_pair_list):
|
| | print("src: {}, tgt:{}".format(src_lang, tgt_lang))
|
| |
|
| | in_src_fname = os.path.join(data_dir, f"{src_lang}-{tgt_lang}", f"{split}.{src_lang}")
|
| | if not os.path.exists(in_src_fname):
|
| | continue
|
| |
|
| | print(in_src_fname)
|
| |
|
| | corpus_size = 0
|
| | with open(in_src_fname, "r", encoding="utf-8") as infile:
|
| | corpus_size = sum(map(lambda x: 1, infile))
|
| |
|
| | lp_file.write(f"{src_lang}\t{tgt_lang}\t{corpus_size}\n")
|
| |
|
| |
|
| | if __name__ == "__main__":
|
| |
|
| | in_dir = sys.argv[1]
|
| | out_dir = sys.argv[2]
|
| | split = sys.argv[3]
|
| | lang_pair_list = []
|
| |
|
| | pairs = os.listdir(in_dir)
|
| | for pair in pairs:
|
| | src_lang, tgt_lang = pair.split("-")
|
| | lang_pair_list.append([src_lang, tgt_lang])
|
| |
|
| | concat_data(in_dir, out_dir, lang_pair_list, split=split)
|
| |
|