отфильтровать столбец из 3500+ текста книги. Как сделать так, чтобы мой код работал с большими объемами данных в NLP? - PullRequest
0 голосов
/ 09 мая 2020

Я работаю над данными, в которых каждая строка столбца имеет огромный текст, а также книгу в каждой строке, поэтому, когда я применяю приведенный ниже код НЛП для 10-50 строк, он отлично работает на 100-200 r работает, но занимает 10 минут, когда я подаю заявку на 3000 книг или строк, он не давал мне вывода даже через 2 часа, поэтому есть ли способ ускорить этот код или есть другой способ быстро получить результат ??

 import re
 import nltk
 nltk.download('stopwords')
 from nltk.corpus import stopwords
 from nltk.stem.porter import PorterStemmer
 corpus = []
 for i in range(0,3500):
     review = re.sub('[^a-zA-Z0-9]', ' ', str(dt["TEXT"][i]))
     review = review.lower()
     review = review.split()
     ps=  PorterStemmer()
     review = [ps.stem(word) for word in review if not word in set(stopwords.words('english'))]review = ' '.join(review)
      corpus.append(review)

1 Ответ

0 голосов
/ 09 мая 2020

Одним из улучшений может быть сохранение набора игнорируемых слов вместо преобразования каждый раз в понимание списка. Это улучшение может быть огромным в зависимости от размера списка стоп-слов и количества вызовов для преобразования списка в набор.

Вы можете запустить следующий код в этом онлайн-компиляторе. Ссылка: https://onlinegdb.com/HJVVgw4cI

from timeit import default_timer as timer

a = ['a','b','c','d']
sent = 'abc in my word'


start = timer()
for i in range(0,10000):
    a = [i for i in sent if not i in set(a)]
end = timer()
print(end - start)

start = timer()
b = set(a)
for i in range(0,10000):
    a = [i for i in sent if not i in b]
end = timer()
print(end - start)

результат приведенного выше кода:

0.36757875100011006                                                                                                            
0.09286667400010629   

В вашем коде это будет примерно так.

import re
 import nltk
 nltk.download('stopwords')
 from nltk.corpus import stopwords
 from nltk.stem.porter import PorterStemmer
 corpus = []
 stopword_set = set(stopwords.words('english'))
 for i in range(0,3500):
     review = re.sub('[^a-zA-Z0-9]', ' ', str(dt["TEXT"][i]))
     review = review.lower()
     review = review.split()
     ps=  PorterStemmer()
     review = [ps.stem(word) for word in review if not word in stopword_set]review = ' '.join(review)
      corpus.append(review)

Я подозреваю, что в регулярном выражении можно сделать еще одно улучшение. регулярное выражение может работать медленно, если нам приходится каждый раз его компилировать.

# this can be optimized in your code....
review = re.sub('[^a-zA-Z0-9]', ' ', str(dt["TEXT"][i]))
...