通过 Python + RegEx 提高大文档文本标记化的性能

Improve performance of large document text tokenization through Python + RegEx

我目前正在尝试处理大量非常大(>10k 字)的文本文件。在我的数据管道中,我将 gensim 标记化函数确定为我的瓶颈,相关部分在我的 MWE 中提供如下:

import re
import urllib.request

url='https://raw.githubusercontent.com/teropa/nlp/master/resources/corpora/genesis/english-web.txt'
doc=urllib.request.urlopen(url).read().decode('utf-8')

PAT_ALPHABETIC = re.compile('(((?![\d])\w)+)', re.UNICODE)

def tokenize(text):
    text.strip()
    for match in PAT_ALPHABETIC.finditer(text):
        yield match.group()

def preprocessing(doc):
    tokens = [token for token in tokenize(doc)]
    return tokens

foo=preprocessing(doc)

为给定的示例调用 preprocessing 函数大约需要 66ms,我想改进这个数字。我的代码中还有什么可以优化的吗?还是我的硬件(2010 年代中期消费者笔记本电脑)有问题?我也会对使用更新的硬件的人的运行时感兴趣。

提前致谢

您可以使用

PAT_ALPHABETIC = re.compile(r'[^\W\d]+')

def tokenize(text):
    for match in PAT_ALPHABETIC.finditer(text):
        yield match.group()

注:

  • \w 默认匹配 Python 3.x 中的字母、数字、下划线、一些其他连接标点符号和变音符号,不需要使用 re.UNICODEre.U 选项
  • 到"exclude"(或"subtract")来自\w的数字匹配,((?!\d)\w)+看起来有点矫枉过正,你需要做的就是"convert"将 \w 转换为等效的否定字符 class、[^\W],并在其中添加一个 \d[^\W\d]+.
  • 注意无关的text.strip():Python字符串是不可变的,如果不给变量赋值,text.strip()就没有用。由于输入字符串中的空格不会干扰正则表达式 [^\W\d]+,您可以简单地从代码中删除此 text.strip()