通过 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.UNICODE
或 re.U
选项
- 到"exclude"(或"subtract")来自
\w
的数字匹配,((?!\d)\w)+
看起来有点矫枉过正,你需要做的就是"convert"将 \w
转换为等效的否定字符 class、[^\W]
,并在其中添加一个 \d
:[^\W\d]+
.
- 注意无关的
text.strip()
:Python字符串是不可变的,如果不给变量赋值,text.strip()
就没有用。由于输入字符串中的空格不会干扰正则表达式 [^\W\d]+
,您可以简单地从代码中删除此 text.strip()
。
我目前正在尝试处理大量非常大(>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.UNICODE
或re.U
选项- 到"exclude"(或"subtract")来自
\w
的数字匹配,((?!\d)\w)+
看起来有点矫枉过正,你需要做的就是"convert"将\w
转换为等效的否定字符 class、[^\W]
,并在其中添加一个\d
:[^\W\d]+
. - 注意无关的
text.strip()
:Python字符串是不可变的,如果不给变量赋值,text.strip()
就没有用。由于输入字符串中的空格不会干扰正则表达式[^\W\d]+
,您可以简单地从代码中删除此text.strip()
。