fastNLP学习笔记——Dataset

前言

看论文 TENER: Adapting Transformer Encoder for Named Entity Recognition的实现,发现不了解fastNLP看起来挺费劲,而且这一套好像也挺好用,有必要学一下,特此做fastNLP学习笔记。

原官方中文教程在这里。

这一章是关于数据集Dataset的,下面是一个行被称为Instance,列称为Field的Dataset。

raw_words words seq_len
Third Instance. [Third, Instance, .] 3

Dataset 构建

用字典初始化Dataset

from fastNLP import DataSet
data = {'raw_words':["This is the first instance .", "Second instance .", "Third instance ."],
        'words': [['this', 'is', 'the', 'first', 'instance', '.'], ['Second', 'instance', '.'], ['Third', 'instance', '.']],
        'seq_len': [6, 3, 3]}
dataset = DataSet(data)
# 传入的dict的每个key的value应该为具有相同长度的list
print(dataset)

使用append添加数据。

from fastNLP import DataSet
from fastNLP import Instance
dataset = DataSet()
instance = Instance(raw_words="This is the first instance", words=['this', 'is', 'the', 'first', 'instance', '.'], seq_len=6)
dataset.append(instance)
# 可以继续append更多内容,但是append的instance应该和前面的instance拥有完全相同的field

Instance也可以用构造方法。

from fastNLP import DataSet
from fastNLP import Instance
dataset = DataSet([
    Instance(raw_words="This is the first instance",
        words=['this', 'is', 'the', 'first', 'instance', '.'],
        seq_len=6),
    Instance(raw_words="Second instance .",
        words=['Second', 'instance', '.'],
        seq_len=3)
    ])

遍历:

for instance in dataset:
	print(instance)

Dataset 删除

删除方法有drop() delete_instance() delete_field()等。先准备数据。

from fastNLP import DataSet
dataset = DataSet({'a': range(-5, 5), 'c': [0]*10})
# 不改变dataset,生成一个删除了满足条件的instance的新 DataSet
dropped_dataset = dataset.drop(lambda ins:ins['a']<0, inplace=False)
# 在dataset中删除满足条件的instance
dataset.drop(lambda ins:ins['a']<0)
#  删除第3个instance
dataset.delete_instance(2)
#  删除名为'a'的field
dataset.delete_field('a')

删除后的DataSet仅包含名为 c 的一列,包含4个值为0 的数据。

简单的数据预处理

#  检查是否存在名为'a'的field
dataset.has_field('a')  # 或 ('a' in dataset)
#  将名为'c'的field改名为'b'
dataset.rename_field('c', 'b')
#  DataSet的长度
len(dataset)

可以使用apply()或者aply_field()进行预处理。前者的函数参数是Instance,后者是Instance的某一个field。函数可以是lambda表达式也可以是一个完整函数。

from fastNLP import DataSet
data = {'raw_words':["This is the first instance .", "Second instance .", "Third instance ."]}
dataset = DataSet(data)

# 将句子分成单词形式, 详见DataSet.apply()方法
dataset.apply(lambda ins: ins['raw_words'].split(), new_field_name='words')

# 或使用DataSet.apply_field()
dataset.apply_field(lambda sent:sent.split(), field_name='raw_words', new_field_name='words')

# 除了匿名函数,也可以定义函数传递进去
def get_words(instance):
    sentence = instance['raw_words']
    words = sentence.split()
    return words
dataset.apply(get_words, new_field_name='words')

除此之外,还可以用PipeLoader处理数据。

一个人没有梦想,和咸鱼有什么区别!
原文地址:https://www.cnblogs.com/TABball/p/12727312.html