zoukankan      html  css  js  c++  java
  • 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处理数据。

    一个人没有梦想,和咸鱼有什么区别!
  • 相关阅读:
    Spring boot unable to determine jdbc url from datasouce
    Unable to create initial connections of pool. spring boot mysql
    spring boot MySQL Public Key Retrieval is not allowed
    spring boot no identifier specified for entity
    Establishing SSL connection without server's identity verification is not recommended
    eclipse unable to start within 45 seconds
    Oracle 数据库,远程访问 ora-12541:TNS:无监听程序
    macOS 下安装tomcat
    在macOS 上添加 JAVA_HOME 环境变量
    Maven2: Missing artifact but jars are in place
  • 原文地址:https://www.cnblogs.com/TABball/p/12727312.html
Copyright © 2011-2022 走看看