nlp文本分类-torchtext学习

1、torchtext安装

pip install https://github.com/pytorch/text/archive/master.zip 

nlp文本分类-torchtext学习_第1张图片

2、torchtext介绍
torchtext官方文档.
A Comprehensive Introduction to Torchtext.
Language modeling tutorial in torchtext

如果您曾经为NLP进行过深度学习项目,那么您会知道所有预处理都是多么痛苦和乏味。在开始训练模型之前,您必须:

  1. 从磁盘读取数据
  2. 标记文本
  3. 创建从单词到唯一整数的映射
  4. 将文本转换为整数列表
  5. 以您的深度学习框架所需的任何格式加载数据
  6. 填充文本,以使所有序列具有相同的长度,因此您可以批量处理它们

Torchtext 是一个使上述所有处理变得更加容易的库。尽管它仍然相对较新,但其便利的功能(尤其是在批处理和加载方面)使它成为值得学习和使用的库。
1.概述
Torchtext遵循以下基本公式将数据转换为神经网络的有效输入:nlp文本分类-torchtext学习_第2张图片

Torchtext以文本文件,csv / tsv文件,json文件和目录的形式(截至目前)接收原始数据,并将其转换为数据集。数据集是经过预处理的数据块,具有各种字段,可以读取到内存中。它们是其他数据结构可以使用的处理数据的规范形式。

然后,Torchtext将数据集传递给迭代器。迭代器处理数字化,批处理,打包并将数据移至GPU。基本上,它完成了将数据传递到神经网络所需的所有繁重工作。

3、torchtext预处理流程

  • 定义Field:声明如何处理数据 定义
  • Dataset:得到数据集,此时数据集里每一个样本是一个 经过 Field声明的预处理 预处理后的 wordlist
  • 建立vocab:在这一步建立词汇表,词向量(word embeddings)
  • 构造迭代器:构造迭代器,用来分批次训练模型

3.1、定义Field------Field对象指定要如何处理某个字段.
Torchtext采用了一种声明式的方法来加载数据:你来告诉Torchtext你希望的数据是什么样子的,剩下的由torchtext来处理。
实现这种声明的是Field,Field确定了一种你想要怎么去处理数据。
data.Field(…)

	ID = Field(sequential=False, use_vocab=False)
    CATEGORY = LabelField(sequential=False, use_vocab=True, is_target=True)
    NEWS = Field(
        sequential=True,
        tokenize=jieba.lcut,
        include_lengths=True,
    )
'''
参数:
field在默认的情况下都期望一个输入是一组单词的序列,并且将单词映射成整数。
这个映射被称为vocab。如果一个field已经被数字化了并且不需要被序列化,
可以将参数设置为use_vocab=False以及sequential=False。
use_vocab是将单词映射成整数。默认值:True。
sequential是否表示顺序数据。默认值:True
tokenize用于将使用此字段将字符串标记为顺序示例的函数。如果是“spacy”,则使用SpaCy标记器。如果将非序列化函数作为参数传递,则该字段将无法序列化。默认值:string.split。
因此,如果希望使用spacy,在前面的tokenize部分要加上tokenize = lambda x: x.split('spacy')
fix_length使用此字段的所有示例都将填充到的固定长度,或者对于灵活的序列长度,为None。默认值:无。
include_lenges:返回填充的小批量的元组和包含每个示例长度的列表,还是只返回填充的小批量。默认值:False。
'''

nlp文本分类-torchtext学习_第3张图片nlp文本分类-torchtext学习_第4张图片

3.2、构建数据集------
Torchtext中有各种内置的数据集,用于处理常见的数据格式。对于csv / tsv文件、or JSON format.
Fields知道如何处理原始数据,用户告诉Fields去哪里处理,在这里就要使用Dataset。torchtext内置有Dataset。


 fields = [
        ('id', ID),
        ('category_code', None),# 我们不会需要category_code,所以我们传入的filed是None
        ('category', CATEGORY),
        ('news', NEWS),
    ]
 dataset = TabularDataset(
        os.path.join(args.data_dir, f'{mode}.csv'), # 文件路径
        format='csv',
        fields=fields,
        csv_reader_params={'delimiter': '\t'},# 以tab键分割
    )
    '''
    path(str)–数据文件的路径。
	format(str)–数据文件的格式。“ CSV”,“ TSV”或“ JSON”之一(不区分大小写)。
栏位(清单(元组(str,Field))–
	tuple(str,Field)]:如果使用列表,则格式必须为CSV或TSV,并且列表的值应为(名称,字段)的元组。字段的顺序应与CSV或TSV文件中的列的顺序相同,而(name,None)的元组表示将被忽略的列。
如果使用字典,则密钥应为JSON密钥或CSV / TSV列的子集,并且值应为(名称,字段)的元组。输入字典中不存在的键将被忽略。这允许用户从其JSON / CSV / TSV密钥名称中重命名列,还可以选择要加载的列子集。
	skip_header(bool)–是否跳过输入文件的第一行。如果你的csv有表头, 确保这个表头不会作为数据处理
	csv_reader_params(dict)–传递给csv阅读器的参数。仅在格式为csv或tsv时才相关。有关 更多详细信息,请参见
    '''
from torch.text import data
import jieba

# 定义分词工具
def tokenizer(text):    
    return [wd for wd in jieba.cut(text, cut_all=False)]

# 定义停用词表
stopwords = open('stopwords', encoding='utf-8').read().strip().split('\n')

# 定义text和label的Field对象,相关参数说明见下
TEXT = data.Field(sequential=True, use_vocab=True, fix_length=20, tokenize=tokenizer, stop_words=stopwords, batch_first=True)
LABEL = data.Field(sequential=False, use_vocab=False)

# 划分数据集,相关参数说明见下
train, val = data.TabularDataset.splits(
path='./data', train='train_corpus.csv',validation='valid_corpus.csv',format='csv', 
skip_header=True, csv_reader_params={'delimiter': '\t'},fields =[('text',TEXT),('label',LABEL)] )

# 根据训练数据,生成词汇表
TEXT.build_vocab(train)

3.3 - 建立vocab:在这一步建立词汇表,词向量(word embeddings)
可以看到,句子已经被分词了,但是没有转化为数字。
这是因为我们还没有建立vocab,我们将在下一步建立vocab。
Torchtext将单词映射为整数,但必须告诉它应该处理的全部单词。 在我们的例子中,我们可能只想在训练集上建立词汇表,所以我们运行代码:
TEXT.build_vocab(trn)。
这使得torchtext遍历训练集中的所有元素,检查TEXT字段的内容,并将其添加到其词汇表中。Torchtext有自己的Vocab类来处理词汇。Vocab类在stoi属性中包含从word到id的映射,并在其itos属性中包含反向映射。 除此之外,它可以为word2vec等预训练的embedding自动构建embedding矩阵。Vocab类还可以使用像max_size和min_freq这样的选项来表示词汇表中有多少单词或单词出现的次数。未包含在词汇表中的单词将被转换成。
TEXT.build_vocab(train, vectors=“glove.6B.100d”),可以给vectors直接传入一个字符串类型的,那么会自动下载你需要的词向量,存放的位置是./.vector_cache 的文件夹下,或者可以使用类vocab.Vectors指定你自己的词向量。

你可能感兴趣的:(nlp文本分类)