Ускорение pd.DataFrame.apply () для столбца большого набора данных - PullRequest
0 голосов
/ 28 января 2020

Я применяю следующую функцию к набору данных, содержащему ~ 23000 строк, и он работает очень медленно. Я предполагаю, что это потому, что в функцию, которую я использовал для удаления знаков препинания и стоп-слов, есть для циклов . Я запускаю линию, которая применяет text_process к моему фрейму данных уже почти 15 минут, но мне интересно, есть ли для меня более разумный способ сделать эту обработку.

Открыто для всех предложений!

Вот мой код:

def text_process(text):
    """
    Takes in string of text, and does following operations: 
    1. Removes punctuation + unicode quotations. 
    2. Removes stopwords. 
    3. Returns a list of cleaned "tokenized" text.
    """

    punctuation = [c for c in string.punctuation] + [u'\u201c',u'\u201d',u'\u2018',u'\u2019']

    nopunc = [char for char in text if char not in punctuation]

    nopunc = ''.join(nopunc)

    return [word.lower() for word in nopunc.split() if word not in 
           stopwords.words('english')]

pitchfork['content_clean'] = pitchfork['content'].apply(text_process)

Ответы [ 2 ]

1 голос
/ 28 января 2020

Я бы попробовал использовать регулярные выражения для удаления знаков препинания. Например, если вам нужны только буквы, цифры и пробелы, вы можете сделать что-то вроде этого:

import re

#...

def clean_text(content):
    """Converts string to lowercase and removes 
    any characters that aren't a-z, 0-9 or whitespace"""
    return re.sub(r"[^a-z0-9\s]","",content.lower())


pitchfork['content_clean'] = pitchfork['content'].apply(clean_text)

Кроме того, вы теряете время, воссоздавая список пунктуации при каждом запуске функции.

1 голос
/ 28 января 2020

Просто чтобы быть рядом с вашим кодом. Перемещение некоторых операций за пределы функции, которая вызывается 23000 раз, ускорит процесс (создание строки пунктуации или выбор стоп-слов для Engli sh не требуется при каждом вызове):

punctuation = [c for c in string.punctuation] + [u'\u201c', u'\u201d', u'\u2018', u'\u2019']

stopwords2 = set(stopwords.words('english'))


def text_process(text):
    """
    Takes in string of text, and does following operations: 
    1. Removes punctuation + unicode quotations. 
    2. Removes stopwords. 
    3. Returns a list of cleaned "tokenized" text.
    """
    nopunc = (char for char in text if char not in punctuation)  # changed to a generator

    nopunc2 = ''.join(nopunc)

    return [word.lower() for word in nopunc2.split() if word not in stopwords2]


pitchfork['content_clean'] = pitchfork['content'].apply(text_process)

Есть еще возможны улучшения с использованием re.sub (regex replace), хотя ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...