1 秒提取 1.2G 中文维基语料的正文
前言
NLP 中,经常需要用大量的语料来训练模型。其中,中文维基语料是常用的,语料一般以 json 或者 xml 的方式保存。本文旨在通过介绍如何从 json 格式的中文维基语料中快速提取出正文,顺带安利使用 rg 命令来快速从文本中提取需要的内容。本文将文件放在虚拟硬盘中,在 i7 4790k 下,只用 1 秒就完成这一工作,感觉会比用 python 提取信息要高效得多。
安装 ripgrep
本文用到的软件为ripgrep,不是系统默认软件,所以需要先行安装。 ripgrep 是一款基于 Rust 开发的高效字符搜索软件,从名字可以看出,其功能像 Linux 自带的 grep,不过更快,功能更强大。Github 主页 上有它与 Ag,Grep,Ack 等软件的性能比较,也有各平台(Windows, Mac, Linux 各个发行版)的详细安装方法。如, archlinux 或者 manjaro 可以通过 pacman 直接安装:
sudo pacman -S ripgrep
需要注意的是,虽然软件名字叫 ripgrep ,但是,终端下的命令为 rp 。
提取中文维基语料的正文
语料可以从这里下载。
下载好之后,可以用 unzip 命令进行解压:
unzip wiki_zh_2019.zip
解压之后,会得到一个名为 wiki_zh 的目录。进入目录,我们先看一下文件的结构:
cd wiki_zh
head -n 1 ./AA/wiki_00
我们会看到类似以下的内容:
{“id”: “13”, “url”: “https://zh.wikipedia.org/wiki?curid=13”, “title”: “数学”, “text”: "数学\n\n数学是利用符号语言研究数量、结构、变化以及空间等概念的一门学科…}
从这里可以发现,条目的相关信息,其中 title 是标题, text 是正文内容。
接下来我们可以开始用 rg 提取正文内容:
rg --no-filename -oP "(?<=\\\\n\\\\n).+?(?=\\\\n\\\\n)" > /tmp/result.txt
用时 1.1 秒
这样的结果会有一些 \n 的行,我们需要把这些行清除掉:
sed -i.bak "/^\\\\n$/d" /tmp/result.txt
两句语句,一共用时 2.4 秒。
注意
事实上,处理得快慢的一个瓶颈是硬盘的 IO。我这里可以 1 秒完成,主要是因为我的 /tmp 目录是虚拟硬盘,文件实质是放在内存上。如果内存有 8G 以上的话,也可以考虑虚拟硬盘的做法。
Linux 下内存虚拟硬盘可以参考以下命令:
mount -t tmpfs -o size=4G tmpfs /tmp
其中 4G 是虚拟硬盘的空间大小,会根据实际使用来占用内存,/tmp 是虚拟硬盘挂载的目录。
PS:原文件 1.3 G,处理后的文件 1 G,要分 2.3G 以上的内存做虚拟硬盘。所以,如果电脑内存是 4G 的话,可以跑,不过会比较吃紧,毕竟最小化安装的 ubuntu 开机之后也要占用大概 500M 内存。
最后,关于 rg 的更多信息,可以通过 man rg
命令来查看文档。希望对大家有帮助。