我有一個DF:提高對數據幀文本清理的性能
id text
1 This is a good sentence
2 This is a sentence with a number: 2015
3 This is a third sentence
我有一個文本清洗功能:
def clean(text):
lettersOnly = re.sub('[^a-zA-Z]',' ', text)
tokens = word_tokenize(lettersOnly.lower())
stops = set(stopwords.words('english'))
tokens = [w for w in tokens if not w in stops]
tokensPOS = pos_tag(tokens)
tokensLemmatized = []
for w in tokensPOS:
tokensLemmatized.append(WordNetLemmatizer().lemmatize(w[0], get_wordnet_pos(w[1])))
clean = " ".join(tokensLemmatized)
return clean
get_wordnet_pos()
是這樣的:
def get_wordnet_pos(treebank_tag):
if treebank_tag.startswith('J'):
return wordnet.ADJ
elif treebank_tag.startswith('V'):
return wordnet.VERB
elif treebank_tag.startswith('N'):
return wordnet.NOUN
elif treebank_tag.startswith('R'):
return wordnet.ADV
else:
return wordnet.NOUN
我我正在將extractFeatures()
應用到熊貓專欄,並創建一個新結果列:
df['cleanText'] = df['text'].apply(clean)
得到的DF:
id cleanText
1 good sentence
2 sentence number
3 third sentence
循環時出現成倍增長。例如,使用%%timeit
,將其應用於五行,每個循環以17 ms運行。 300行以每個循環800毫秒運行。 500行以每循環1.26秒運行。
我通過實例化stops
和WordNetLemmatizer()
以外的函數來改變它,因爲這些函數只需要調用一次。
stops = set(stopwords.words('english'))
lem = WordNetLemmatizer()
def clean(text):
lettersOnly = re.sub('[^a-zA-Z]',' ', text)
tokens = word_tokenize(lettersOnly.lower())
tokens = [w for w in tokens if not w in stops]
tokensPOS = pos_tag(tokens)
tokensLemmatized = []
for w in tokensPOS:
tokensLemmatized.append(lem.lemmatize(w[0], get_wordnet_pos(w[1])))
clean = " ".join(tokensLemmatized)
return clean
在apply
線運行%prun -l 10
導致該表:
672542 function calls (672538 primitive calls) in 2.798 seconds
Ordered by: internal time
List reduced from 211 to 10 due to restriction <10>
ncalls tottime percall cumtime percall filename:lineno(function)
4097 0.727 0.000 0.942 0.000 perceptron.py:48(predict)
4500 0.584 0.000 0.584 0.000 {built-in method nt.stat}
3500 0.243 0.000 0.243 0.000 {built-in method nt._isdir}
14971 0.157 0.000 0.178 0.000 {method 'sub' of '_sre.SRE_Pattern' objects}
57358 0.129 0.000 0.155 0.000 perceptron.py:250(add)
4105 0.117 0.000 0.201 0.000 {built-in method builtins.max}
184365 0.084 0.000 0.084 0.000 perceptron.py:58(<lambda>)
4097 0.057 0.000 0.213 0.000 perceptron.py:245(_get_features)
500 0.038 0.000 1.220 0.002 perceptron.py:143(tag)
2000 0.034 0.000 0.068 0.000 ntpath.py:471(normpath)
它看起來像惡搞感知是,可以預見,採取了大量的資源,但我不知道如何簡化它。另外,我不確定nt.stat
或nt._isdir
在哪裏被調用。
我該如何改變功能或應用方法來提高性能?這個函數是Cython還是Numba的候選人?
不能說沒有你的數據和預期的輸出。 –
增加樣品輸入數據和清潔功能的結果。我得到了正確的輸出 - 問題更多的是如何更快地獲得適當的輸出。 –
有趣。言語的順序是否重要?我猜是的? –