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

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

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']

大した内容ではないが、少し嵌ったのでメモした。