前言
看论文 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')
除此之外,还可以用Pipe
和Loader
处理数据。