大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
个人主页-Sonhhxg_柒的博客_CSDN博客
欢迎各位→点赞 + 收藏⭐️ + 留言
系列专栏 - 机器学习【ML】 自然语言处理【NLP】 深度学习【DL】
foreword
✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。
如果你对这个系列感兴趣的话,可以关注订阅哟
文章目录
语言类型学
场景:学术论文分类
不同语言的文本处理
复合词
形态复杂性
迁移学习和多语言深度学习
跨语言搜索
清单
结论
在构建 NLP 系统时,您应该回答的第一件事是您将支持哪种或多种语言。这会影响从数据存储到建模再到用户界面的方方面面。在本章中,我们将讨论在生产多语言 NLP 系统时要考虑的事项。
在本章的最后,我们将有一份关于您的项目的问题清单供您提问。
当支持多种语言时,管理复杂性的一种方法是确定预期语言之间的共性。例如,如果您只处理西欧语言,您知道您只需要考虑拉丁字母及其扩展。此外,您知道所有语言都是融合语言,因此词干化或词形还原将起作用。他们也有类似的语法性别系统:男性、女性,也许还有无生命的中性。
让我们看一个假设的场景。
在这种情况下,您的输入将是文本文档、PDF 文档或文本文档的扫描件。输出应该是带有文本、标题和标签的 JSON 文档。您将接受作为输入的语言是英语、法语、德语和俄语。您已经标记了数据,但它仅来自最近五年的文章。这是出版商开始要求在提交期间标记文章的时候。最初的分类可以是部门级别的——例如,数学、生物学或物理学。但是,我们需要有一个支持子学科的计划。
首先,我们应该考虑不同的输入格式。我们需要有用于将图像和 PDF 文档转换为文本的 OCR 模型。我们在第 16 章看到我们可以为此使用 Tesseract 等工具。如果找不到满意的模型,我们可以使用文本文件创建训练数据集。一些扫描的文档会有问题。例如,文档可能没有很好地与扫描床对齐,因此文本会倾斜。该文件可能已经过时并且文本已被侵蚀。我们的模型需要适应这一点。因此,我们需要找到某种方法来生成腐蚀和倾斜的文本以支持扫描的文档。我们可以转录一些文件,但这是非常耗费人力的。您尝试通过将转录过程分成几部分来简化转录过程。转录的另一个复杂之处是,如果您使用不懂语言的转录员,他们将更容易出错。
其次,我们要考虑分类任务。对于初始模型,我们可能会使用词汇特征和简单的线性分类器。仅使用关键字在部门级别分离论文是非常可行的。您可以使用专家来生成这些关键字,也可以从词汇分析中找到它们。您仍然需要与精通这些语言的领域专家一起查看关键字。将来,简单的词汇特征将有助于分离子学科,尤其是可能没有很多独特关键字的利基子学科。在这种情况下,我们可能希望转向更复杂的模型。首先,我们可以从具有更复杂模型的词袋开始,或者直接使用 RNN。无论哪种方式,我们都必须构建我们的代码,以便我们可以支持不同的预处理和建模框架。
在我们讨论项目中的模型构建之前,我们需要确定我们将如何处理文本。我们已经在第2章和第5章中讨论了标记化的一些常见注意事项。大多数书写系统使用空格作为单词分隔符。有些使用其他符号,有些根本不分隔单词。另一个考虑因素是词复合。
词复合是我们将两个词组合成一个词。例如,“月光”是两个词的组合。在某些语言中,例如德语,这更为常见。事实上,在德语中分词器是一种常见的德语文本处理技术,这在德语中已经很常见了。考虑“Fixpunktgruppe”(“不动点群”)这个词,它是一种特殊代数结构的数学术语。如果我们想找到文档中提到的所有组结构,我们需要将“gruppe”分开。这在具有更多生产后缀的语言中可能很有用。
在英语中,借词与添加前缀或后缀来创建新词一样常见。例如,我们使用“拖拉机”这个词来表示用于拉动的机器——“拖拉机”就是“拉动机”的拉丁词。在其他一些语言中,借用不太常见,例如希腊语、冰岛语和普通话。在这些语言中,我们可能需要考虑将这些词拆分为它们的组成词素。这对于复合词可能不会在所有上下文中复合的语言尤其重要。这些可分词类似于英语中的一些短语动词。短语动词是像“wake up”这样的动词。“向上”助词可以与动词分开,也可以不分开。
I woke up the dog.
I woke the dog up.
但是,有些对象需要分离。
*I woke up her.
I woke her up.
德语翻译“aufstehen”在有限形式中会丢失前缀。
zu aufstehen den Hund ["to wake the dog up"]
Ich stand den Hund auf ["I woke the dog up"]
因为这些派生词通常具有与它们的基础非常不同的含义,我们可能不需要处理它们。在文档级别的工作(例如文档分类)中,这些词不太可能影响模型。您更有可能需要在基于搜索的应用程序中处理此问题。我建议不要在你的第一次迭代中处理这个问题,并监视使用情况,看看是否经常搜索复合词。
在第 2 章中,我们讨论了语言将语素组合成单词的不同方式。分析语言,如普通话,倾向于使用助词来表达过去时之类的东西。同时,合成(或粘着性)语言,如土耳其语,具有用于表达名词在句子中的作用、时态、介词等的词缀系统。介于这两者之间的是融合语言,比如西班牙语,它没有合成语言那么多可能的词形,但比分析语言多。对于这些不同类型的形态,在考虑词干化与词形还原时需要权衡取舍。
可能的词形式越多,词形还原需要的内存就越多。此外,一些融合语言比其他语言更规则。语言越不规则,词干算法就越困难。例如,芬兰语名词最多可以有 30 种不同的形式。这意味着每个动词需要有 30 个条目。芬兰动词要复杂得多。这意味着,如果你有一个 100 万字的词汇表,你将需要远远超过 3000 万个词条。
分析语言可以使用词干提取或词形还原,甚至都不使用。普通话可能不需要这样的处理。英语是一种从融合型向分析型过渡的语言,可以使用其中任何一种。很少有足够的形式可以使词形还原是可行的,并且词干提取也不是太困难。让我们看一下英语中的规则动词(也称为弱动词)。动词“call”有“call”、“calling”、“calling”和“calls”的形式。名词在英语中更简单——只有两种形式(单数和复数)。确定名词和规则动词形式的规则也很简单,可以构建一个lemmatizer
for。
像芬兰语这样的合成语言通常非常规则,因此词干提取算法很简单。对于融合语言,您可能会使用组合方法。不规则形式在最常用的词中更为常见。因此,您可以对最常见的单词使用词形还原,并使用词干作为后备。
嵌入和迁移学习背后的想法之一是神经网络正在学习更高层次的数据中的特征。这些特征可用于获取在一个数据集上训练的模型或模型的一部分,并将其完全用于不同的数据集或不同的问题。但是,我们必须注意数据有多么不同。如果 Twitter 上的英语和医疗记录中的英语之间的差异足以降低可移植性,那么想象一下英语和另一种语言之间的翻译损失了多少。话虽如此,如果您希望构建一个比随机起点更好的模型,您应该尝试可迁移性。这对某些问题比对其他问题更有意义。例如,在我们之前的场景中,学术文档的分类将取决于在我们所有语言中可能具有相似分布的技术术语。这意味着可转移性可能会有所帮助——当然值得尝试。另一方面,如果我们正在构建一个处理来自不同国家的医疗记录的模型,那么跨语言的可迁移性可能就不那么有用了。不仅根本现象不同(不同地方的常见疾病不同),而且对文件的监管要求也不同。因此,这些文件不仅在语言上有所不同,而且在内容和目的上也有所不同。
词嵌入是一种足够通用的技术,有希望实现可迁移性。这仍然是一个研究课题。这个想法是,虽然相同词的词频可能不同,但概念的分布更加普遍。如果是这样,也许我们可以学习从一种语言的向量空间到另一种语言的转换,以保留语义内容之间的关系。
一种方法是学习基于参考翻译的转换。假设我们有两种语言,L1 和 L2。我们从 L1 中获取一个单词列表,以及它们在 L2 中的翻译。这些参考词中的每一个都将映射到 L2 向量空间中的一个点。假设 L1 是拉丁语,L2 是英语。单词“nauta”w
在拉丁向量空间中具有向量,v
在变换后在英语向量空间中。英语等价的“sailor”有向量u
。u
我们可以通过查看和之间的欧几里得距离来定义该词的转换误差v
。使这种差异最小化的转换应该可以很好地工作。问题在于不同的文化可以使用等价的话很不一样。此外,多义词因语言而异,这种方法仅适用于静态嵌入。
这是一个活跃的研究领域,并且会有新的发展。这些技术的希望之一是,它将让我们将其中一些高级技术用于没有构建深度学习模型所需的庞大语料库的语言。
如果您正在构建跨语言的搜索解决方案,您通常按语言分隔文档并让用户在搜索时选择一种语言。建立多语言索引是可能的,但可能很困难。有多种方法,但最终您需要一些通用的方法来表示语料库中的单词或概念。以下是一些可能的方法。
您可以使用机器翻译将所有内容翻译成单一语言。在我们的场景中,我们可以将所有文档翻译成英文。这样做的好处是您可以查看这些翻译的质量。缺点是非英文文档的搜索质量会受到影响。
另一方面,如果您可以有效地为翻译模型提供服务,您可以在查询时将其翻译成所有可用的语言。这具有不偏向于一种特定语言的好处。缺点是您需要找到一种方法从这些指数中得出一个共同的分数。另一个复杂因素是自动机器翻译是用完整的文本而不是查询构建的。因此,查询可能会被误译,尤其是当它是一个具有多种含义的词时。
如果不能选择自动机器翻译,您还可以考虑使用词嵌入。这将需要前面谈到的转换。这本质上是在构建一个没有序列预测的翻译模型。
考虑有关您的项目的以下问题:
处理多语言应用程序可能很复杂,但它也提供了巨大的机会。没有多少 NLP 应用程序是多语言的。也没有多少人有创建此类应用程序的经验。
多语言应用程序如此困难的原因之一是标记的多语言数据的可用性很差。这意味着多语言 NLP 项目通常需要您收集标记数据。我们将在第 18 章讨论人类标签。