-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
联合国6国语料的整条管线接入,爬虫重做 #62
base: main
Are you sure you want to change the base?
Conversation
Unified Pipeline for Reproducing Parallel Resources: Corpus from the United Nations (UPRPRC)0. Abstract在数字时代,多语言数据集的保真度和可访问性对于推进机器翻译 (MT) 和自然语言处理 (NLP) 至关重要。本文介绍了联合国平行语料库,这是一个复杂的迭代,它不仅扩展了数据的广度,还包含了将原始联合国数据转换为结构化平行语料库所需的整个流程。该语料库由来自联合国数字图书馆 (UNDL) 的文档组成,时间跨度从 2000 年到 2023 年,旨在立即部署到 MT 系统中。它引入了一个完整的端到端解决方案——从数据采集到网络抓取再到文本对齐等等。我们通过提供一种新颖的流程来解决以前的数据访问方法的过时问题,该流程包括一个简约的单机可运行示例和补充的可选分布式计算步骤,以最大限度地降低时间成本。我们的工作建立在该领域的先前努力的基础上并加以扩展,利用了文本对齐工具的最新进展。该语料库分为三个粒度级别,并附带一组强大的平行文本,可根据 MIT 许可证轻松访问。该语料库不仅促进了机器翻译系统的开发,还为希望探索联合国框架内多语言文献细微差别的语言学家和研究人员提供了资源。 1. Introduction
全球化步伐的加快凸显了多语言交流的关键作用,尤其是在数字时代。联合国数字图书馆 (UNDL) 正是在此大放异彩,以其严格的翻译质量和全面的数据透明度而闻名。其广泛的公共领域存储库包含历史和当代资料,是自然语言处理 (NLP) 和机器翻译 (MT) 模型的宝贵资源,建立在原始论文中引用的先前基础工作之上。值得注意的是,UNDL 数据的纳入提高了著名机器翻译框架(如 OPUS 和 OpenNMT)的性能。然而,随着联合国数据库的重大修订,传统的数据获取方法已经过时——这是一个争论点,因为原始链接不再可检索。再加上近年来更复杂的文本对齐工具的出现,我们发现必须继续并扩展前人奠定的基础。因此,我们创建了一个全面的流程,它不仅涵盖了从数据抓取到数据集整理的整个过程,还包括一个用于独立执行的简单示例和可选的分布式计算步骤,以提高时间效率。此外,我们还提供了从 2000 年到 2023 年的并行文本语料库,这些文本经过精心处理,可立即应用。 2. License and Availability我们用MIT协议开源。我们收集到的2000-2023年的数据托管在百度网盘(给个链接)以及huggingface上。https://huggingface.co/datasets/bot-yaya/rework_undl_text 3. File Organization and Format我们做了三个粒度的平行语料【每个粒度放一份样例】:
4. Pipeline Overview本节将按pipeline的执行顺序逐个介绍必要以及可选步骤。 【这里要画张流程图】 【以下暂时是口语化的不规范描述,日后需要重写】 new_sample_get_list.py
制作该语料库的首步是从联合国的在线网站上收集数据。United Nations Digital Library的在线查询服务经过数次改版,我们在开始收集数据到最后整理管线脚本时正经历一次改版,老的api已经全部废弃,没有办法拿到任何数据,所以我们仅提供至撰稿为止能够从最新api(提供一个页脚注解,链接:https://search.un.org/search&collection=ods)收集数据的代码。我们选择Official Document System(ODS)系统的原因,是它网页上提供同个文件的多个不同语种版本,这是整理成平行语料的必要条件。 new_sample_get_doc.py
拿到文件表之后可以很容易地从网站上下载文件。但值得注意的是网站提供的文件有时并不是doc格式而是pdf,对于pdf类型的文件即使我们做过尝试,最终也并不能以一种程序化的方法将pdf里面的段落文本干净地提取出来,所以对于这一小部分的pdf文件我们会用文件头校验来直接将其跳过。 new_sample_get_doc_async_candidate.py
new_sample_doc2txt.py
网站提供的文件大部分是老版本的doc文件,小部分是较新版本的docx文件,在早一些的年份中还会给出一部分wpf文件。为了将这些文件中的文本按段落取出,我们需要将它们统一转为易于处理的docx文件。然而用脚本实现这一步并不容易:我们测试了更对脚本友好的LibreOffice Writer和直接用Microsoft Word 2019做文件另存为产出的文件对比,结论是LibreOffice Writer另存为得到的docx文件比起Word的乱码率要高得多,而且对于一些错误文件的处理策略比Word更糟糕(如对于一部分缺少图片引用资源的文件会直接导致打不开报文件损坏,而Word能将其以纯文本形式保存)。而Word只能通过com编程的方式来做批量的另存为,由于网站提供的doc文件偶尔会损坏或者加密,或者是文件过大造成打开时闪退,或者某种原因无法正确读取而导致Word占用内存不断膨胀直到内存用尽,这一步需要非常鲁棒且繁琐的重试和超时机制来保证文件另存为程序的持续运行。我们的脚本已经尽可能枚举了我们能够遇到并且解决的异常方案,剩余的不能够自动解决的我们将其分类为错误文件,如果有足够的人力资源,也许能够从这部分文件中人工拯救一部分仍然可以做成语料的信息。注意我们的com脚本是假设用户以中文语言运行Windows并以中文使用Word来执行转换的,我们使用了控件级别的字符串查找,所以如果在其它语言的系统上运行我们的脚本,可能需要修改这些硬编码的字符串。 将所有的doc文件统一转成docx文件之后,我们简单地使用pandoc将其文本提取出来。得到的文件中双换行符已经隔开了所有自然段。
new_sample_txt2translate.pydoc提取出的文本需要进行机器翻译才能够进行对齐,从而产出对齐好的平行语料。我们选择使用argostranslate作为我们的机器翻译工具,将所有的非英语语种文件翻译为英语,然后记下每个段落被翻成了什么,这些信息将在之后的对齐中用到。机器翻译是我们整条管线中耗费算力最大的一步,所以我们在单机演示脚本之外也提供了一套可选的分布式程序,以满足拥有多台机器的使用者的需要。
new_sample_txt2translate_distrib_candidate_server.py
new_sample_txt2translate_distrib_candidate_client.py
new_sample_translate2align.py得到每个段落及其对应的英语翻译后,我们使用了一种基于最长公共子序列(LCS)的方法来做非英语语种到英语的段落级别的对齐。 首先,我们观察到不同语种文件之间的段落数可能不同,即,他们不是exactly一个段落能够对应到另一个语言的一个段落。这就要求我们设计一种办法,能够处理n段对应于m段的实际文本数据,即是将某个语言的n个段落合并在一起对应到另一个语言的m个段落合并到一起的文本。但这种方法可想而知最坏的结果会导致我们压根没有拆段,而是得到整个文件级别的对齐数据,即是所有段落合并到一起对应于另外一个语言的所有段落合并到一起。这与我们预期提供段落级对齐的语料数据以用于训练上下文长度不够长的模型的需求不符。 所以我们定义了一个指标 我们使用翻译后的文本进行对齐的步骤如下所述:
new_sample_align2mergedjsonl.py我们可以在对齐步骤中得到双语级别的对齐语料以及段落图的连边。在制成全语种对齐语料的时候,我们简单地在段落图上再求一次联通块,然后得到全语种对齐的段落级平行语料。 |
【不要合并!】这个PR现在只用于论文草稿和一些统计脚本留档