我创建了一个自定义函数,通过Python 3.7中的正则表达式来清理大型文本体。我正在使用jupyter笔记本6.0.3
import numpy as np
import pandas as pd
import re
import string
def pre_process(arr):
legal_chars = string.ascii_letters + string.punctuation + string.digits + string.whitespace + "äÄöÖüÜ"
while " " in arr: # removes unnecessary empty spaces
arr = arr.replace(" ", " ")
while "nn" in arr: # removes unnecessary new lines
arr = arr.replace("nn", "n")
for char in arr: # removes illegal charachters
if char not in legal_chars:
arr=arr.replace(char,"")
pattern4 = r"[d]+W[d]+" # remove long numbers separated with non-digit
pattern4_1 = r"[d]+W[d]+"
arr = re.sub(pattern4, '1', arr)
arr = re.sub(pattern4_1, '', arr)
pattern5 = r"W[d]+W[d]+W" # remove long numbers enclosed by non-digit
pattern6 = r"W[d]+W"
arr = re.sub(pattern5, '.', arr)
arr = re.sub(pattern6, '', arr)
pattern1 = r"d{5,}" # remove long numbers
arr = re.sub(pattern1, '', arr)
return arr
当使用.apply-直接在我的较小测试数据帧中的相应列上运行时,它会返回预期的结果,并清除文本。
然而,我需要将其应用于更大的数据帧,并希望尝试使用多处理包来加快速度。
我用过:
import multiprocessing as mp
with mp.Pool() as pool:
df_t["Text"] = pool.map(pre_process,df_t["Text"])
我已经成功地使用内置函数对同一数据帧进行了多处理,但当使用自定义函数运行时,什么都不会发生。内核刚刚冻结。我也尝试了pool.apply((,但没有结果。
这可能是我的函数有问题,还是我以错误的方式实现了多处理?
我尝试在这里应用这些建议:多处理。Pool:何时使用apply、apply_async或map?但没有变化。
我认为您的代码没有任何问题。事实上,我能够在本地机器上运行它,而不会在伪pandas
DataFrame上出现问题。不过,我对这个问题的潜在原因有一些想法。我之前在PyCharm 2019上使用python 3.7的multiprocessing
包出现了问题。我通过降级到PyCharm 2018和python 3.6来解决这个问题。我在一个伪DataFrame上用这个配置运行了您的代码,没有任何问题。
你可以查看这个关于这个问题的链接(当然,如果我的猜测是真的(