提交 bf82ef0b 编写于 作者: W wizardforcel

2021-01-16 22:46:35

上级 473f2eef
......@@ -438,7 +438,7 @@ My favourite language is ___
有了这个,我们可以计算出出现 Python 的概率,假设前一个单词*为*出现的概率仅为 20%,而*英语*出现的概率仅为 10%。 我们可以进一步扩展此模型,以使用我们认为适当的来表示单词的三元组或任何 n 元组。 我们已经证明,可以使用 n-gram 语言建模将关于单词之间的相互关系的更多信息引入我们的模型,而不必天真地假设单词是独立分布的。
# 令牌化
# 分词
接下来,我们将学习 NLP 的分词化,这是一种预处理文本的方式,可以输入到模型中。 标记化将我们的句子分成较小的部分。 这可能涉及将一个句子拆分成单个单词,或者将整个文档分解成单个句子。 这是 NLP 必不可少的预处理步骤,可以在 Python 中相当简单地完成:
......
......@@ -191,7 +191,7 @@ tokenized = [clean_text 中 x 的 word_tokenize(x)]
all_text = []
对于令牌化的令牌:
对于分词的令牌:
对于令牌中的 t:
......
......@@ -137,13 +137,13 @@ CNN 背后的基本概念是卷积。 **卷积**本质上是一个滑动窗口
按着这些次序:
1. We first import the data and dataset functions from TorchText:
1. 我们首先从TorchText导入数据和数据集函数。
从 torchtext 导入数据
从 torchtext 导入数据集中
2. Next, we create a field and label field we can use with the **TorchText** package. These define the initial processing steps our model will use to process our data:
2. 接下来,我们创建一个字段和标签字段,我们可以使用`TorchText`包。这些定义了我们的模型将用于处理我们的数据的初始处理步骤。
问题= data.Field(令牌=“ spacy”,batch_first =真)
......@@ -157,7 +157,7 @@ CNN 背后的基本概念是卷积。 **卷积**本质上是一个滑动窗口
这将安装`spacy`并下载英语单词索引。
3. We also define the data type for our labels as floats, which will allow us to calculate our losses and gradients. After defining our fields, we can use these to split our input data. Using the **TREC** dataset from **TorchText**, we pass this our questions and labels fields in order to process the dataset accordingly. We then call the **split** function in order to automatically divide our dataset into a training set and a validation set:
3. 我们还将标签的数据类型定义为浮动,这将允许我们计算损失和梯度。在定义了我们的字段之后,我们可以使用这些字段来分割我们的输入数据。使用`TorchText`**TREC** 数据集,我们将我们的问题和标签字段传递给这个数据集,以便对数据集进行相应的处理。然后,我们调用`split`函数,以便将我们的数据集自动划分为一个训练集和一个验证集。
train_data,_ =数据集。TREC.splits(问题,标签)
......@@ -245,7 +245,7 @@ batch_size = 64,
现在我们已经加载了数据,现在可以创建模型了。 我们将使用以下步骤进行操作:
1. We wish to build the structure of our CNN. We begin as usual by defining our model as a class that inherits from **nn.Module**:
1. 我们希望建立我们CNN的结构。我们像往常一样,首先将我们的模型定义为一个继承自`nn.Module`的类。
CNN(nn.Module)类:
......@@ -253,13 +253,13 @@ batch_size = 64,
super().__ init __()
2. Our model is initialized with several inputs, all of which will be covered shortly. Next, we individually define the layers within our network, starting with our embedding layer:
2. 我们的模型是用几个输入来初始化的,所有的输入都会在后面介绍。接下来,我们分别定义网络中的层,从嵌入层开始。
self.embedding = nn.Embedding(vocab_size,embedding_dim,padding_idx = pad_idx)
嵌入层将由词汇表中每个可能单词的嵌入组成,因此该层的大小是词汇表的长度和嵌入向量的长度。 我们正在使用 200 维 GLoVe 向量,因此在这种情况下,长度为`200`。 我们还必须传递 padding 索引,该索引是我们嵌入层的索引,用于使嵌入填充我们的句子,以便它们的长度相同。 我们将在稍后初始化模型时手动定义此嵌入。
3. Next, we define the actual convolutional layers within our network:
3. 接下来,我们定义我们网络中的实际卷积层。
self.convs = nn.ModuleList([
......@@ -273,7 +273,7 @@ batch_size = 64,
])
4. We start by using **nn.ModuleList** to define a series of convolutional layers. **ModuleList** takes a list of modules as input and is used when you wish to define a number of separate layers. As we wish to train several different convolutional layers of different sizes on our input data, we can use **ModuleList** to do so. We could theoretically define each layer separately like so:
4. 我们首先使用`nn.ModuleList`来定义一系列卷积层。`ModuleList`接受一个模块列表作为输入,当你希望定义一些单独的层时,就可以使用它。由于我们希望在输入数据上训练多个不同大小的卷积层,我们可以使用`ModuleList`来实现。理论上我们可以像这样分别定义每个层。
self.conv_2 = nn.Conv2d(in_channels = 1,
......
......@@ -113,7 +113,7 @@
我们将从提取数据并对其进行预处理开始。 我们将再次使用`spacy`,其中包含内置词汇表,可用于标记数据:
1. We start by loading our **spacy** tokenizers into Python. We will need to do this once for each language we are using since we will be building two entirely separate vocabularies for this task:
1. 我们首先将`spacy`分词器加载到Python中。我们需要为每一种语言做一次,因为我们将为这个任务构建两个完全独立的词汇表。
spacy_german = spacy.load(‘de’)
......@@ -123,7 +123,7 @@
您可能需要通过执行以下操作从命令行安装德语词汇表(我们在上一章中安装了英语词汇表):`python3 -m spacy download de`
2. Next, we create a function for each of our languages to tokenize our sentences. Note that our tokenizer for our input English sentence reverses the order of the tokens:
2. 接下来,我们为每种语言创建一个函数来标记我们的句子。请注意,我们为输入的英语句子创建的分词器将标记的顺序颠倒了。
def tokenize_german(文字):
......@@ -149,7 +149,7 @@
如果我们要计算逆向和非逆向变体的输入单词与它们的输出对应单词之间的总距离,我们会发现它们是相同的。 但是,我们之前已经看到输出语句中最重要的单词是第一个单词。 这是因为输出句子中的单词取决于它们之前的单词。 如果我们错误地预测了输出句子中的第一个单词,那么我们句子中的其余单词很可能也会被错误地预测。 但是,通过正确预测第一个单词,我们可以最大程度地正确预测整个句子。 因此,通过最小化输出句子中第一个单词与其输入对应单词之间的距离,我们可以提高模型学习这种关系的能力。 这增加了该预测正确的机会,从而最大化了正确预测整个输出句子的机会。
3. With our tokenizers constructed, we now need to define the fields for our tokenization. Notice here how we append start and end tokens to our sequences so that our model knows when to begin and end the sequence’s input and output. We also convert all our input sentences into lowercase for the sake of simplicity:
3. 构造好分词后,我们现在需要定义分词的字段。请注意我们如何在序列中添加开始和结束标记,以便我们的模型知道序列的输入和输出何时开始和结束。为了简单起见,我们还将所有输入句子转换为小写。
源=字段(tokenize = tokenize_english,
......
......@@ -174,7 +174,7 @@ pip install torchtext
# 还有更多...
我们可以为特定于某种语言的令牌化设置用于令牌化的语言,该语言支持 spacy 支持的语言。 我们可以使用`pad_token`参数设置自定义填充令牌。 我们可以在标记化之后但在数字化之前使用该字段定义将应用于示例的处理管道,在数字化之后但使用`preprocessing``postprocessing`参数将数字转换为张量之前,我们可以执行相同的操作。 `stop_words`参数可用于删除在预处理时需要删除的令牌。 此外,还有一种专门用于标签字段的字段类型`LabelField`,它可以代替普通字段使用。
我们可以为特定于某种语言的分词设置用于分词的语言,该语言支持 spacy 支持的语言。 我们可以使用`pad_token`参数设置自定义填充令牌。 我们可以在标记化之后但在数字化之前使用该字段定义将应用于示例的处理管道,在数字化之后但使用`preprocessing``postprocessing`参数将数字转换为张量之前,我们可以执行相同的操作。 `stop_words`参数可用于删除在预处理时需要删除的令牌。 此外,还有一种专门用于标签字段的字段类型`LabelField`,它可以代替普通字段使用。
# 也可以看看
......
......@@ -249,7 +249,7 @@ pip install torchtext
`torchtext`有两个主要模块:`Data`模块和`Datasets`模块。 如官方文档所述,`Data`模块承载了多个数据加载器,抽象和文本迭代器(包括词汇和单词向量),而`Datasets`模块则为常见的 NLP 任务预先构建了数据集。
在此示例中,我们将使用`Data`模块加载以制表符分隔的数据,并使用 spaCy 的令牌化对其进行预处理,然后再将文本转换为向量。
在此示例中,我们将使用`Data`模块加载以制表符分隔的数据,并使用 spaCy 的分词对其进行预处理,然后再将文本转换为向量。
```py
spacy_en = spacy.load('en')
......@@ -268,9 +268,9 @@ train, val, test = data.TabularDataset.splits(
上一小节的第一部分在 spaCy 中加载英语,并定义了分词器功能。 下一部分是使用`torchtext.data.Field`定义输入和输出字段的位置。 `Field`类用于定义将数据加载到`DataLoader`之前的预处理步骤。
在所有输入语句之间共享`Field`变量`TEXT`,并且在所有输出标签之间共享`Field`变量`LABEL`。 该示例中的`TEXT`设置为顺序的,这告诉`Field`实例数据是顺序相关的,并且标记化是将其分成较小块的更好选择。 如果`sequential`设置为`False`,则不会对数据应用令牌化
在所有输入语句之间共享`Field`变量`TEXT`,并且在所有输出标签之间共享`Field`变量`LABEL`。 该示例中的`TEXT`设置为顺序的,这告诉`Field`实例数据是顺序相关的,并且标记化是将其分成较小块的更好选择。 如果`sequential`设置为`False`,则不会对数据应用分词
由于`sequential``TEXT``True`,因此我们开发的标记化函数设置为`tokenizer`。 该选项默认为 Python 的`str.split`,但是我们需要更智能的令牌化功能,而 spaCy 的令牌化功能可以为我们提供帮助。
由于`sequential``TEXT``True`,因此我们开发的标记化函数设置为`tokenizer`。 该选项默认为 Python 的`str.split`,但是我们需要更智能的分词功能,而 spaCy 的分词功能可以为我们提供帮助。
常规 NLP 管道所做的另一个重要修改是将所有数据转换为相同的情况。 将`lower`设置为`True`会发生这种情况,但是默认情况下是`False`。 除了示例中给出的三个参数外,`Field`类还接受许多其他参数,其中包括`fix_length`以固定序列的长度; `pad_token`,默认为`<pad>`,用于填充序列以匹配`fixed_length`或批量中最长序列的长度; 和`unk_token`(默认为`<unk>`),用于替换没有词汇向量的标记。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册