Улучшение скорости предварительной обработки - PullRequest
0 голосов
/ 08 января 2019

Следующий код используется для предварительной обработки текста с помощью пользовательской функции лемматизатора:

%%time
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from gensim.utils import simple_preprocess, lemmatize
from gensim.parsing.preprocessing import STOPWORDS
STOPWORDS = list(STOPWORDS)

def preprocessor(s):
    result = []
    for token in lemmatize(s, stopwords=STOPWORDS, min_length=2):
        result.append(token.decode('utf-8').split('/')[0])
    return result

data = pd.read_csv('https://pastebin.com/raw/dqKFZ12m')

%%time
X_train, X_test, y_train, y_test = train_test_split([preprocessor(x) for x in data.text],
                                                    data.label, test_size=0.2, random_state=0)
#10.8 seconds

Вопрос: Можно ли повысить скорость процесса лемматизации?

В большом корпусе из около 80 000 документов это занимает около двух часов. Функция lemmatize() кажется основным узким местом, так как функция gensim, такая как simple_preprocess, довольно быстрая.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 08 января 2019

Вы можете реорганизовать свой код, чтобы упростить синхронизацию каждой части по отдельности. lemmatize() может быть частью вашего узкого места, но другие важные участники могут также: (1) составлять по одному крупному документу по списку через список .append(); (2) декодирование utf-8.

Отдельно gensim lemmatize() использует функцию parse() из библиотеки Pattern; Вы можете попробовать альтернативную утилиту для лемматизации, например, в NLTK или Spacy.

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

...