1 秒提取 1.2G 中文维基语料的正文

1 秒提取 1.2G 中文维基语料的正文

  • 前言
  • 安装 ripgrep
  • 提取中文维基语料的正文
  • 注意

前言

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 秒
rg 提取正文用时

这样的结果会有一些 \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 命令来查看文档。希望对大家有帮助。

你可能感兴趣的:(NLP,命令行)