加载手动标注数据以训练 RNN POS 标注器
Loading manually annotated data to train RNN POS tagger
我有大量手动注释的数据。我想使用 RNN 训练词性标注器。数据类似于以下文本:
Lorem <NP> Ipsum <NP> dummy <N> text <ADV> printing <VREL> typesetting <NUMCR> Ipsum <VREL> Ipsum <NP> Ipsum <NP> Lorem <N> Ipsum <NP> Ipsum <N> Ipsum <NP> Lorem <ADJ> Lorem <NP> Ipsum <N> Lorem <VN> Lorem <ADJ> Lorem <N> Lorem <N> ፣ <PUNC> Lorem <ADJ> Lorem <ADJ> Ipsum <NC> Ipsum <NC> Ipsum <NP>
请指导我如何加载此数据以训练基于 RNN 的标记器。
为了阅读,我建议你将它转换成一个tsv
文件,例子用空行分隔(a.k.a conll格式)如下:
src_fp, tgt_fp = "source/file/path.txt", "target/file/path.tsv"
with open(src_fp) as src_f:
with open(tgt_fp, 'w') as tgt_f:
for line in src_f:
words = list(line.split(' '))[0::2]
tags = list(line.split(' '))[1::2]
for w, t in zip(words, tags):
tgt_f.write(w+'\t'+t+'\n')
tgt_f.write('\n')
然后,您将能够使用 torchtext.datasets
中的 SequenceTaggingDataset 阅读它,如下所示:
text_field, label_field = data.Field(), data.Field()
pos_dataset = torchtext.datasets.SequenceTaggingDataset(
path='data/pos/pos_wsj_train.tsv',
fields=[('text', text_field),
('labels', label_field)])
最后一步是创建词汇表并获取数据迭代器:
text_field.build_vocab(pos_dataset)
train_iter = data.BucketIterator.splits(
(unsup_train, unsup_val, unsup_test), batch_size=MY_BATCH_SIZE, device=MY_DEVICE)
# using the iterator
for ex in self train_iter:
train(ex.text, ex.labels)
我建议您花点时间阅读有关上述函数的文档,以便您能够根据自己的需要调整它们(最大词汇量、是否打乱示例、序列长度等) .
对于构建用于分类的 RNN,the official pytorch tutorial 非常容易学习。所以我建议你从这里开始,调整网络输入和输出从序列分类(每个文本跨度 1 个标签)到序列标记(每个标记 1 个标签)。
我有大量手动注释的数据。我想使用 RNN 训练词性标注器。数据类似于以下文本:
Lorem <NP> Ipsum <NP> dummy <N> text <ADV> printing <VREL> typesetting <NUMCR> Ipsum <VREL> Ipsum <NP> Ipsum <NP> Lorem <N> Ipsum <NP> Ipsum <N> Ipsum <NP> Lorem <ADJ> Lorem <NP> Ipsum <N> Lorem <VN> Lorem <ADJ> Lorem <N> Lorem <N> ፣ <PUNC> Lorem <ADJ> Lorem <ADJ> Ipsum <NC> Ipsum <NC> Ipsum <NP>
请指导我如何加载此数据以训练基于 RNN 的标记器。
为了阅读,我建议你将它转换成一个tsv
文件,例子用空行分隔(a.k.a conll格式)如下:
src_fp, tgt_fp = "source/file/path.txt", "target/file/path.tsv"
with open(src_fp) as src_f:
with open(tgt_fp, 'w') as tgt_f:
for line in src_f:
words = list(line.split(' '))[0::2]
tags = list(line.split(' '))[1::2]
for w, t in zip(words, tags):
tgt_f.write(w+'\t'+t+'\n')
tgt_f.write('\n')
然后,您将能够使用 torchtext.datasets
中的 SequenceTaggingDataset 阅读它,如下所示:
text_field, label_field = data.Field(), data.Field()
pos_dataset = torchtext.datasets.SequenceTaggingDataset(
path='data/pos/pos_wsj_train.tsv',
fields=[('text', text_field),
('labels', label_field)])
最后一步是创建词汇表并获取数据迭代器:
text_field.build_vocab(pos_dataset)
train_iter = data.BucketIterator.splits(
(unsup_train, unsup_val, unsup_test), batch_size=MY_BATCH_SIZE, device=MY_DEVICE)
# using the iterator
for ex in self train_iter:
train(ex.text, ex.labels)
我建议您花点时间阅读有关上述函数的文档,以便您能够根据自己的需要调整它们(最大词汇量、是否打乱示例、序列长度等) . 对于构建用于分类的 RNN,the official pytorch tutorial 非常容易学习。所以我建议你从这里开始,调整网络输入和输出从序列分类(每个文本跨度 1 个标签)到序列标记(每个标记 1 个标签)。