機械学習・自然言語処理の勉強メモ

学んだことのメモやまとめ

PyTorch:テキストの前処理(torchtext)①

torchtext



NLP用のデータローダ

githubはここ。
github.com

下記のチュートリアルがとても丁寧だった。
github.com

また、日本語の説明だと下記が分かりやすかった。

www.slideshare.net

上の説明を見れば、torchtextの構造とかだいたい分かる。

TabularDataset

csv, tsv, jsonから読み込む場合、TabularDatasetを使う。
(Datasetがtorchtextの最上位クラスに位置する。)

Dataset構造を把握する上で下記の絵が分かりやすい。
f:id:kento1109:20180422110530p:plain
※上のslideshareより引用

事前に、各フィールドを定義する必要がある。

from torchtext import data, datasets

TEXT = data.Field(sequential=True)
LABEL = data.Field(sequential=False, use_vocab=False)
pos = data.TabularDataset(
        path='text.tsv', format='tsv',  
        fields=[('text', TEXT),
                ('labels', LABEL)])

この時点でDatasetオブジェクトが2つのFieldオブジェクトを包括する。
f:id:kento1109:20181012153809p:plain

尚、今回読み込むtext.tsvはこんなテストデータ

This movie was really good +1
I regreted to watch it -1
This is a awesome movie +1

また、以下のように自作tokenizerも指定可能

def tokenizer(text): # create a tokenizer function
    return XXX

TEXT = data.Field(sequential=True, tokenize=tokenizer)
LABEL = data.Field(sequential=False, use_vocab=False)

これにMecabtokenizerする処理ができるか後でやってみたい。

examples

データセットの中身はexamplesオブジェクトに格納されている。
(1sentenceに1examplesオブジェクトを格納したリスト形式)

examples = pos.examples
type(examples)  # list
type(examples[0])  # torchtext.data.example.Example

実際の中身はtext属性で確認可能。

print(examples[0].text)  
# [u'This', u'movie', u'was', u'really', u'good']
Example.fromlist

listオブジェクトを対象とする場合、fromlistを用いる。

text_field = data.Field(sequential=True)
fields = [('text', text_field)]

text_field = data.Field(sequential=True)
fields = [('text', text_field)]

fruits = ['apple banana', 'banana orange', 'kiwi lemon']
examples = []
for fruit in fruits:
    examples += [data.Example.fromlist([fruit], fields)]

examples[0].text  # [u'apple', u'banana']

train_data = data.Dataset(examples,fields)  # torchtext.data.dataset.Dataset
辞書作成

build_vocab(data)でdataの単語に基づく辞書を作成する。

TEXT.build_vocab(pos)
vocab = TEXT.vocab

build_vocabによりFieldオブジェクトがVocabオブジェクトを持つようになる。
f:id:kento1109:20181012154033p:plain

  • 頻度辞書
# word frequence
vocab.freqs

Counter({u'I': 1,
u'This': 2,
u'a': 1,
u'awesome': 1,
u'good': 1,
u'is': 1,
u'it': 1,
u'movie': 2,
u'really': 1,
u'regreted': 1,
u'to': 1,
u'was': 1,
u'watch': 1})

  • 単語リスト
# wordlist
vocab.itos

['<unk>',
'<pad>',
u'This',
u'movie',
u'I',
u'a',
u'awesome',
u'good',
u'is',
u'it',
u'really',
u'regreted',
u'to',
u'was',
u'watch']

  • 単語インデックス辞書
# word2idx
vocab.stoi

defaultdict(,
{'<pad>': 1,
'<unk>': 0,
u'I': 4,
u'This': 2,
u'a': 5,
u'awesome': 6,
u'good': 7,
u'is': 8,
u'it': 9,
u'movie': 3,
u'really': 10,
u'regreted': 11,
u'to': 12,
u'was': 13,
u'watch': 14})

また、辞書を作る際、

TEXT.build_vocab(pos, min_freq=10)

のようにmax_sizeを指定することで、出現頻度の低い単語を除くことが出来る。