Как оптимизировать предварительную обработку всех текстовых документов без использования цикла for для предварительной обработки одного текстового документа в каждой итерации? - PullRequest
0 голосов
/ 24 января 2019

Я хочу оптимизировать приведенный ниже код, чтобы он мог эффективно обрабатывать 3000 текстовых данных, и эти данные затем будут передаваться в TFIDF Vectorizer и linkage () для кластеризации.

Пока я прочиталПревосходно использовал pandas и сохранил фрейм данных в переменную списка.Затем я перебрал список по каждому текстовому элементу в списке в токены, а затем отфильтровал стоп-слова из элемента.Отфильтрованный элемент сохраняется в другой переменной, и эта переменная сохраняется в списке.Итак, в конце я создал список обработанных текстовых элементов (из списка).

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

Было бы замечательно, если бы кто-то мог помочь мне в этом или предложить мне направление для подражания.

temp=0
df=pandas.read_excel('File.xlsx')

for text in df['text'].tolist():
    temp=temp+1
    preprocessing(text)
    print temp


def preprocessing(word):

    tokens = tokenizer.tokenize(word)

    processed_words = []
    for w in tokens:
        if w in stop_words:
            continue
        else:
    ## a new list is created with only the nouns in them for each text document
            processed_words.append(w)
    ## This step creates a list of text documents with only the nouns in them
    documents_no_stopwords.append(' '.join(processed_words))
    processed_words=[]

1 Ответ

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

Сначала нужно набрать set стоп-слов и использовать списки для фильтрации токенов.

def preprocessing(txt):
    tokens = word_tokenize(txt)
    # print(tokens)
    stop_words = set(stopwords.words("english"))
    tokens = [i for i in tokens if i not in stop_words]

    return " ".join(tokens)

string = "Hey this is Sam. How are you?"
print(preprocessing(string))

Выход:

'Hey Sam . How ?'

И вместо использования петли for используйте df.apply, как показано ниже:

df['text'] = df['text'].apply(preprocessing)

Почему наборы предпочтительнее списка

В * 1018 есть повторяющиеся записи Если вы проверите len(stopwords.words()) и len(set(stopwords.words())) длина сета меньше на несколько сотен. Вот почему set здесь предпочтительнее.

Вот разница между производительностью при использовании list и set

x = stopwords.words('english')
y = set(stopwords.words('english'))

%timeit new = [i for i in tokens if i not in x]
# 10000 loops, best of 3: 120 µs per loop

%timeit old = [j for j in tokens if j not in y]
# 1000000 loops, best of 3: 1.16 µs per loop

И, кроме того, list-comprehension быстрее, чем обычно for-loop.

...