获取非常大的文本文件的长度统计信息

Get length statistics over very large textual file

我有一个非常大的文件(150 万行),每行包含 json 个词典。 每行包含一个已解析的维基百科文章。 例如

{"title": "article title", "summary": "this is a summary of around 500 words", "article": "This is the whole article with more than 3K words"}
{"title": "article2 title", "summary2": "this is another summary of around 500 words", "article": "This is another whole article with more than 3K words"}

请注意,该文件本身不是 json。

我想计算这些文本的一些统计数据,例如平均句子数、平均单词数、压缩率等。但是,我尝试的一切都需要很长时间。 最快的方法是什么?作为参考,目前我正在使用 spacy 进行单词和句子标记化,但我愿意接受更近似的解决方案,例如使用正则表达式,如果它们是唯一的方法。

如果你想获得高性能,那么你可能应该使用 多线程 并行计算这些行,并且每行应该使用 提取目标指标SIMD 友好代码。通过使用仅处理此问题的 专用代码 而不是通用解析工具(如正则表达式,除非目标引擎能够生成非常快速的线性时间 JIT 编译高效代码)。

对于多线程部分,这当然是最简单的部分,因为计算似乎主要是令人尴尬的并行。每个线程计算大量行上的目标指标,然后可以对目标指标执行并行缩减(即求和)。

可以使用 SimdJson 相对快速地解析每一行。由于 JSON 文档很小,结构看起来很简单并且总是相同的,您可以使用正则表达式搜索 "article" *: *"((?:[^"\]+|\")*)" (请注意,您可能需要转义有关所用语言的反斜杠).然而,最好的策略可能是自己解析 JSON 文档以更有效地提取所需的字符串,例如通过搜索一些非常具体的键 pattern/string ,如 " (使用 SIMD-友好循环)后跟 article 然后使用更健壮(但更慢)的方法解析其余部分。

类似的策略适用于计算单词。一个快速的过度近似是计算 space 后面紧跟一个字符的数量。字符串编码对于加快解析速度很重要,因为解码 UTF-8 字符串通常很慢。一种快速的解决方案是,如果目标语言是英语或主要使用 ASCII 字符,则只丢弃非 ASCII 字符。如果不是这种情况,那么您可以使用一些支持 SIMD 的 UTF-8 解码库(或在最坏的情况下使用手写算法)。使用大约 1KB 的小 可以帮助更有效地使用 CPU 缓存(如果您使用 C 或 C++ 等编译本机语言,则可以自动矢量化您的代码) .

如果你不是很熟悉SIMD instructions, or low-level parsing strategies/algorithms (like this one), note that there are some fast parsing libraries to do basic operation efficiently like Hyperscan