写点什么

LineFlow 开源:比 PyTorch 简洁数倍,适用任何框架的 NLP 数据集处理程序

  • 2019-12-31
  • 本文字数:2771 字

    阅读完需:约 9 分钟

LineFlow开源:比PyTorch简洁数倍,适用任何框架的NLP数据集处理程序

一般来讲,用 PyTorch 处理自然语言比较繁琐。于是,国外一位开发者 Yasufumi TANIGUCHI 开发了 LineFlow,为了尽可能减轻编码的痛苦,并保证完成同样的任务。Yasufumi TANIGUCHI 表示,LineFlow 要比 PyTorch 简洁数倍,让我们来看看 LineFlow 究竟能简洁到什么地步?


对自然语言处理任务来说,你可能需要在预处理中对文本进行词法分析或构建词汇表。因为这个过程非常痛苦,所以我创建了LineFlow ,尽可能让整个过程干净整洁。真正的代码看起来是什么样子?请看下面的图,预处理包括词法分析、词汇表构建和索引。



左边部分是来自 PyTorch 官方示例仓库的示例代码,它对文本数据进行常见的预处理。右边部分是用 LineFolw 编写的,实现了完全相同的处理。看完对比之后,你应该明白 LineFlow 是如何减轻痛苦的。要查看完整的代码,可以访问此链接


在本文中,我将详细解释上图右边部分的代码,并讲解 LineFlow 的用法。

加载文本数据

文本数据的加载,是通过上面代码中的第 8 行完成的,我稍后会详细解释这个 map。lf.TextDataset 将文本文件的路径作为参数并进行加载。


dataset = lf.TextDataset(path, encoding='utf-8').map(...)
复制代码


lf.TextDataset 要求的数据格式是每行对应一个数据。如果文本数据满足此条件,则可以加载任何类型的文本数据。




加载之后,它将文本数据转换为列表。列表中的项对应于文本数据中的行。 请看下图,这是 lf.TextDataset 的直观图像。图中的 d 代表代码中的 dataset



LineFlow 已经提供了一些公开可用的数据集。所以你可以马上使用它。要查看提供的数据集,请访问此链接

2. 标记化

文本标记化也是通过第 8 行完成的。map将作为参数传递的处理应用到文本数据的每一行。


dataset = lf.TextDataset(...).map(lambda x: x.split() + ['<eos>'])
复制代码


请看下图。这是 lf.TextDataset.map 的直观图像。图中的 d 代表代码中的 dataset



让我们深入了解下面的实际处理过程。


lambda x: x.split() + ['<eos>']
复制代码


我们将文本数据中的每一行按空格拆分为标记,然后将 <eos>添加到这些标记的末尾。我们遵循 WikiText 官方页面上的处理方式。


此时,我们使用 str.split 进行标记化。我们可以使用其他的标记化方法,如 spaCyStanfordNLPBling Fire 等。例如,如果你想使用 Bling Fire,我们将得到以下代码。


>>> from blingfire import text_to_words>>> d = lf.TextDataset('/path/to/your/text')>>> d.map(text_to_words).map(str.split)
复制代码


另外,只要我们的处理将每行文本数据作为参数,就可以执行任何我们想要的处理。例如,我们可以计算标记的数量。在下面的代码中,标记的数量是在第二个元素中定义的。


>>> d = lf.TextDataset('/path/to/text')>>> d.map(tokenize).map(lambda x: (x, len(x)))
复制代码


当我们想要制作用于注意力机制或长短期记忆网络的掩码时,这种处理就很有用。

3. 索引

索引是由第 9 行到第 12 行完成的。这些行如下图所示。在这个代码块中,我们构建了词汇表和索引。让我们按顺序来查看这些内容。


for word in dataset.flat_map(lambda x: x):    self.dictionary.add_word(word)return torch.LongTensor(dataset.flat_map(...))
复制代码


首先我们将看到构建词汇表的代码块。在下面的代码块中,我们构建了词汇表。 flat_map 将作为参数传递的处理应用于数据中的每一行,然后对其进行扁平化。因此,我们将在 dataset.flat_map(lambda x: x) 之后获取单个标记。


for word in dataset.flat_map(lambda x: x):    self.dictionary.add_word(word)
复制代码


请看下图。这是 dataset.flat_map(lambda x: x) 的直观图像。图中的 d 代表代码中的 'dataset`。



flat_map 有点令人困惑,但它等同于下面的代码。


>>> from itertools import chain>>> chain.from_iterable(map(lambda x: x, dataset))>>>>>> dataset.flat_map(lambda x: x) # same as above
复制代码


在使用 flat_map 提取每个标记之后,我们将标记传递给 self.dictionary.add_word 来构建词汇表。我将不会解释它是如何工作的,因为这与本文无关。但如果你对它的内部实现感兴趣的话,请查看此链接


self.dictionary.add_word(word)
复制代码


接下来,我们将看到索引的代码块。索引是由一下的代码块来完成的。我们还使用 flat_map 来索引每个标记并使其扁平化。这是因为 PyTorch 的示例需要扁平化标记的张量,所以我们就这么做了。


dataset.flat_map(    [lambda x: self.dictionary.word2idx[token] for token in x)])
复制代码


请看下图。这是 dataset.flat_map(indexer) 的直观图像。图中的 d 代表代码中的 dataset



此代码等同于以下代码。


>>> from itertools import chain>>> chain.from_iterable(map(indexer, dataset))>>>>>> dataset.flat_map(indexer) # same as above
复制代码


最后,我们用 torch.LongTensor 将它包起来,把它变成张量。至此就完成了文本数据的加载。


return torch.LongTensor(dataset.flat_map(...))
复制代码


现在我们可以阅读完整的代码了,如下所示:


import osimport torchimport lineflow as lfclass Dictionary(object):    def __init__(self):        self.word2idx = {}        self.idx2word = []    def add_word(self, word):        if word not in self.word2idx:            self.idx2word.append(word)            self.word2idx[word] = len(self.idx2word) - 1        return self.word2idx[word]    def __len__(self):        return len(self.idx2word)class Corpus(object):    def __init__(self, path):        self.dictionary = Dictionary()        self.train = self.tokenize(os.path.join(path, 'train.txt'))        self.valid = self.tokenize(os.path.join(path, 'valid.txt'))        self.test = self.tokenize(os.path.join(path, 'test.txt'))    def tokenize(self, path):        assert os.path.exists(path)        dataset = lf.TextDataset(path, encoding='utf-8').map(lambda x: x.split() + ['<eos>'])        for word in dataset.flat_map(lambda x: x):            self.dictionary.add_word(word)        return torch.LongTensor(dataset.flat_map(            lambda x: [self.dictionary.word2idx[token] for token in x]))
复制代码


这就是全部的解释。LineFlow 通过对文本数据进行向量化来完成较少的循环和嵌套代码。我们可以使用 Python 的 map 来完成同样的工作。但是,LineFlow 为我们提供了可读的、干净的代码,因为它像管道(Fluent Interface)一样构建了处理过程。


如果你喜欢 LineFlow,并想了解更多信息,请访问 LineFlow 在 GitHub 的仓库


作者介绍:


Yasufumi TANIGUCHI,软件工程师,对自然语言处理有着浓厚的兴趣。本文最初发表于 Medium 博客,经原作者 Yasufumi TANIGUCHI 授权,InfoQ 中文站翻译并分享。


原文链接:


https://towardsdatascience.com/lineflow-introduction-1caf7851125e


2019-12-31 09:483308
用户头像
赵钰莹 极客邦科技 总编辑

发布了 894 篇内容, 共 681.1 次阅读, 收获喜欢 2694 次。

关注

评论

发布
暂无评论
发现更多内容

Awesome Python 资源列表维护工具

qife

Python 资源管理

KWDB数据库高可用方案验证与测试

KaiwuDB

数据库 KaiwuDB

Golang 语言连接并操作 KWDB 数据库

KaiwuDB

数据库 KaiwuDB

裁判文书网转“内参”,法律检索如何预测裁判结果

科技汇

天润融通在线客服升级原生视频通话,更便捷、更安全!

天润融通

智慧工厂云报工系统(源码+文档+讲解+演示)

深圳亥时科技

数智时代:n8n 不够用?试试更懂数据的 HuggingFists

数由科技

人工智能 数据挖掘 低代码 数据科学 huggingfists

做制造业,那你不能不懂ERP 的五大生产模式!

积木链小链

数字化转型 ERP 智能制造 生产模式

权威认可!天翼云强势入选IDC中国CNAPP领导者象限!

天翼云开发者社区

云原生 天翼云

金融科技新标杆:随行付大数据实时分析如何支撑百亿级秒级查询

StarRocks

数据库 数据湖 StarRocks 湖仓一体 存算一体

AI 英语写作练习 App 的核心功能

北京木奇移动技术有限公司

软件外包公司 AI英语教育 AI英语写作

After Effects 2025 中文汉化安装教程 附AE2025激活补丁最新版

Rose

Loopback for Mac 为您提供高端演播室混音板的强大功能

Rose

OpenAI 由英伟达转向谷歌 TPU,中昊芯英 TPU 技术路线获印证

科技热闻

AI 英语写作练习 App 的开发

北京木奇移动技术有限公司

软件外包公司 AI英语学习 AI英语写作

从零开始漏洞赏金猎人的实战指南

qife

网络安全 赏金猎人

WebGL开发数字孪生项目

北京木奇移动技术有限公司

软件外包公司 数字孪生开发 webgl开发

开发者必备!Navicat for SQLServer 提供智能查询、ER 图表、数据迁移!

Rose

vec2text 技术已开源!一定条件下,文本嵌入向量可“近乎完美地”还原

Baihai IDP

程序员 AI 向量数据库 rag 检索增强生成

老实人做的数据库产品,好像也不“老实” !

KaiwuDB

数据库 KaiwuDB

HarmonyOS免密认证方案 助力应用登录安全升级

HarmonyOS SDK

HarmonyOS NEXT harmoyos HarmonyOS SDK应用服务

Awesome C - 精选C语言资源大全

qife

C语言 编程资源

Active Directory渗透测试实战:从域用户提权到系统控制

qife

Active Directory 特权提升

WebGL 开发数字孪生的技术框架

北京木奇移动技术有限公司

软件外包公司 数字孪生开发 webgl开发

PD虚拟机必备工具箱!Parallels Toolbox 7 让日常任务变得超简单!实用工具一键搞定!

Rose

领航AI Agent浪潮,天润融通携各行业精英共襄游轮之夜

天润融通

大数据-30 ZooKeeper Java-API 监听节点 创建、删除节点

武子康

大数据 hadoop spark zookeeper 分布式

天润融通从Labubu现象解读零售商如何靠“情绪感知力”赢得消费者

天润融通

黑龙江等保测评、等保测评费用

等保测评

KWDB技术架构解析:多模融合、时序引擎与分布式设计的创新实践

KaiwuDB

数据库 KaiwuDB

哪里有CorelDRAW最新序列号?cdr2024 Mac最新序列号及安装教程分享

Rose

LineFlow开源:比PyTorch简洁数倍,适用任何框架的NLP数据集处理程序_开源_Yasufumi TANIGUCHI_InfoQ精选文章