用飞桨,为少数民族濒危语言生成一本词典

2021/02/22 19:00
阅读数 245

点击左上方蓝字关注我们

飞桨开发者说】Xutan Peng,英国谢菲尔德大学Lincedo实验室博士在读,研究主要围绕自然语言处理和表示学习。

项目背景

据联合国科教文组织统计,全球现存七千余种有记录语言中,超过四百种濒临灭绝,超过两千种处于接近濒危的状态。濒危语言的定义:当母语人停止说某种语言,或者是在各个领域说得越来越少,并且不将其传递给后代的时候,这种语言就被称为濒危语言。因此,对原生态的语言面貌和文化信息的保存,对珍贵濒危语言文化遗产的留存,都是当今时代刻不容缓的目标与追求。“语言是文明的DNA”,与语言一起灭绝的,是无法挽回的缤纷绚烂的历史文化传承。


图1

大家可以从图1看出,我国的濒危语言众多,但在国家大力保护下,许多仍处于留存状态(绿色部分),但也有大量语言濒临灭绝(红色部分),亟待拯救。

当前,借助田野调查,建立对应的口语语料库是我国保护这些濒危语言的主要手段。此类口语语料库保存的内容主要包括原始声音文件和国际音标标注等。然而,仅仅依靠这些单语数据,研究者无法获知其背后所传达的语义,难以高效地开展相关学习与研究,更罔论留存这些少数民族濒危语言与背后地方文化的生命力。为了解决这个问题,我们借助飞桨的视觉和文本能力,基于无监督跨语言词向量算法,成功地实现了对濒危语言词典的自动化生成,极大减轻了语保工作者的负担,助力我国的语言保护事业。

图2: 在一线辛苦采集原始语料的语保工作者

技术方案

我们的算法共分以下四步:

1)采集少数民族濒危语言语料;

2)基于飞桨的高性能OCR工具与文本清洗能力,构建主题一致的现代汉语数据集;

3)低资源条件下训练单语词向量;

4)借助飞桨实现跨语言词向量对齐算法,全自动地生成大规模“汉语-少数民族语言”词典。

1.爬取少数民族濒危语言数据

本项目濒危语言口语语料主要来自英国伦敦大学亚非学院汉斯·罗森濒危语言典藏[1]。此开源语料库是当今世界规模最大、范围最广、语种最多、内容最丰富的濒危语言博物馆。同时,项目内容全部来自于相关研究者的实地田野调查与采集。

图3:语音转写软件界面

由于多数濒危语言没有存留的文字系统,语料库中的“文本”主要是通过国际音标系统(IPA)转写所得。本项目欲建立这些具体单词语音与对应普通话语义之间的联系。

从图3可以看出,语音材料沿下方时间轴,被专家判读为一系列基本音节构成的序列。

遗憾的是,这个数据集本身并不是封装好的(即提供可以直接下载使用的压缩包)。我们实现了一个简单的爬虫程序,供感兴趣的同学亲手获得语料。接下来,我们讲一下具体操作。首先,我们解析“国家”这一层级的HTML页面,获取全部按照标准格式标注好的metadata文件(均为.xml)列表,并按照语种分门别类地进行保存。考虑到后续训练的实际资源需求,这里我们设置限定,即只训练那些具有超过一百份独立metadata的语言。

import requests
from bs4 import BeautifulSoup
import codecs
from tqdm import tqdm
import json


# 分语言下载全部语料文件(xml)对应的href列表

base_url = "http://www.language-archives.org"

entrance_url = "http://www.language-archives.org/country/CN" # all langs


response = requests.get(entrance_url)       
soup = BeautifulSoup(response.text, 'lxml')
language_url_list = []
language_url_dict = {} 
for li in soup.find_all('li'):
    language_url_list.append(base_url + li.find('a').get('href')) 


for language_url in tqdm(language_url_list):
    language_response = requests.get(language_url) 
    language_soup = BeautifulSoup(language_response.text, 'lxml')
    language_data = language_soup.select('body > ol:nth-child(9) > li > a')

    language_href_list = []
    for item in language_data:
        language_href_list.append(base_url + item.get('href'))

    if len(language_href_list) > 100:
        language_name = language_url.split('/')[-1]
        language_url_dict[language_name] = {
            'language_url': language_url,
            'herf_url': language_href_list
        }
with codecs.open("language_url_dict.json", "w", 'utf-8') as wf:
json.dump(language_url_dict, wf, indent=4)

下一步,我们基于这些导出的文件索引地址,批量进行下载和保存:

import os
import re
import urllib


# 下载对应的xml文件

with codecs.open("language_url_dict.json",'r','utf-8') as jf:
    language_url_dict = json.load(jf)

for language, data in language_url_dict.items():
    file_dir = 'result/' + language + '/'
    if not os.path.exists(file_dir):
        os.makedirs(file_dir)
    href_list = data['herf_url']
    for href in tqdm(href_list):
        response = requests.get(href)
        soup = BeautifulSoup(response.text, 'lxml')
        xml_list = soup.findAll(name='a',text=re.compile(r".*xml"))
        for xml_f in xml_list:
            urllib.request.urlretrieve(xml_f.get('href'), file_dir + xml_f.get('href').split('/')[-1])

最终,我们选取了独龙、尔苏、嘉绒、撒拉这四种数据较为丰富的语言作为实验对象。每种语言含有的句子数量均超过三千条,足够驱动本算法的后续步骤。

2.构建现代汉语同领域语料库

通过考察上步得到的少数民族语言口语语料,我们发现其内容主要围绕神话传说、民间故事、民歌和日常会话。根据相关学者的研究[2],我们采用自己基于飞桨实现的对齐算法(后续会说到)时,当且仅当双语各自的语料领域相对近似,抽取词典的质量才能得到保证。当前学界和业界并没有相关领域现代汉语的大规模语料资源。为此,本项目构建了首个民间故事汉语数据集,并计划与版权所有方完成全部细节沟通后进行开源。

图4

我们的现代汉语数据集主要来自著名的民间故事杂志《故事会》(ಡωಡ)。版权方为我们提供了大量的《故事会》杂志扫描样本,杂志时间跨度为8年(从2009年至2016年),每年24期。

具体来说,我们基于这些扫描样本,利用飞桨PaddleOCR组件将其转化成文本。PaddleOCR“开箱即用”,且识别精度高、推理速度快,极大地节省了我们构建原始文本数据集的开销。该模型将MobileNetV3[3]作为骨干网络(其模型架构如图5),并分别利用CRNN和DB进行识别和检测:

图5

在百度的AI Studio平台上,我们可以非常方便地调用PaddleOCR接口。想要获得更多相关信息,请点击链接:

https://www.paddlepaddle.org.cn/support/news?action=detail&id=2123

实验过程中,我们发现PaddleOCR输出的文本精度已经非常高了。我们进一步借助PaddleX集成的EasyData模块清洗了Emoji、URL等杂质,经过简单的句子分割和过滤后,即可得到高质量的语料:

图6

训练词向量前,我们还利用“结巴”工具包进行分词预处理。此时,大家应选择“paddle模式”,从而获得最佳精度:

import jieba

jieba.enable_paddle()# 启动paddle模式
strs=["文档1内容", "文档2内容", "...", "文档n内容"]
for str in strs:
seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式

最终,我们构建了一个含有950万字的大规模民间文本数据集。同时,我们注意到它的风格具有很强的口语化特点,因此,我们认为它十分适合用于和第一步中转写得到的少数民族语言语料进行对齐。

3.低资源词向量训练

当前,流行的静态分布式词向量算法包括Word2vec、GloVe、FastText等。然而,这些算法需要依靠大规模的单语语料才能达到收敛,并不适合本任务。因为基于神经语言模型的词向量需要百万句子规模,然而,经过之前两个步骤的努力,单种少数民族濒危语言语料所包含的句子数量普遍不足五千条,《故事会》语料也小于二十万条句子,远远少于所需句子数量。所以,我们采用了更传统的方式——统计驱动的基于点互信息(PMI)矩阵与SVD分解的算法[4],共训练了五十维的词向量。在相关单语词向量analogy测试集[5]上,达到了良好的效果。

图7:analogy性能与Word2vec实验对比图

考虑相关学者[2]指出,高质量的双语词典抽取依赖单语analogy的高得分。因此,相对上文提到的更流行的神经网络词向量,这一训练在低资源场景的统计驱动的词向量,可为下游的双语对齐任务提供更强有力的支持。

使用这段代码,就可以启动“PMI+SVD”词向量的训练:

from svd2vec import svd2vec  # 从https://github.com/valentinp72/svd2vec下载安装


documents = [open("text8", "r").read().split(" ")]
svd = svd2vec(documents, window=2, min_count=100)
svd.save("svd.bin")
svd = svd2vec.load("svd.bin")

# 转换成text格式

from gensim.models.keyedvectors import Word2VecKeyedVectors
svd.save_word2vec_format("svd_word2vec_format.txt")

借助飞桨的可视化模块,让我们通过PCA观察一下得到的汉语词向量:

图8

从图8我们可以发现,词向量表现出了一定的拓扑特点。下一步,我们基于训练模型,自主发现和利用这些分布特征,对两种语言独立训练出的词向量进行旋转和对齐。

4.双语词典自动化抽取

在这一步,我们尝试了两种典型设定:弱监督(提供极少量的双语词对作为种子)和无监督(仅有相互孤立的双语语料)。我们的核心工作流参考了Mikel Artetxe等学者的相关研究[6],即在初始种子词典(来自弱监督信号,或者在无监督状态下采用启发式算法进行对齐)的基础上,训练一个正交变换,将一种语言的单语词向量映射到另一种语言,从而最小化已有词典中词对间的平均距离(相关学者[2]为这个流程提供了理论基石)。通过利用自学习范式,即不断地迭代上述过程并扩大已锁定词典,可以达到一个高准确度的最终收敛点。如需更生动的介绍,欢迎观看我们的B站视频[7]。

在每个迭代周期中,我们首先设置一个退火温度,控制当前词典保留的随机更新概率:

if it - last_improvement > args.stochastic_interval:
       if keep_prob >= 1.0:
           end = True
       keep_prob = min(1.0, args.stochastic_multiplier*keep_prob)
       last_improvement = it

接下来,我们利用P. H Schönemann [8]提出的正交普式对齐的封闭解,计算当前双语词向量最优的映射矩阵:

u, s, vt = np.linalg.svd(z[trg_indices].T.dot(x[src_indices]))
w = vt.T.dot(u.T)
x.dot(w, out=xw)
zw[:] = z

在当前已经对齐的双语词向量上,我们利用CSLS算法[9]进行词典抽取(最近邻):

knn_sim_bwd = xp.zeros(z.shape[0])
for i in range(0, z.shape[0], BATCH_SIZE):
    j = min(i + BATCH_SIZE, z.shape[0])
    knn_sim_bwd[i:j] = topk_mean(z[i:j].dot(x.T), k=args.neighborhood, inplace=True)
for i in range(0, len(src), BATCH_SIZE):
    j = min(i + BATCH_SIZE, len(src))
    similarities = 2*x[src[i:j]].dot(z.T) - knn_sim_bwd  # Equivalent to the real CSLS scores for NN
    nn = similarities.argmax(axis=1).tolist()
    for k in range(j-i):
        translation[src[i+k]] = nn[k]

当不断迭代直至满足停止条件(例如达到预设轮数,或词典不再更新)后,我们采用了Mikel Artetxe等学者[6]提出的后处理方式,对学习到的双语词向量空间进行最后的提升:

# STEP 1: Whitening
def whitening_transformation(m):
     u, s, vt = np.linalg.svd(m, full_matrices=False)
     return vt.T.dot(np.diag(1/s)).dot(vt)

wx1 = whitening_transformation(xw[src_indices])
wz1 = whitening_transformation(zw[trg_indices])
xw = xw.dot(wx1)
w = zw.dot(wz1)

# STEP 2: Orthogonal mapping
x2, s, wz2_t = np.linalg.svd(xw[src_indices].T.dot(zw[trg_indices]))
wz2 = wz2_t.T
xw = xw.dot(wx2)
zw = zw.dot(wz2)

# STEP 3: Re-weighting
xw *= s**args.src_reweight
zw *= s**args.trg_reweight

# STEP 4: De-whitening
xw = xw.dot(wx2.T.dot(np.linalg.inv(wx1)).dot(wx2))
xw = xw.dot(wz2.T.dot(np.linalg.inv(wz1)).dot(wz2))
zw = zw.dot(wx2.T.dot(np.linalg.inv(wx1)).dot(wx2))
zw = zw.dot(wz2.T.dot(np.linalg.inv(wz1)).dot(wz2))

# STEP 5: Dimensionality reduction
xw = xw[:, :args.dim_reduction]
zw = zw[:, :args.dim_reduction]

来看看我们得到的词典吧!

图9

目前,我们导出了独龙、尔苏、嘉绒、撒拉这四种语言和汉语的双向词典,并在中国社科院民族学和人类学研究所的志愿者们协助下,开展了内部评测。整体来说,考虑到全过程的便捷性,此系统价值较高。同时,我们也收到了一些关于含有少量误差的反馈。本项目之后的工作重点,将是逐步提升准确度,并开发可直接交互的软件,从而方便更多用户体验。欢迎大家持续关注!

社会意义

本系统是一个公益性的“科技向善”项目,其作为业界首个“少数民族濒危语言-汉语”双语词典的全自动构建工具,具有广泛长远的社会效益:

  • 有助于少数民族文化历史传承: 少数民族的历史文化是中华民族集体记忆的重要组成部分。在本研究中,我们深切地感到了这些濒危语言的背后,是绚丽多姿的历史文化沉淀。保护这些语言,就是保护少数民族地区的历史传承,就是保护汉语大家庭的多样性。

  • 有助于国家均衡发展和整体振兴:与经济发达地区相比,少数民族地区的经济发展相对落后,其中一个重要原因是语言障碍阻碍了与发达地区的交流。高质量词典的建立是打破语言壁垒的第一步,它将极大地推动民族间的互通互荣,进而助力“两个一百年”攻坚战的全面胜利。

  • 有助于提升国家影响力:当前,中国正加紧部署一系列新文化交流战略。在这其中,新丝绸之路计划十分重要,该计划途经众多小语种国家,打破语言壁垒是保证其顺利实施的重要环节。本项目所提出的技术可快速移植扩展到相关语言,促进国际间的交流合作。

参考文献

[1]http://www.language-archives.org

[2]Peng, X., Lin, C., & Stevenson, M. (2020). Revisiting the linearity in cross-lingual embedding mappings: from a perspective of word analogies. arXiv:2004.01079.

[3]https://www.paddlepaddle.org.cn/support/news?action=detail&id=2123

[4]Levy, O., Goldberg, Y., & Dagan, I. (2015). Improving distributional similarity with lessons learned from word embeddings. Transactions of the Association for Computational Linguistics.

[5]https://aclweb.org/aclwiki/Google_analogy_test_set_(State_of_the_art)

[6]Artetxe, M., Labaka, G., & Agirre, E. (2018). A robust self-learning method for fully unsupervised cross-lingual mappings of word embeddings. In Annual Meeting of the Association for Computational Linguistics.

[7]https://www.bilibili.com/video/BV13f4y1d7Ju/

[8]Schönemann, P. (1966). A generalized solution of the orthogonal procrustes problem. Psychometrika.

[9]Lample, G., Conneau, A., Ranzato, M. A., Denoyer, L., & Jégou, H. (2018). Word translation without parallel data. In International Conference on Learning Representations.

如在使用过程中有问题,可加入官方QQ群进行交流:778260830。

如果您想详细了解更多飞桨的相关内容,请参阅以下文档。

·飞桨官网地址·

https://www.paddlepaddle.org.cn/

·飞桨开源框架项目地址·

GitHub: 

https://github.com/PaddlePaddle/Paddle 

Gitee: 

https://gitee.com/paddlepaddle/Paddle

飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,是中国首个开源开放、技术领先、功能完备的产业级深度学习平台,包括飞桨开源平台和飞桨企业版。飞桨开源平台包含核心框架、基础模型库、端到端开发套件与工具组件,持续开源核心能力,为产业、学术、科研创新提供基础底座。飞桨企业版基于飞桨开源平台,针对企业级需求增强了相应特性,包含零门槛AI开发平台EasyDL和全功能AI开发平台BML。EasyDL主要面向中小企业,提供零门槛、预置丰富网络和模型、便捷高效的开发平台;BML是为大型企业提供的功能全面、可灵活定制和被深度集成的开发平台。

END

本文同步分享在 博客“飞桨PaddlePaddle”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部