liyongsea / parallel_corpus_mnbvc

parallel corpus dataset from the mnbvc project
Apache License 2.0
11 stars 6 forks source link

【语料格式升级】老语料升级成新的语料 #90

Open voidf opened 3 weeks ago

voidf commented 3 weeks ago
  1. 需要有人Review,把PR merge掉,看看是代码转换脚本有没有问题,是否所有之前做过的语料都能跑通,并且转换为此pr里面的新格式

先分给如来

voidf commented 2 weeks ago

实际数据发现,有的段落是空段落,有的段落一整段的所有语种都是同一个字符串,这两种情况下收录段落没有意义,现提供一个简易脚本过滤旧版语料的这两种情况。

# 去掉老版本语料中,整段为空,或者整段中含有文本的,文本全都一样的段落,不会更新段落数,低质量段落数等
# 不考虑扩展字段,扩展字段内含有有意义文本的不应该使用本脚本
import argparse
import json
import copy
from pathlib import Path

LANG_SET = [
    "it_text",
    "zh_text",
    "en_text",
    "ar_text",
    "nl_text",
    "de_text",
    "eo_text",
    "fr_text",
    "he_text",
    "ja_text",
    "pt_text",
    "ru_text",
    "es_text",
    "sv_text",
    "ko_text",
    "th_text",
    "id_text",
    "cht_text",
    "vi_text",
]

def process_file(ifilename: Path):
    print(f"input file: {ifilename.absolute()}")
    ofilename = ifilename.parent / (ifilename.stem + "_dedup" + ifilename.suffix)
    with open(ifilename, 'r', encoding='utf-8') as f:
        ilines = f.read().splitlines()
    olines = []
    for iline in ilines:
        j = json.loads(iline.strip())
        out = copy.deepcopy(j)
        valid_paras = []
        for para in j['段落']:
            paratextset = set()
            for lang in LANG_SET:
                paratextset.add(para[lang].strip())
            paratextset.discard("")
            if len(paratextset) <= 1:
                continue
            valid_paras.append(para)
            valid_paras[-1]["行号"] = len(valid_paras)
        out['段落'] = valid_paras
        olines.append(json.dumps(out,ensure_ascii=False))
    with open(ofilename, 'w', encoding='utf-8') as f:
        f.write('\n'.join(olines))

    print(f"output file: {ofilename.absolute()}")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Process some files.')
    parser.add_argument('input', type=str, help='The input file path', nargs='?')
    parser.add_argument('-d', '--directory', type=str, help='Process a directory instead of a single file')
    args = parser.parse_args()
    if args.directory:
        for f in Path(args.directory).iterdir():
            if f.name.endswith('.jsonl'):
                process_file(f)
    elif args.input:
        process_file(Path(args.input))
    else:
        print("请提供一个目录或输入文件路径。")
        exit(0)

此脚本无法处理形如以下的语言对不上的导出,可能需要另外使用正则或者是机翻手段来纠正这些case。现阶段暂时不把工作重心放在这里,交给语料的下游使用者想办法处理。

{"行号": 4, "是否重复": false, "是否跨文件重复": false, "it_text": "這種手機也是方便的電子產品嘛?", "zh_text": "這種手機也是方便的電子產品嘛?", "en_text": "這種手機也是方便的電子產品嘛?", "ar_text": "", "nl_text": "", "de_text": "這種手機也是方便的電子產品嘛?", "eo_text": "", "fr_text": "這種手機也是方便的電子產品嘛?", "he_text": "", "ja_text": "これもハイテクで便利なんだろ?", "pt_text": "這種手機也是方便的電子產品嘛?", "ru_text": "這種手機也是方便的電子產品嘛?", "es_text": "這種手機也是方便的電子產品嘛?", "sv_text": "", "ko_text": "這種手機也是方便的電子產品嘛?", "th_text": "", "other1_text": "", "other2_text": "", "id_text": "", "cht_text": "這種手機也是方便的電子產品嘛?", "vi_text": "", "扩展字段": "{\"k\": \"sound_auth_subtitles_speech_list_sub_b19.bin.json@27@@4\"}"