我试图通过一个数据集中的百万行运行一个函数。
码:
def nlkt(val):
val=repr(val)
clean_txt = [word for word in val.split() if word.lower() not in stopwords.words('english')]
nopunc = [char for char in str(clean_txt) if char not in string.punctuation]
nonum = [char for char in nopunc if not char.isdigit()]
words_string = ''.join(nonum)
return words_string
现在,我使用for循环调用上述函数,以通过百万条记录运行。即使我在具有24核cpu和88 GB
Ram的重型服务器上,我仍然看到循环占用了太多时间,并且没有使用那里的计算能力
我正在这样调用上面的函数
data = pd.read_excel(scrPath + "UserData_Full.xlsx", encoding='utf-8')
droplist = ['Submitter', 'Environment']
data.drop(droplist,axis=1,inplace=True)
#Merging the columns company and detailed description
data['Anylize_Text']= data['Company'].astype(str) + ' ' + data['Detailed_Description'].astype(str)
finallist =[]
for eachlist in data['Anylize_Text']:
z = nlkt(eachlist)
finallist.append(z)
当我们有几百万条记录时,上面的代码可以正常工作,只是太慢了。它只是excel中的示例记录,但实际数据将存储在DB中,该数据库将运行数亿。有什么办法可以加快操作以更快地通过函数传递数据-
而是使用更多的计算能力?
您的原始图片nlkt()
在每行中循环3次。
def nlkt(val):
val=repr(val)
clean_txt = [word for word in val.split() if word.lower() not in stopwords.words('english')]
nopunc = [char for char in str(clean_txt) if char not in string.punctuation]
nonum = [char for char in nopunc if not char.isdigit()]
words_string = ''.join(nonum)
return words_string
另外,每次调用时nlkt()
,都会一次又一次地重新初始化它们。
stopwords.words('english')
string.punctuation
这些应该是全球性的。
stoplist = stopwords.words('english') + list(string.punctuation)
逐行检查:
val=repr(val)
我不确定为什么需要这样做。但是您可以轻松地将列转换为str
类型。这应该在预处理功能之外完成。
希望这是不言而喻的:
>>> import pandas as pd
>>> df = pd.DataFrame([[0, 1, 2], [2, 'xyz', 4], [5, 'abc', 'def']])
>>> df
0 1 2
0 0 1 2
1 2 xyz 4
2 5 abc def
>>> df[1]
0 1
1 xyz
2 abc
Name: 1, dtype: object
>>> df[1].astype(str)
0 1
1 xyz
2 abc
Name: 1, dtype: object
>>> list(df[1])
[1, 'xyz', 'abc']
>>> list(df[1].astype(str))
['1', 'xyz', 'abc']
现在转到下一行:
clean_txt = [word for word in val.split() if word.lower() not in stopwords.words('english')]
使用str.split()
很尴尬,应该使用适当的标记器。否则,您的标点符号可能会卡在前面的单词上,例如
>>> from nltk.corpus import stopwords
>>> from nltk import word_tokenize
>>> import string
>>> stoplist = stopwords.words('english') + list(string.punctuation)
>>> stoplist = set(stoplist)
>>> text = 'This is foo, bar and doh.'
>>> [word for word in text.split() if word.lower() not in stoplist]
['foo,', 'bar', 'doh.']
>>> [word for word in word_tokenize(text) if word.lower() not in stoplist]
['foo', 'bar', 'doh']
同时检查是否.isdigit()
应该一起检查:
>>> text = 'This is foo, bar, 234, 567 and doh.'
>>> [word for word in word_tokenize(text) if word.lower() not in stoplist and not word.isdigit()]
['foo', 'bar', 'doh']
将它们放在一起,您nlkt()
应该看起来像这样:
def preprocess(text):
return [word for word in word_tokenize(text) if word.lower() not in stoplist and not word.isdigit()]
您可以使用DataFrame.apply
:
data['Anylize_Text'].apply(preprocess)
我在C#中设置了一个非常简单的Azure函数来响应。当我按照Microsoft Azure指令在本地运行该函数时,我得到的只是一个空的404响应。 我用的是Visual Studio 2017 v15.3预览版,安装了Azure Function Tools扩展。这是我的Azure函数的代码: 当我在本地运行时(通过右键单击VS项目并进行调试) 但是,当我获取或POST到上述URL(将Conten
问题内容: 要编译此代码,我可以: 将我的通话置于try / catch块中,或 已经声明它可以抛出一个。 为什么我必须这样做? (示例代码来自Kathy Sierra的SCJP书 。) 我知道引发的异常是已检查的异常,因此我必须处理它,但是在什么情况下需要引发此异常? 问题答案: 如果以一种可以引发检查异常的方式声明方法(不是的子类),则调用该方法的代码必须在一个块中调用它,否则调用者方法必须声
我读了很多关于Java异常处理的帖子,但我确实得到了满意的答案,为什么我要把它们放在我的代码中呢? 我想使用JRE的一些api方法,这些方法是用检查的异常进行的。所以如果我想使用它们,我需要抛出或捕获异常(例如java I/O)。这是在我的类中使用异常的合理规则吗? 我听说了这件事 Java异常处理使错误处理代码与我的业务逻辑分离 在下面的代码段中,分离错误处理的位置在哪里? 3.Java默认的异
我正在尝试使用JS SDK在Dropbox上上传一个文件。下面是我试图调用函数的html代码: 这是定义函数的文件 但是,由于我不知道的原因,我的函数不能被调用。我得到错误“referenceerror:Dropupload is not defined”,我不知道这是否与问题有关,但我得到另一个错误:“syntaxerror:import declarations may only at top
我正在尝试获取付款的详细信息,并更新数据库订阅表中的详细信息,我使用Razorpay,Razorpay提供了处理发生的不同事件的方法。我想将发布请求发送到rest api,不幸的是,Razorpay的支付成功事件处理程序方法没有调用我的_subscription()函数。 这是我的付款代码。 AuthData来自网络类 Laravel方法API函数正在运行。 邮递员回复工作。邮递员API响应
我不确定如何找到这个问题的答案,所以这里是我想要弄清楚的:我对javascript还是一个新手,所以请原谅任何复杂的逻辑和编码。我正在学习回调,但我想进一步让javascript生成一个动态语句,该语句将根据调用的函数而改变。例如: “这两个数:115加35=150.”,或 “这两个数:115减35=80.”,或 “这两个数:115乘以35=4025.”,或 “这两个数:115除以35=3.285