写点什么

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:483202
用户头像
赵钰莹 极客邦科技 总编辑

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

关注

评论

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

百度文库、百度网盘联合发布「沧舟OS」内容操作系统,开放MCP Server,华为、三星、牛听听成首批接入客户

极客天地

用友BIP企业AI全栈云:沉浸式体验六大智慧采购新场景

用友BIP

详解金仓数据库KingbaseES主备流复制集群数据块恢复神器auto_bmr

金仓技术

KingbaseES 金仓数据库

“陆海空”立体组网!福建移动助力鹭岛打造5G-A全面示范之城

极客天地

RapidFS 为昆仑芯 3 万卡集群加速,国产化平台 TiB 级吞吐让数据随叫随到

Baidu AICLOUD

分布式缓存 JuiceFS #存储加速

告别重复繁琐!Apipost参数描述库让API开发效率飙升!

数据追梦人

“AI赋能·共享城市安全”2025杭州安防产品展·浙江安博会

AIOTE智博会

最火向量数据库Milvus安装使用一条龙!

王磊

PingCAP “一号员工”唐刘:回顾我与 TiDB 的十年成长之旅

TiDB 社区干货传送门

TiDB 企业管理器:TEM v3.0.0 体验

TiDB 社区干货传送门

面对开源大模型浪潮,基础模型公司如何持续盈利?

Baihai IDP

开源 AI 商业模式 基础模型 LLM

百度文库、百度网盘联合发布「GenFlow超能搭子」、「AI笔记」,打造“聪明又能干”的超级生产力

极客天地

详解金仓数据库KFS双轨并行不停机方案

金仓技术

KingbaseES 金仓数据库 KFS KES

基于 MCP 的 AI Agent 应用开发实践

字节跳动开源

开源 AI Agent MCP 模型上下文协议 Agent TARS

百度优选成全球首家支持MCP的电商平台

极客天地

我的内存去哪儿了?

TiDB 社区干货传送门

监控 TiKV 底层架构

五一假期放肆嗨,ROG电竞显示器高刷臻品畅玩游戏!

新消费日报

关于我的第一个产品!

沉浸式趣谈

伊克罗德信息亮相亚马逊云科技合作伙伴峰会,以ECRobot 智能云迁移助手在GenAI Tech Game比赛勇夺金牌!

伊克罗德信息科技

云计算 AI 亚马逊云

最终一致性正在成为主流:现代分布式应用的数据管理新范式

tapdata

数据一致性 数据同步 实时数据 最终一致性 强一致性

深入研究:Shopee商品列表API接口详解

tbapi

shopee API shopee商品列表接口 shopee商品采集

别让算力掉队:AI架构里被忽视的关键一环

ScaleFlux

企业级存储 定制化芯片 AI基础架构

数智化转型进阶之路:从数据底座到业务增长,企业需要怎样的数据库支撑?

TiDB 社区干货传送门

数据库架构选型

【等保小知识】未联网的独立单位网络是否需要等保备案以及定级?

行云管家

等保 等保测评 等保2.0

告别手动填参数!Apipost黑科技让接口调试效率翻倍

数据追梦人

【行业知识】绿色能源产业使用堡垒机的原因看这里!

行云管家

网络安全 等保 等保测评 等保评测

倒计时!中关村科学城工业软件创新暨开源峰会28日启幕,会议亮点抢先看

极客天地

安徽建工集团上线数智管控平台 驱动高质量发展

用友BIP

什么是财务管理系统?一文看清其功能及作用!

积木链小链

数字化转型 智能制造

如何检测 Sliver C2 框架活动

天翼云开发者社区

sliver

对比2款国产远控软件,贝锐向日葵更优

科技热闻

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