Pytorch:テキストの前処理(torchtext)③
はじめに
torchtextの使い方メモ第三弾。
前回の内容は下記参照
kento1109.hatenablog.com
今回の内容は1つだけ。
POSやNERなどのTaggingを考える場合、どのようにtorchtextで読み込めばよいか。
前回まではtorchtextでデータをファイルから読む際、想定されているのは(感情分析等の場合)以下のような形式だった。
I love this moive,1
ただし、学習の目的がTaggingの場合、入力データのフォーマットがそもそも異なる。
NERの場合、だいたいこんな感じだ。
Tom B-PER
is O
my O
friend O
New B-LOC
York I-LOC
is O
always O
crowded O
行ごとに単語が並んでおり、それぞれにタグが付与されている。
文章の区切りは、CoNLLのデータセットの場合、空行で行われる。
こんなフォーマットの場合、どのように処理すればよいだろう。
結論から言うと、SequenceTaggingDataset
を使う。以上だ。
SequenceTaggingDataset
先ほどのデータの場合、以下のようにして読み込む。
from torchtext import data, datasets TEXT = data.Field() LABEL = data.Field() train = datasets.SequenceTaggingDataset( path='test.tsv', fields=[('text', TEXT), ('label', LABEL)])
すると、以下のようにセンテンス単位となる。
print(vars(train[0])) # {'text': ['Tom', 'is', 'my', 'friend'], 'label': ['B-PER', 'O', 'O', 'O']}
必要に応じて
TEXT = data.Field(init_token='<bos>', eos_token='<eos>') LABEL = data.Field(init_token='<bos>', eos_token='<eos>')
とすると、文の先頭と末尾に記号をつけることが出来る。
センテンスの単位であるが、github.com
にあるSequenceTaggingDataset
クラスをみれば分かるが、行が空白の場合、それまでの単語・ラベルをセンテンスとしてまとめる処理をしている。(31行目あたり)
datasets
さえ作れれば、後の処理は前回と同じ。
前回と同じ書き方で辞書も作れる。
TEXT.build_vocab(train) vocab = TEXT.vocab vocab.itos ['<unk>', '<pad>', 'is', 'New', 'Tom', 'York', 'always', 'crowded', 'friend', 'my']
大した内容ではないが、少し嵌ったのでメモした。