其他分享
首页 > 其他分享> > 使用torchtext导入NLP数据集

使用torchtext导入NLP数据集

作者:互联网

如果你是pytorch的用户,可能你会很熟悉pytorch生态圈中专门预处理图像数据集的torchvision库。从torchtext这个名字我们也能大概猜到该库是pytorch圈中用来预处理文本数据集的库,但这方面的教程网络上比较少,今天我就讲讲这个特别有用的文本分析库。

简介
torchtext在文本数据预处理方面特别强大,但我们要知道ta能做什么、不能做什么,并如何将我们的需求用torchtext实现。虽然torchtext是为pytorch而设计的,但是也可以与keras、tensorflow等结合使用。官方文档地址 https://torchtext.readthedocs.io/en/latest/index.html


# 安装

!
pip3 install torchtext

自然语言处理预处理的工作流程:

  1. Train/Validation/Test数据集分割

  2. 文件数据导入(File Loading)

  3. 分词(Tokenization) 文本字符串切分为词语列表

  4. 构建词典(Vocab) 根据训练的预料数据集构建词典

  5. 数字映射(Numericalize/Indexify) 根据词典,将数据从词语映射成数字,方便机器学习

  6. 导入预训练好的词向量(word vector)

  7. 分批(Batch) 数据集太大的话,不能一次性让机器读取,否则机器会内存崩溃。解决办法就是将大的数据集分成更小份的数据集,分批处理

  8. 向量映射(Embedding Lookup) 根据预处理好的词向量数据集,将5的结果中每个词语对应的索引值变成 词语向量

上面8个步骤,torchtext实现了2-7。第一步需要我们自己diy,好在这一步没什么难度
使用torchtext导入NLP数据集
一、数据集分割
一般我们做机器学习会将数据分为训练集和测试集,而在深度学习中,需要多轮训练学习,每次的学习过程都包括训练和验证,最后再进行测试。所以需要将数据分成训练、验证和测试数据。

使用torchtext导入NLP数据集
1.1 参数解读
split_csv(infile, trainfile, valtestfile, seed, ratio)

经过上面的操作,我们已经构建出实验所需的数据:

二、分词
导入的数据是字符串形式的文本,我们需要将其分词成词语列表。英文最精准的分词器如下:
使用torchtext导入NLP数据集
Run

使用torchtext导入NLP数据集
三、 导入数据
torchtext中使用torchtext.data.TabularDataset来导入自己的数据集,并且我们需要先定义字段的数据类型才能导入。要按照csv中的字段顺序来定义字段的数据类型,我们的csv文件中有两个字段(label、text)
使用torchtext导入NLP数据集
使用torchtext导入NLP数据集

使用torchtext导入NLP数据集
Run

<torchtext.data.dataset.TabularDataset

at
0
x120d8ab38

四、构建词典
根据训练(上面得到的train)的预料数据集构建词典。这两有两种构建方式,一种是常规的不使用词向量,而另一种是使用向量的。区别仅仅在于vectors是否传入参数
使用torchtext导入NLP数据集
4.1 TEXT是Field对象,该对象的方法有

使用torchtext导入NLP数据集
使用torchtext导入NLP数据集

Run
使用torchtext导入NLP数据集
词典-词语列表形式,这里只显示前20个
使用torchtext导入NLP数据集
词典-字典形式
使用torchtext导入NLP数据集
4.2 注意
train数据中生成的词典,里面有,这里有两个要注意:

词语you对应的词向量
使用torchtext导入NLP数据集

4.3 计算词语的相似性
得用词向量构建特征工程时能保留更多的信息量(词语之间的关系)

使用torchtext导入NLP数据集

而这里我们粗糙的用余弦定理计算词语之间的关系,没有近义反义关系,只能体现出距离远近(相似性)。

使用torchtext导入NLP数据集
Run


[[
1.

0.83483314
]

[
0.83483314

1.

]]

五、get_dataset函数
相似的功能合并成模块,可以增加代码的可读性。这里我们把阶段性合并三四的成果get_dataset函数

from
 torchtext 
import
 data

import
 torchtext

import
 torch

import
 logging

LOGGER 
=
 logging
.
getLogger
(
"导入数据"
)

def
 get_dataset
(
stop_words
=
None
):

#定义字段的数据类型

    LABEL 
=
 data
.
LabelField
(
dtype 
=
 torch
.
float
)

    TEXT 
=
 data
.
Field
(
tokenize 
=
 tokenize1
,

                      lower
=
True
,

                      fix_length
=
100
,

                      stop_words
=
stop_words
)

    LOGGER
.
debug
(
"准备读取csv数据..."
)

    train
,
 valid
,
 test 
=
 data
.
TabularDataset
.
splits
(
path
=
'data'
,

#数据所在文件夹

                                         train
=
'dataset_train.csv'
,

                                         validation
=
'dataset_valid.csv'
,

                                         test 
=

'test.csv'
,

                                         format
=
'csv'
,

                                         skip_header
=
True
,

                                         fields 
=

[(
'label'
,
 LABEL
),(
'text'
,
 TEXT
)])

    LOGGER
.
debug
(
"准备导入词向量..."
)

    vectors 
=
 torchtext
.
vocab
.
Vectors
(
name 
=

'glove.6B.100d.txt'
,

                                      cache 
=

'data/'
)

    LOGGER
.
debug
(
"准备构建词典..."
)

    TEXT
.
build_vocab
(

        train
,

        max_size
=
2000
,

        min_freq
=
50
,

        vectors
=
vectors
,

        unk_init 
=
 torch
.
Tensor
.
normal_
)

    LOGGER
.
debug
(
"完成数据导入!"
)

return
 train
,
valid
,
 test
,
 TEXT

get_dataset函数内部参数解读
data.Field(tokenize,fix_length)定义字段

data.TabularDataset.splits(train, validation,test, format,skip_header,fields)读取训练验证数据,可以一次性读取多个文件

torchtext.vocab.Vectors(name, cache)导入词向量数据文件

TEXT.buildvocab(maxsize,minfreq,unkinit) 构建词典,其中

六、分批次
数据集太大的话,一次性让机器读取容易导致内存崩溃。解决办法就是将大的数据集分成更小份的数据集,分批处理


def
 split2batches
(
batch_size
=
32
,
 device
=
'cpu'
):

    train
,
 valid
,
 test
,
 TEXT 
=
 get_dataset
()

#datasets按顺序包含train、valid、test三部分

    LOGGER
.
debug
(
"准备数据分批次..."
)

    train_iterator
,
 valid_iterator
,
 test_iterator 
=
 data
.
BucketIterator
.
splits
((
train
,
 valid
,
 test
),

                                                                               batch_size 
=
 batch_size
,

                                                                               sort 
=

False
,

                                                                               device 
=
 device
)

    LOGGER
.
debug
(
"完成数据分批次!"
)

return
 train_iterator
,
 valid_iterator
,
 test_iterator
,
 TEXT

6.1参数解读
split2batches(batch_size=32, device=0)

train_iterator
,
valid_iterator
,
test_iterator
,
TEXT

split2batches
()

train_iterator


Run

<torchtext.data.iterator.BucketIterator

at
0
x12b0c7898

查看train_iterator数据类型


type
(
train_iterator
)

torchtext
.
data
.
iterator
.
BucketIterator

6.2BucketIterator对象
这里以trainiterator为例(validiterator, test_iterator都是相同的对象)。因为本例中数据有两个字段label和text,所以

使用torchtext导入NLP数据集

获取train_iterator的dataset


train_iterator
.
dataset

<torchtext.data.dataset.TabularDataset

at
 0
x12e9c57b8
>

获取train_iterator中的第8个对象


train_iterator
.
dataset
.
examples
[
7
]

<torchtext.data.example.Example

at
 0
x12a82dcf8

获取train_iterator中的第8个对象的lebel字段的内容


train_iterator
.
dataset
.
examples
[
7
].
label

'ham'

获取train_iterator中的第8个对象的text字段的内容


train_iterator
.
dataset
.
examples
[
7
].
text
[
'were'
,

'trying'
,

'to'
,

'find'
,

'chinese'
,

'food'
,

'place'
,

'around'
,

'here'
]

总结
到这里我们已经学习了torchtext的常用知识。使用本代码要注意:

标签:NLP,iterator,导入,dataset,torchtext,train,csv,数据
来源: https://blog.51cto.com/15069487/2579117