TorchText-DAY1

TorchText-DAY1

TorchTextはテキストを処理するためのツールであり、Pytorchのサブプロジェクトです。

公式文書:https://pytorch.org/text/stable/data.html

次のコンポーネントがあります。

  • torchtext.data.Field:このクラスは、フィールドのいくつかの処理メソッドを定義するために使用されます(フィールドにはテキストフィールドとラベルフィールドが含まれます)

  • torchtext.data.Datasets:データセットクラス。[データファイルパス]と[フィールド]に従ってデータセットを生成します。__getitem__メソッドを使用して、Exampleインスタンスを取得します。

  • torchtext.data.Iterator:イテレータ。[Datasets]インスタンスに従ってバッチでローダーを取得します。

  • torchtext.data.Example:サンプル、データ+ラベルを表すために使用されます。

  • torchtext.vocab.Vocab:語彙関連。(辞書)
    ここに画像の説明を挿入

トレーニングにはイテレータタイプのデータを使用します。

上の図から、イテレータは[データセット]によって生成されていることがわかります。

データセットは、ファイルパスに従ってdata.csvに読み込まれたデータと、フィールドに従って解析した後に取得されたデータです。

フィールドには、Vocabオブジェクト(つまり、辞書オブジェクト)が含まれます。

また、データセットから、サンプル例を1つずつ抽出できます。

フィールドコンポーネント

Fieldコンポーネントは、TorchTextのコアコンポーネントです。ユーザーは、コンポーネントに応じてフィールドの処理方法を指定できます。、語彙辞書オブジェクトが含まれています{単語:単語ベクトル}

フィールドオブジェクトには、生成されるタイプのTensor(LongTensor、FloatTensorなど)のデジタル化されたパラメータ(ラベル付けメソッド(メソッドワードなど)など)に関するデータも含まれています

前述のように、Fieldにはテキストフィールドとラベルフィールドが含まれます。テキストフィールドはシリアル化され、単語をセグメント化できるため、sequential = True、use_vocab = Trueを設定できます(ただし、デフォルトではTrueです)。ただし、ラベルフィールドの場合、単語のセグメンテーションは必要ないため、sequencer = Falseおよびuse_vocab = Falseを設定する必要があります。

import torchtext
from torchtext.data import Field


tokenize = lambda x: x.split()

TEXT = Field(tokenize=tokenize)
LABEL = Field(sequential=False, use_vocab=False)
# TEXT.vocab_cls.load_vectors()

これにより、2つのFielterが作成されます。1つはシリアル化されたテキストを処理するためのTEXTで、もう1つは単語セグメンテーションなしのLABLEです。トークナイザーは、単語のセグメンテーションの機能であるフィールドサンプルをトークン化するために使用されます(ここでは、各フィールドのデータは中国語であり、単語はスペースで区切られています)

コメントアウトされたコードから、[Field]にフィールドオブジェクト[vector]があり(ソースコードのinitメソッドで宣言されている)、[load_vectors]で辞書をロードできることがわかります。ここで注意する必要があります:この辞書は、gensimのword2vec.wvオブジェクトではなく、TorchText自体によって記述されています。

  • Fieldコンストラクターが所有するパラメーター(Fieldクラスが所有する属性)
属性 効果
トークン化 単語セグメンテーション機能。デフォルト値:str.split。
一連の データをシーケンスとして表すかどうか、Falseの場合、単語セグメンテーションのデフォルト値:Trueは使用できません。
use_vocab ディクショナリオブジェクトを使用するかどうか。Falseの場合、データ型はすでに数値型である必要があります。デフォルト値:True。
データを小文字に変換するかどうかデフォルト値:False。
tensor_type データが変換されるテンソルタイプのデフォルト値:torch.LongTensor。
fix_length 各データの長さをこの値に変更します。十分でない場合は、pad_tokenを使用して完了します。デフォルト値:なし。
include_lengths 完了した最小バッチのタプルと、各データの長さを含むリストを返すかどうか。デフォルト値:False。
batch_first データが最初にバッチであるかどうか(つまり、バッチが最外層であるかどうか)。デフォルト値:False。
前処理 単語のセグメンテーション後、デジタル化前に使用されるパイプラインのデフォルト値:なし。
後処理 デジタル化後、テンソルへの変換前に使用されるパイプラインのデフォルト値:なし。
init_token 各データの開始文字のデフォルト値:なし。
eos_token 各データの終了文字のデフォルト値:なし。
pad_token 完了に使用される文字。デフォルト:「<pad>」。
unk_token unk_token
pad_first 最初の文字を完成させるかどうか。デフォルト:False。

注意すべき点の1つは、イテレータを使用する前に、トレーニングセットのフィールドで語彙を構築する必要があることです(そうしないと、イテレータはフィールドに語彙属性がないと報告します)。

TEXT.build_vocab(train)
# train为训练集,可以是Dataset类型也可以是TabularDataset类型

語彙コンポーネント

[Vocab]コンポーネント関数は辞書であり、[Field]に直接入力して、[fieldObj.vocab = vocab]を介して単語のセグメンテーションとして直接使用できます。

辞書には2つのストレージ方法があります。1つは辞書ストレージで、もう1つはリストストレージです。

  • リストストレージ:単語はリストに格納され、リストのインデックスが単語のインデックスとして使用されます。下付き文字で単語を取得(ハッシュテーブルを介して保存される場合があります)

    vocab.stoi['qwe']
    # result:10
    
  • 辞書ストレージ:単語を辞書に保存します。キーは単語で、値はリスト内の単語のインデックスです。単語ごとにインデックスを一覧表示

    vocab.itos[10]
    # result:qwe
    

例:

data:
   news author  classify
0  asdf      a         1
1   qwe      b         2
2     6      c         3
3   ert      d         4
4  tyiu      e         5
from torchtext.data import Iterator, BucketIterator

TEXT.build_vocab(train[0])
train_iter = Iterator(train[0], 
                      batch_size=1, 
                      device=-1,
                      sort=False, 
                      sort_within_batch=False, 
                      repeat=False)
for batch in train_iter:
    print(batch, type(batch))
    x = batch.news
    y = batch.classify
    print(x, y)
    print(TEXT.vocab.itos[x])
result:
[torchtext.data.batch.Batch of size 1]
	[.news]:[torch.LongTensor of size 1x1]
	[.author]:[torch.LongTensor of size 1x1]
	[.classify]:[torch.LongTensor of size 1] <class 'torchtext.data.batch.Batch'>
tensor([[2]]) tensor([3])
6

[torchtext.data.batch.Batch of size 1]
	[.news]:[torch.LongTensor of size 1x1]
	[.author]:[torch.LongTensor of size 1x1]
	[.classify]:[torch.LongTensor of size 1] <class 'torchtext.data.batch.Batch'>
tensor([[11]]) tensor([5])
tyiu

[torchtext.data.batch.Batch of size 1]
	[.news]:[torch.LongTensor of size 1x1]
	[.author]:[torch.LongTensor of size 1x1]
	[.classify]:[torch.LongTensor of size 1] <class 'torchtext.data.batch.Batch'>
tensor([[9]]) tensor([4])
ert

[torchtext.data.batch.Batch of size 1]
	[.news]:[torch.LongTensor of size 1x1]
	[.author]:[torch.LongTensor of size 1x1]
	[.classify]:[torch.LongTensor of size 1] <class 'torchtext.data.batch.Batch'>
tensor([[4]]) tensor([1])
asdf

[torchtext.data.batch.Batch of size 1]
	[.news]:[torch.LongTensor of size 1x1]
	[.author]:[torch.LongTensor of size 1x1]
	[.classify]:[torch.LongTensor of size 1] <class 'torchtext.data.batch.Batch'>
tensor([[10]]) tensor([2])
qwe

このストレージの利点は、単語のインデックスのみがデータセットに保存されるため、メモリ使用量が削減されることです。

データセットコンポーネント

フィールドプログラムによると、データを処理する方法を知ってから、フィールドとファイルパスを一緒にデータセットに渡すことができます。フィールドはデータを処理する場所を認識し、処理されたデータをデータセットタイプに変換します。

ここに注意!フィールドは、データの処理方法をプログラムに指示するための単なるテンプレートです。データを渡す場合は、各フィールドの処理方法を知る必要があるため、処理リストが必要です。(csv形式で)

ここでは、[データセット]から継承された[TabularDataset]を使用します。静的メソッド[splits]を使用してデータを取得します。

メソッドのプロトタイプ:

def splits(cls, path=None, root='.data', train=None, validation=None, test=None, **kwargs)
'''
path:数据文件的前缀
root:根数据集的存储目录
train:训练数据文件名(如果不写path就必须写全路径)
validation:验证集数据文件名(如果不写path就必须写全路径)
test:测试集数据文件名(如果不写path就必须写全路径)
'''

仕組み:path + [train、validation、test]に従ってファイルパスを取得し、[download]を使用してファイルパスに従ってデータを読み取り、最後にデータが読み取られたかどうかを判断して、データのフィールドを返します。それは読まれました。

例1:

from torchtext.data import TabularDataset
# 训练集的字段列表
trainDataFieldList = [('id', None),
                      ('news_title', TEXT),
                      ('author', LABLE),
                      ('classify', LABLE)]
# 得到训练集,验证集,测试集的 Dataset
train, validation, text = TabularDataset.splits(
    path=r'D:\poject\test\data',
    root=".data",
    train="train.csv",
    validation="validation.csv",
    format="csv",
    skip_header=True,
    fields=trainDataFieldList
)


# 测试集字段列表。因为测试集只需要数据不需要标签
testDataFieldList = [('id', None),
                     ('news_title', TEXT)]
test = TabularDataset.splits(
    path=r'D:\poject\test\data',
    root=".data",
    test="test.csv",
    format="csv",
    skip_header=True,
    fields=testDataFieldList
)

例2:

  • サンプル

       news author  classify
    0  asdf      a         1
    1   qwe      b         2
    2   wer      c         3
    3   ert      d         4
    4  tyiu      e         5
    
from torchtext.data import TabularDataset
# 训练集的字段列表
trainDataFieldList = [('id', None),
                      ('news', TEXT),
                      ('author', TEXT),
                      ('classify', LABEL)]
# 得到训练集,验证集,测试集的 Dataset
train = TabularDataset.splits(
    path=r'./data',
    root=".data",
    train="data3.csv",
    format="csv",
    skip_header=True,
    fields=trainDataFieldList
)
# 建立一个字典  拆离字典使用:TEXT.vocab
TEXT.build_vocab(train[0])


print(train[0].__dict__.keys())
print(train[0].comment_text)
结果:
(<torchtext.data.dataset.TabularDataset object at 0x000001B521021FD0>,)
dict_keys(['examples', 'fields'])
<generator object Dataset.__getattr__ at 0x000001B520DF58E0>

コンポーネントの例

[データセット]の各項目は[例]インスタンスです。【例】例は行であり、各フィールドの値が行を構成します。

次のようにデータを取得できます。

print(train[0].examples[0].news)
result:
['asdf']

これは中断されていないデータです。[データセット]は[イテレータ]の後でのみ中断されます!

イテレータコンポーネント

[データセット]データができたので、トレーニングに使用する前に、データをバッチごとのイテレータに変換する必要があります。

from torchtext.data import Iterator, BucketIterator

train_iter = Iterator(train[0], 
                      batch_size=1, 
                      device=-1,
                      sort=False, 
                      sort_within_batch=False, 
                      repeat=False)

バッチコンポーネント

Iteratorコンポーネントを繰り返すたびに、Batchコンポーネントが返されます。

for batch in train_iter:
    print(batch, type(batch))
result:
[torchtext.data.batch.Batch of size 1]
	[.news]:[torch.LongTensor of size 1x1]
	[.author]:[torch.LongTensor of size 1x1]
	[.classify]:[torch.LongTensor of size 1] <class 'torchtext.data.batch.Batch'>

[torchtext.data.batch.Batch of size 1]
	[.news]:[torch.LongTensor of size 1x1]
	[.author]:[torch.LongTensor of size 1x1]
	[.classify]:[torch.LongTensor of size 1] <class 'torchtext.data.batch.Batch'>

[torchtext.data.batch.Batch of size 1]
	[.news]:[torch.LongTensor of size 1x1]
	[.author]:[torch.LongTensor of size 1x1]
	[.classify]:[torch.LongTensor of size 1] <class 'torchtext.data.batch.Batch'>

[torchtext.data.batch.Batch of size 1]
	[.news]:[torch.LongTensor of size 1x1]
	[.author]:[torch.LongTensor of size 1x1]
	[.classify]:[torch.LongTensor of size 1] <class 'torchtext.data.batch.Batch'>

[torchtext.data.batch.Batch of size 1]
	[.news]:[torch.LongTensor of size 1x1]
	[.author]:[torch.LongTensor of size 1x1]
	[.classify]:[torch.LongTensor of size 1] <class 'torchtext.data.batch.Batch'>

[バッチ]には3つのフィールドがあることがわかります。[batch_size]は1であるため、各フィールドに1つのデータがあります。[batch_size]が2の場合、データ形式は[1 * 2]である必要があります。

[torchtext.data.batch.Batch of size 2]
	[.news]:[torch.LongTensor of size 1x2]
	[.author]:[torch.LongTensor of size 1x2]
	[.classify]:[torch.LongTensor of size 2] <class 'torchtext.data.batch.Batch'>

バッチ内のデータは、フィールド名で取得し、辞書を介して単語に変換できます。

for batch in train_iter:
    print(batch, type(batch))
    x = batch.news
    y = batch.classify
    print(x, y)
    print(TEXT.vocab.itos[x])
[torchtext.data.batch.Batch of size 1]
	[.news]:[torch.LongTensor of size 1x1]
	[.author]:[torch.LongTensor of size 1x1]
	[.classify]:[torch.LongTensor of size 1] <class 'torchtext.data.batch.Batch'>
tensor([[2]]) tensor([3])
6

[torchtext.data.batch.Batch of size 1]
	[.news]:[torch.LongTensor of size 1x1]
	[.author]:[torch.LongTensor of size 1x1]
	[.classify]:[torch.LongTensor of size 1] <class 'torchtext.data.batch.Batch'>
tensor([[11]]) tensor([5])
tyiu

[torchtext.data.batch.Batch of size 1]
	[.news]:[torch.LongTensor of size 1x1]
	[.author]:[torch.LongTensor of size 1x1]
	[.classify]:[torch.LongTensor of size 1] <class 'torchtext.data.batch.Batch'>
tensor([[9]]) tensor([4])
ert

[torchtext.data.batch.Batch of size 1]
	[.news]:[torch.LongTensor of size 1x1]
	[.author]:[torch.LongTensor of size 1x1]
	[.classify]:[torch.LongTensor of size 1] <class 'torchtext.data.batch.Batch'>
tensor([[4]]) tensor([1])
asdf

[torchtext.data.batch.Batch of size 1]
	[.news]:[torch.LongTensor of size 1x1]
	[.author]:[torch.LongTensor of size 1x1]
	[.classify]:[torch.LongTensor of size 1] <class 'torchtext.data.batch.Batch'>
tensor([[10]]) tensor([2])
qwe

[Iterator]は[Batch]のインスタンスを返します。トレーニングする場合は、値を取り出す必要があります。取得された値のタイプは[tensor]です。次にカプセル化します!

class DataIterator:
    def __init__(self, iterator):
        self.iterator = iterator
        
    def __iter__(self):
        for batch in self.iterator:
            x = batch.news
            y = batch.classify
            yield x, y
    
    def __len__(self):
        return len(self.iterator)
    
dataIterator = DataIterator(train_iter)

for x, y in dataIterator:
    print(x, y)
result:
tensor([[10]]) tensor([2])
tensor([[4]]) tensor([1])
tensor([[2]]) tensor([3])
tensor([[11]]) tensor([5])
tensor([[9]]) tensor([4])

このようにして、トレーニングを実行することができます。率直に言って、[torchtext]はデータセット構築ツールであり、[torch.utils.data]の[DataLoader、Dataset]よりも便利で、cvsなどの形式でデータを読み取ることができます。

これはほんの小さな紹介です。その他の操作については、公式ドキュメントを参照してください。

おすすめ

転載: blog.csdn.net/qq_43477218/article/details/114263175