皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

人工智能:自然语言处理入门

人工智能:自然语言处理入门

在本系列有关人工智能和机器学习的上一篇文章中,我们进一步深入了解了神经网络的工作原理。随后,我们通过使用 scikit-learn 增强了对无监督学习的理解。最后,我们开始学习基于 Torch 库的机器学习框架 PyTorch。在这篇人工智能系列文章的第九篇中,我们将重点讨论一个尚未涉及的话题–自然语言处理(NLP)。为此,我们将同时使用 PyTorch 和 NLTK(自然语言工具包)库。我们还将讨论 PySpark,这是 Python 中 Apache Spark 的接口。不过,我们将一如既往地从巩固我们对人工智能和机器学习的理论掌握开始。

在深入讨论神经网络之前,让我们花点时间考虑一下现状。如果研究一下印度工程教育领域的最新趋势,你会发现年轻学生对学习计算机科学工程的兴趣越来越浓厚。虽然一些科技公司已经开始裁员,但我相信年轻一代对计算机科学工程的痴迷在短期内不会衰退。当然,我可能是错的,只有时间才能证明一切。那么,最近开始学习计算机科学工程的学生对哪些领域感兴趣呢?如今,许多学生只对人工智能、机器学习和数据科学等领域感兴趣。鉴于 ChatGPT 等人工智能工具的出现,这种选择是可以理解的。这一领域的文献资料非常丰富,因此很难跟上不断出现的新术语。我最近参与评估了几个基于人工智能和机器学习的本科学术项目。项目组提出的大量新术语既令人着迷,又令人担忧。鉴于我们许多聪明的年轻学生计划在不久的将来从事人工智能和机器学习领域的工作,我们有必要充分了解这些领域的流行术语。这就是为什么我认为我们对人工智能、机器学习、数据科学、神经网络和相关主题的讨论是有道理的。

回想一下,在本系列的前几篇文章中,我们全面介绍了神经网络。我们谈到了使用 TensorFlow 和 Keras 来构建和测试基于神经网络的模型。不过,需要注意的是,我们对神经网络的研究主要是实用性的。请记住,在本系列的前两篇文章中,我们创建并检验了一个能够对手写数字图像进行分类的神经网络模型。现在,我认为是时候深入研究可用于此类模型的各种类型的神经网络了。
神经网络的起源可以追溯到 20 世纪 40 年代初,当时数字计算机还没有发展起来。1943 年,沃伦-麦库洛克(Warren McCulloch)和沃尔特-皮茨(Walter Pitts)提出了感知器(又称麦库洛克-皮茨神经元),这是一种简单神经元的数学表示,能够像人脑中的神经元一样处理和传输信息。尽管提出了开创性的建议,神经网络并没有立即成为人工智能领域的主导技术。相反,支持向量机和线性回归等其他技术在人工智能和机器学习应用的发展中受到了青睐。直到 20 世纪 90 年代,神经网络才重新流行起来。在下一节中,我们将探讨一些常用的神经网络,并列出实现它们的相应 Python 库。

首先,让我们讨论一下前馈神经网络(FNN)。前馈神经网络是所有神经网络中最简单的一种。在前馈神经网络中,信息只朝一个方向流动–从输入层到输出层。这些网络可用于多种任务,包括图像分类和回归分析。单层感知器是最简单的 FNN 之一,仅由一个输入层和一个输出层组成。它们通常用于二元分类器的监督学习。还有比单层感知器强大得多的多层感知器。与单层感知器不同,多层感知器除了输入层和输出层外,还有一个或多个隐藏层。多层感知器通常用于回归分析。TensorFlow/Keras 和 PyTorch 可用于在 Python 中实现 FNN。请看下图中名为 mlp.py 的 Python 脚本,它使用了 PyTorch 框架中名为 torchvision 的库。如果您系统中安装的 PyTorch 版本中没有该库,请使用 Anaconda Navigator 安装。Python 脚本 mlp.py 会生成多层感知器(MLP)。图 1 显示了名为 mlp.py 的 Python 脚本的输出结果。
人工智能:自然语言处理入门

图 1:多层感知器的工作原理

 

import torch
import torchvision.ops as ops
mlp = ops.MLP(in_channels=5, hidden_channels=[5, 5])
inp = torch.randn(1, 5)
print(inp)
output = mlp(inp)
print(output)

现在,让我们来讨论一下卷积神经网络(CNN)。CNN 是 FNN 的一种。CNN 专门用于处理图像数据。它们通常用于图像分类、物体检测、图像分割等。TensorFlow/Keras 和 PyTorch 可用于在 Python 中实现 CNN。CNN 由多个卷积层组成。回想一下,我们的手写数字图像分类模型就使用了卷积层。请看下图中名为 cnn.py 的 Python 脚本。这个 Python 脚本使用 PyTorch 生成一个二维卷积层。图 2 显示了名为 cnn.py 的 Python 脚本的输出结果。

人工智能:自然语言处理入门

图 2:CNN 的工作原理

import torch
import torch.nn as nn
model = nn.Conv2d(4, 1, 1)
inp = torch.randn(4, 1, 1)
print(inp)
output = model(inp)
print(output)

现在,让我们来讨论一下递归神经网络(RNN)和长短期记忆网络(LSTM)。RNN 具有循环功能,可将信息从一个步骤传递到下一个步骤。而 LSTM 则是一种更复杂的 RNN,它使用专门的记忆单元和门,随着时间的推移有选择地记忆或遗忘信息。因此,RNN 和 LSTM 可称为反馈神经网络。这两种神经网络都是专为处理顺序数据(如自然语言文本)而设计的。LSTM 可以使用 TensorFlow/Keras 或 PyTorch 在 Python 中实现。类 tf.keras.layers.LSTM( ) 使用 TensorFlow/Keras 生成 LSTM 层,类 torch.nn.LSTM( ) 使用 PyTorch 生成 LSTM 层。请注意,FNN、CNN、RNN 和 LSTM 都用于实现监督学习模型。

现在,让我们把目光转向生成对抗网络(GAN),它是一种用于生成建模的特殊类型的神经网络。生成式对抗网络由两个独立的神经网络组成–生成器和判别器。生成器经过训练,可以创建与训练数据相似的新数据,而判别器经过训练,可以区分生成数据和真实数据。值得注意的是,GAN 与我们迄今为止讨论过的其他神经网络不同,它用于无监督学习。GAN 可以使用 TensorFlow/Keras 或 PyTorch 在 Python 中实现。GAN 通常依赖于各种不同类型的层,包括密集层、卷积层、卷积转置层、激活层和剔除层。例如,在 TensorFlow/Keras 中,tf.keras.layer 模块提供了一系列可用于实现 GAN 的预构建层,而 PyTorch 则通过 torch.nn 模块提供了类似的功能。

现在,让我们把目光转向自动编码器。自编码器是另一种用于无监督学习的神经网络。自动编码器由编码器和解码器两部分组成。自动编码器经过训练后可以重建输入数据。它们通常用于异常检测和降维等任务。Python 提供了多种实现自动编码器的方法,包括使用 TensorFlow/Keras 或 PyTorch。自动编码器的实现可以通过使用 TensorFlow/Keras 中的 tf.keras.module 模块或 PyTorch 中的 torch.nn 模块来完成。

除了我们讨论过的神经网络外,还有许多其他著名的神经网络值得考虑。其中包括:1982 年推出的 Hopfield 网络,它是一种存储和检索模式的递归神经网络;玻尔兹曼机(BM),它是一种表示复杂概率分布的随机神经网络;1986 年推出的受限玻尔兹曼机(RBM),它是一种具有受限架构的玻尔兹曼机,有助于高效训练;以及深度信念网络(DBN),它是一种具有多层 RBM 的生成模型。现在,让我们把重点转移到基于人工智能和机器学习开发应用的更实际方面。

使用 PyTorch 的 NLP
首先,让我们讨论一下自然语言处理或 NLP,它在自动化中发挥着至关重要的作用。请注意,由于全球使用的语言数量庞大,NLP 面临着巨大的挑战–有 8 种语言每种使用人数超过 1 亿,27 种语言每种使用人数至少 5000 万(资料来源:维基百科)。这些语言在语法结构、成语表达和语言特点上各不相同,给分析和建模带来了困难。此外,在我们全球化的世界中,文本往往包含来自多种语言的词汇,其中一些甚至可能来自相对生僻的语言。处理 NLP 所涉及的大量数据以及自然语言固有的模糊性是另一个重大挑战。尽管存在这些困难,我们仍然可以使用优秀的 NLP 工具,例如使用 PyTorch 的 Python。现在,让我们简要讨论一下 PyTorch 在 NLP 中的应用。

回想一下,我们已经看到过 PyTorch 如何用于构建神经网络的例子,而神经网络在 NLP 中是常用的。在本节中,我们将研究一些对 NLP 特别有用的关键 PyTorch 模块和类。具体来说,torch.nn 模块提供了一系列用于构建 CNN、RNN 等神经网络的类,以及 ReLU、Sigmoid 等激活函数。torch.optim 模块提供了各种优化算法,如随机梯度下降 (SGD)、RMSprop、Adam 等,可用于训练神经网络。回想一下,我们曾在神经网络模型中使用 Adam 优化算法对手写数字图像进行分类。不过,请记住,我们的模型是使用 Keras 实现的。torch.utils.data 模块提供了一套用于处理数据集和加载数据的工具。torch.utils.data 提供的主要类是 Dataset 和 DataLoader,它们分别提供了访问数据和从数据集中加载样本的接口。

PyTorch 不仅提供了上述标准功能,还提供了一个名为 TorchText 的 NLP 专用库。TorchText 提供了大量数据处理功能和多个 NLP 数据集。它由五个主要类组成:data、datasets、nn、utils 和 vocab。为了说明其工作原理,让我们来看一个简单的示例,演示如何使用 TorchText(导入为 torchtext)进行文本处理。请看下图中名为 torch1.py 的 Python 脚本(为便于解释,添加了行号)。

1. import torchtext
2. from torchtext.data import get_tokenizer
3. from torchtext.data.utils import ngrams_iterator
4. tokenizer = get_tokenizer(“basic_english”)
5. tokens = tokenizer(“Be the change you wish to see in the world”)
6. print(tokens)
7. print(list(ngrams_iterator(tokens, 2)))

上图所示的 Python 脚本可以找到字符串中的词块,并打印出由这些词块组成的所有词块。但首先,我们需要了解什么是 n-gram。n-gram 是由给定文本或语音样本中的 n 个词组组成的连续序列。大词表是 n-gram 的一种特例,其中 n 为 2。但为什么大词表或 n-gram 在 NLP 中至关重要呢?通常,从文本或语音中获取更多信息时,需要考虑的是 n-gram,而不是单个单词。例如,如果一个词前面有定冠词 “the”,这通常表明该词是在特定意义上而非一般意义上使用的。例如,考虑字符串 “the book”;它指的是之前提到的特定书籍,而单词 “a book “指的是任何书籍,没有指定特定的书籍。

现在,让我们逐行查看代码。在我们的脚本 torch1.py 中,我们将字符串中的单词视为标记。第 1 行导入了 torchtext 库。第 2 行和第 3 行导入了 get_tokenizer( ) 和 ngrams_iterator( ) 方法。第 4 行定义了一个标记化器,它将字符串分割成规范化后的标记。第 5 行在字符串 “Be the change you wish to see in the world “上应用标记符。第 6 行打印生成的标记。最后,第 7 行打印由这些标记形成的所有 bigrams。图 3 显示了 Python 脚本 torch1.py 的输出结果。如果将第 7 行替换为 “print(list(ngrams_iterator(tokens, 3)))”,那么就会打印出所有由生词组成的三叉星图。三段论是 n-gram 的另一种特例,其中 n 为 3。PyTorch 是一个通用的机器学习框架,具有许多 NLP 功能。不过,也有专门为 NLP 设计的库。接下来,我们将讨论一个名为自然语言工具包(NLTK)的库。

人工智能:自然语言处理入门
图 3:用于 NLP 的 PyTorch

使用 NLTK 进行 NLP
NLTK 是一个符号和统计 NLP Python 库。它是根据 Apache License 2.0 版授权的免费开源软件。NLTK 可用于文本处理、标记化、语音部分标记、情感分析等。像往常一样,在 Anaconda Navigator 的帮助下可以轻松安装 NLTK。现在,让我们看看如何使用 NLTK 编写类似 torch1.py 的 Python 脚本。请看下图所示的程序 nltk1.py,它可以找到字符串中的词块,并打印由识别出的词块组成的所有词块(为便于解释,添加了行号)。

1. import nltk
2. from nltk.tokenize import word_tokenize
3. tokens = nltk.word_tokenize(“Be the change you wish to see in the world”)
4. print(tokens)
5. print(list(nltk.ngrams(tokens, 2)))

现在让我们逐行查看代码。第 1 行导入了 nltk 库。第 2 行导入 word_tokenize( ) 方法。第 3 行在字符串 “Be the change you wish to see in the world “上应用 word_tokenize( ) 函数。第 4 行打印生成的词块,最后,第 5 行打印由这些词块组成的所有 bigrams。图 4 显示了 Python 脚本 nltk1.py 的输出结果。如果将第 5 行替换为代码 “print(list(ngltk.ngrams(tokens, 3))”, 则会打印出所有由标记形成的三叉星图。请注意,NLTK 还提供了一个名为 bigrams( ) 的函数,它可以从一组词素生成所有的 bigrams。

人工智能:自然语言处理入门图 4:使用 NLTK 查找大词簇

现在,让我们熟悉一下打印字符串解析树的 Python 脚本。首先,让我们来了解一下什么是解析树。解析树以图形的形式表示句子的句法结构,树中的每个节点代表句子的一部分。构建解析树的方法是将句子分解成各个部分,并根据语法关系将它们归类为短语。解析树在 NLP 中非常重要,因为它有助于理解句子的语法结构。现在,请看下图所示的 Python 脚本 nltk2.py,它可以为给定的字符串生成一棵解析树(为便于解释,添加了行号)。

1. from nltk.corpus.reader.bracket_parse import BracketParseCorpusReader
2. corpus_root = ‘/media/deepu/Data
3. corpus = BracketParseCorpusReader(corpus_root, r’.*\.mrg’)
4. tree = corpus.parsed_sents(‘test.mrg’)[0]
5. tree.draw()

在了解代码如何工作之前,我们需要先讨论一下树库。根据维基百科的解释,”在语言学中,树状库是一个经过解析的文本语料库,用于注释句法或语义句子结构”。我想这不是一个非常简单的解释。那么,就把树状库看作是将不同单词标记为英语不同语篇中的一个语篇的数据集吧。当然,这未免过于简单化了。在英语中,八个语篇分别是名词、动词、形容词、副词、代词、介词、连词和感叹词。如果您对这些概念不熟悉,我建议您暂停一下,至少阅读一下维基百科上题为 “语篇 “的文章。如果您打算广泛学习 NLP,我建议您接受语言学专家的适当培训。宾夕法尼亚大学维护的数据集宾夕法尼亚树库(PTB)是最受欢迎的树库之一。PTB 包含 400 多万个注释词。要生成解析树,可以使用 nltk.corpus 模块提供的 “treebank.parsed_sents( ) “方法访问 PTB 中的样本文件。不过,PTB 中的样本文件相对较大,而且难以理解。因此,我手动创建了一个 PTB 格式的简单文件(扩展名为 .mrg 的文件)。该示例文件名为 test.mrg,如下所示,包含 “I am Deepu “句子的 PTB 格式。

(S (NP (PRP I)) (VP (VBP am) (NP (NNP Deepu))))
上面的文件表示一种简单的树形结构,可以将给定句子显示为短语的层次结构。首先,主语 “I “显示为名词短语(NP),谓语 “am Deepu “显示为动词短语(VP)。然后,在下一级结构中,”I “作为人称代词(PRP),”am “作为基本形式动词(VBP),”Deepu “作为名词短语(NP)。最后,在最后一层,”Deepu “作为专有名词(NNP)出现。现在,让我们逐行理解 Python 脚本 nltk2.py。第 1 行导入了用于读取 PTB 格式文件的 BracketParseCorpusReader( ) 方法。第 2 行存储包含 PTB 格式测试文件的目录路径。第 3 行使用 BracketParseCorpusReader( ) 方法定义一个能够读取和处理 PTB 等格式文件的阅读器。第 4 行读取以 PTB 格式存储的名为 test.mrg 的测试文件。最后,第 5 行从 test.mrg 文件中为字符串 “I am Deepu “绘制解析树。图 5 显示了 Python 脚本 nltk2.py 生成的解析树。

人工智能:自然语言处理入门
图 5:解析树示例

NLTK 还为 NLP 提供了许多其他功能。请记住,我们通常需要下载数据集和解析器才能使用 NLTK。在使用 NLTK 时可以下载和使用的解析器的一个例子是斯坦福解析器。关于解析器和用于构建解析器的无上下文文法(CFG)的详细讨论超出了我们的讨论范围。不过,对于求知欲极强的学生,我建议他们阅读由 John E. Hopcroft、Rajeev Motwani 和 Jeffrey D. Ullman 合著的流行教科书《自动机理论、语言和计算导论》(Introduction to Automata Theory, Languages, and Computation)。但请记住,”计算理论 “是计算机科学中相对较难学习的领域。现在,让我们把重点转移到数据科学上来。

PySpark 简介
如果你还记得本系列第一篇文章中的维恩图,你就会知道数据科学与人工智能和机器学习有交集。数据科学还包括大数据分析等子领域,通常不涉及人工智能或机器学习。本节重点介绍使用 Python 中 Apache Spark 的接口 PySpark 开发基于 NLP 的数据科学应用程序。Apache Spark 是一个用于大规模数据处理的开源分析引擎。它由 Scala 编写,采用 Apache License 2.0 版本授权。

现在让我们来谈谈 PySpark 的意义,它由机器学习驱动。它有三个主要模块:用于结构化数据和 DataFrames 的 pyspark.sql、用于高级 API 机器学习模型的 pyspark.ml,以及用于低级 API 机器学习模型的 pyspark.mllib。虽然 Apache Hadoop 是一个广泛使用的大数据分析框架,但它缺乏人工智能和机器学习功能。不过,PySpark 可以与 Hadoop 结合,为其提供人工智能和机器学习的强大功能。PySpark 为大数据处理提供分布式计算和 API,而 Hadoop 则为处理大型数据集提供存储、可扩展性和容错性。与 Hadoop 的结合使 PySpark 成为数据科学和大数据分析的重要工具。

现在,让我们在系统中安装 PySpark。像往常一样,可以使用 Anaconda Navigator 安装 PySpark。不过,如果在终端执行 “pip3 install pyspark[sql,ml,mllib]”命令,所有三个重要的 PySpark 模块都将立即安装。你可以自由地使用这两种方法安装 PySpark。安装完成后,在终端中执行 “pyspark -master local[*]”命令,以本地机器作为主控启动 PySpark 交互式 shell,同时使用所有可用的内核进行并行处理。

人工智能:自然语言处理入门

图 6 显示了 PySpark 交互式 shell。

现在让我们来看看下图中名为 spark.py 的简单 Python 脚本,它使用 PySpark 从系统中读取 CSV 文件并在终端上显示其内容(为便于解释,添加了行号)。

1. from pyspark.sql import SparkSession
2. spark = SparkSession.builder.appName(“ReadCSV”).getOrCreate()
3. df = spark.read.csv(“cricket.csv”, header=True, inferSchema=True)
4. df.show(5)

首先,让我们了解一下 Python 脚本 spark.py 的工作原理。第 1 行从 PySpark 库中的 pyspark.sql 模块导入了 SparkSession 类。SparkSession 类提供了使用 PySpark 操作数据的方法,用于在分布式计算环境中创建数据帧和执行 SQL 查询。第 2 行创建了一个名为 spark 的 SparkSession 对象。getOrCreate( ) 方法用于获取现有的 SparkSession,或者在不存在 SparkSession 的情况下创建一个新的 SparkSession。第 3 行读取名为 cricket.csv 的 CSV 文件。最后,第 4 行打印 CSV 文件 cricket.csv 的前五行。图 7 显示了 Python 脚本 spark.py 的输出。

人工智能:自然语言处理入门
图 7:Python 脚本 spark.py 的输出结果

现在,让我们来解决一个关键问题:很久以前,我们曾使用 Pandas 完成过同样的任务。那么,PySpark 的必要性何在?Pandas 是处理和分析中小型数据集的绝佳工具,而 PySpark 则是一个可扩展的分布式计算平台,专为管理海量数据而设计。如果您的数据集较大,PySpark 是更好的选择。Pandas 只适用于不需要分布式系统的中小型数据集。

现在,是时候结束本文了。在这里,我们首先深入研究了神经网络的理论,然后将注意力转向了 NLP。我们利用 PyTorch 和 NLTK 来了解 NLP。之后,我们介绍了 PySpark,这标志着我们在本系列文章中首次涉足数据科学和大数据分析领域。在本系列的下一篇文章中,我们将重点讨论使用人工智能和机器学习的计算机视觉,并重新认识实时计算机视觉库 OpenCV。

转自 AI: An Introduction to Natural Language Processing (opensourceforu.com)