【问题标题】:Improve performance of large document text tokenization through Python + RegEx通过 Python + RegEx 提高大型文档文本标记化的性能
【发布时间】:2020-04-07 13:14:53
【问题描述】:

我目前正在尝试处理大量非常大(>10k 字)的文本文件。在我的数据管道中,我将 gensim tokenize 函数确定为我的瓶颈,相关部分在下面的 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]+')re.UNICODE 在 Python 3.x 中是多余的
  • 您好 Wiktor,感谢您的回答。正则表达式源自 gensim 源代码。据我所知,您的建议似乎也很有效,并且将运行时间提高了大约 30%
  • 删除text.strip()
  • 是的,这里没有任何作用。

标签: regex python-3.x nltk gensim


【解决方案1】:

你可以使用

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 选项
  • 要从\w“排除”(或“减去”)数字匹配,((?!\d)\w)+ 看起来有点矫枉过正,您只需将\w“转换”为等效的否定字符类,@ 987654328@,并在此处添加\d[^\W\d]+
  • 注意无关的text.strip():Python 字符串是不可变的,如果不给变量赋值,text.strip() 就没有用处。由于输入字符串中的空格不会干扰正则表达式 [^\W\d]+,因此您可以简单地从代码中删除此 text.strip()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-07
    • 2012-11-30
    • 2021-11-13
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    相关资源
    最近更新 更多