本篇blog用于处理penn tree bank 数据集(非开源,研究用途),并给出处理代码,由于个人目的较强,因此代码可能仅能作为参考。

首先来看一下down下来数据:

主要的数据在tagged目录下,而tagged/pos目录下包含四个数据集:

wsj来源于华尔街日报,是我们主要的部分(作为学术用途),所以只处理wsj:

wsj主要有25个section,每个section下面都有数个txt文件,每个txt文件都有一段或多段包含pos tag的sequences。
主要的处理思路就是把txt文本line by line读取出来,然后把每行token和label分离,随后就是把同一句的token和label组合成一个sample。最后split dataset。而数据集split遵循:

接下来上代码:

''' this scripts use to process penn tree bank (wsj) and split it following:train : 0-18dev : 19-21test : 22-24
'''import os
import sys
import jsonskip_tok = 0def FindAllSuffix(path: str, suffix: str, verbose: bool = False) -> list:''' find all files have specific suffix under the path:param path: target path:param suffix: file suffix. e.g. ".json"/"json":param verbose: whether print the found path:return: a list contain all corresponding file path (relative path)'''result = []if not suffix.startswith("."):suffix = "." + suffixfor root, dirs, files in os.walk(path, topdown=False):# print(root, dirs, files)for file in files:if suffix in file:file_path = os.path.join(root, file)result.append(file_path)if verbose:print(file_path)return resulttrain_range = list(range(0, 19))
dev_range = list(range(19, 22))
test_range = list(range(22, 25))# path = sys.argv[1]
path = "."
data_list = FindAllSuffix(path, ".pos")train_cnt = 0
dev_cnt = 0
test_cnt = 0all_label = []
token_set = []
label_set = []train_file = []
dev_file = []
test_file = []def add_data_set(token_set, label_set, sec: int, cnt: tuple):train_cnt, dev_cnt, test_cnt = cntinstance = dict()assert len(token_set) == len(label_set)if len(token_set) == 0:return cntif sec in train_range:instance["index"], instance['seq1'], instance['seq2'], instance["label"] = str(train_cnt), token_set, -1, label_settrain_cnt += 1train_file.append(instance)elif sec in dev_range:instance["index"], instance['seq1'], instance['seq2'], instance["label"] = str(dev_cnt), token_set, -1, label_setdev_cnt += 1dev_file.append(instance)elif sec in test_range:instance["index"], instance['seq1'], instance['seq2'], instance["label"] = str(test_cnt), token_set, -1, label_settest_cnt += 1test_file.append(instance)else:raise RuntimeErrorreturn (train_cnt, dev_cnt, test_cnt)split_tok_lb = lambda x: tuple(x.split("/"))
is_not_none = lambda x: len(x.strip()) != 0def process_line(line_ori: str, skip_tok: int):line = line_ori.strip().strip('[').strip(']').strip()all_token_label = line.split(" ")all_token_label = list(filter(is_not_none, all_token_label))temp = list(map(split_tok_lb, all_token_label))tok, lb = tuple(zip(*temp))tok, lb = list(tok), list(lb)# check label correctnesst_tok, t_lb = [], []for i, l in enumerate(lb):if "|" in l:print("error label:{} skip!".format(l))skip_tok += 1else:t_tok.append(tok[i])t_lb.append(l)return t_tok, t_lb, skip_toksec = ""
for data_file in data_list:sec = int(data_file.replace("\\", "/").rsplit("/", 2)[-2])with open(data_file, "r") as f:for i, line in enumerate(f.readlines()):if line.startswith("=") or line == "" or line == "\n":# complete one sentencetrain_cnt, dev_cnt, test_cnt = add_data_set(token_set, label_set, sec, (train_cnt, dev_cnt, test_cnt))token_set, label_set = [], []continueline = line.replace("\\/", "_")try:tok, lb, skip_tok = process_line(line, skip_tok)except:print("error line:{}!".format(line))continue  # skip error lineindex_lb = []for t in lb:if t not in all_label:all_label.append(t)index_lb.append(all_label.index(t))token_set += toklabel_set += index_lbif len(token_set) != 0:# complete one sentenceprint("remain a sentence!")train_cnt, dev_cnt, test_cnt = add_data_set(token_set, label_set, sec, (train_cnt, dev_cnt, test_cnt))
token_set, label_set = [], []print("train:dev:test = {}:{}:{}".format(train_cnt, dev_cnt, test_cnt))
print("label:", all_label, "\nnum of label:", len(all_label))
print("error labeled token num: ", skip_tok)# save all this file
# your codes

处理过程中,会遇到一些异常数据和label,比如说这种:

\/作为分隔符分隔数字…,代码里索性就把\/全部替换成‘_’,对模型train、eval应该不会有啥影响。
还有这种:


label之间有|分隔???暂时没有时间去找原因,但是统计了一下这种异常的label不多,索性就把这些label的token全部skip了。


最后数据大概是这样:

总共是46种label,删了147个token

penn tree bank POS数据处理相关推荐

  1. Paper:GPT-3《 Language Models are Few-Shot Learners》的翻译与解读

    Paper:GPT-3< Language Models are Few-Shot Learners>的翻译与解读 目录 <GPT-3: Language Models are Fe ...

  2. 从机器翻译到阅读理解,一文盘点PaddlePaddle官方九大NLP模型

    本文转载自 PaddlePaddle 自然语言处理(NLP)主要是研究实现人与计算机之间用自然语言进行有效通信的各种理论和方法.基于神经网络的深度学习技术具有强大的表达能力.端到端解决问题的能力,因而 ...

  3. ACL 2016 会议论文全集

    网页地址 http://anthology.aclweb.org/P/P16/,内有下载连接 网页内容: ACL Logo ACL Anthology A Digital Archive of Res ...

  4. 学习笔记TF035:实现基于LSTM语言模型

    神经结构进步.GPU深度学习训练效率突破.RNN,时间序列数据有效,每个神经元通过内部组件保存输入信息. 卷积神经网络,图像分类,无法对视频每帧图像发生事情关联分析,无法利用前帧图像信息.RNN最大特 ...

  5. Tensorflow实战学习(三十五)【实现基于LSTM语言模型】

    神经结构进步.GPU深度学习训练效率突破.RNN,时间序列数据有效,每个神经元通过内部组件保存输入信息. 卷积神经网络,图像分类,无法对视频每帧图像发生事情关联分析,无法利用前帧图像信息.RNN最大特 ...

  6. Paper:GPT-3之《 Language Models are Few-Shot Learners》的翻译与解读

    Paper:GPT-3之< Language Models are Few-Shot Learners>的翻译与解读 目录 <GPT-3: Language Models are F ...

  7. 推荐!神经进化才是深度学习未来的发展之路!

    来源:全球人工智能 过去几年时间里,我们有一个完整的团队致力于人工智能研究和实验.该团队专注于开发新的进化计算方法(EC),包括设计人工神经网络架构.构建商业应用程序,以及使用由自然进化激发的方法来解 ...

  8. tensorflow LSTM

    循环神经网络 介绍 可以在 this great article 查看循环神经网络(RNN)以及 LSTM 的介绍. 语言模型 此教程将展示如何在高难度的语言模型中训练循环神经网络.该问题的目标是获得 ...

  9. 【译】An Opinionated Introduction to AutoML and Neural Architecture Search

    这是系列文章的第2部分. 在这里查看第1部分和第3部分 . 来自CMU和DeepMind的研究人员最近发布了一篇有趣的新论文,称为差异化架构搜索(DARTS) ,它提供了一种神经架构搜索的替代方法,这 ...

  10. 深度学习预训练模型可解释性概览

    ©PaperWeekly 原创 · 作者|蔡杰 学校|北京大学硕士生 研究方向|问答系统 近年来预训练模型(ELMo, GPT, BERT, XLNet, ALBERT 等)给许多 NLP 任务带来了 ...

最新文章

  1. 职称计算机必考和选考,2017职称计算机考试选择题「附答案」
  2. 1039 Course List for Student (25 分)_33行代码AC
  3. 如何写 go 代码 (How to Write Go Code 翻译)
  4. c语言链表实现数组逆置,数组与链表等顺序表逆置
  5. Leetcode--50. Pow(x,y)
  6. 解决QQ可以登录但是网页打不卡 ,提示代理服务器拒绝连接 的问题。
  7. Redis进阶篇主从复制----哨兵模式
  8. java之struts2的执行流程讲解(1)
  9. (转)注意力机制(Attention Mechanism)在自然语言处理中的应用
  10. 2021-09-03相同的树
  11. Room框架学习、使用
  12. js php 获取时间倒计时_,JS实现获取时间和设置倒计时代码分享
  13. html盒子移动动画代码,js实现盒子滚动动画效果
  14. 七战升鸿蒙需要什么条件,《鸿蒙圣墟》平民提升战力攻略
  15. python Process, Pipo进程池管道的理解
  16. 华为荣耀9青春版系统像鸿蒙,荣耀9青春版参数配置
  17. 彩色图像--伪彩处理 灰度图转伪彩色图像
  18. ubuntu的使用经验to新手
  19. oracle 字段重命名大表,Oracle表字段的增、刪、改、表的重命名及主鍵的增、刪、改...
  20. 当Kali Rolling作为笔记本唯一一个系统

热门文章

  1. win10触摸板手势教程
  2. 随机效应估算与固定效应估算_面板数据固定效应 vs. 随机效应
  3. 电容的作用?电容器的作用?
  4. 吃瓜 || 一文看懂BCH分叉事件始末
  5. tom邮箱 服务器类型,Tom邮箱 - 帮助中心
  6. matlab 填充透明色,在Matlab中使用透明像素填充数组
  7. STM32通过IIC驱动MLX90614红外温度传感器
  8. 无损音乐刻录成cd有意义吗_这5个强大免费的无损音乐网站,你收藏了吗?
  9. 《不只是美:信息图表设计原理与经典案例》—— 2.2 数据的展示形式
  10. 数据库服务器的打开方式