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处理数据。

    一个人没有梦想,和咸鱼有什么区别!
  • 相关阅读:
    Eclipse查看git中的历史,显示详细时间
    eclipse git pull 代码 failed 并且报DIRTY_WORKTREE.classpath
    ResultMap(还没细看)
    mybatis中<include>标签的作用
    mybatis之<trim prefix="" suffix="" suffixOverrides="" prefixOverrides=""></trim>
    hdu 1285 确定比赛名次(拓扑排序)
    hdu 1257 最少拦截系统
    java 高精度模板
    最小生成树 hdu 1233 模板题
    manacher算法 O(n) 求字符串中最长回文子串 hdu 3068(模板题)
  • 原文地址:https://www.cnblogs.com/TABball/p/12727312.html
Copyright © 2011-2022 走看看