PyTorch:テキストの前処理(torchtext)①
torchtext
NLP用のデータローダ
githubはここ。
github.com
下記のチュートリアルがとても丁寧だった。
github.com
また、日本語の説明だと下記が分かりやすかった。
上の説明を見れば、torchtextの構造とかだいたい分かる。
TabularDataset
csv, tsv, jsonから読み込む場合、TabularDatasetを使う。
(Datasetがtorchtextの最上位クラスに位置する。)
Dataset構造を把握する上で下記の絵が分かりやすい。
※上の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
オブジェクトを包括する。
尚、今回読み込む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)
これにMecab
でtokenizer
する処理ができるか後でやってみたい。
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
オブジェクトを持つようになる。
- 頻度辞書
# 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
を指定することで、出現頻度の低い単語を除くことが出来る。