Есть ли способ (например, распараллеливание, многопоточность, многопроцессорность) для оптимизации времени выполнения цикла for? - PullRequest
0 голосов
/ 28 июня 2019
import pandas as pd
import spacy
from spacy.lang.de import German
from collections import defaultdict

data = pd.DataFrame()

#json file 2017
for year in range (2017,2018):
    data = pd.concat([data, pd.read_json("%d.json" % year, orient = "records")], ignore_index=True)

nlp = spacy.load('de', disable=["ner"])

nouns = defaultdict(lambda: 0)
verbs = defaultdict(lambda: 0)
adjectives = defaultdict(lambda: 0)

#for loop that takes an enormous amount of time
for i, row in data.iterrows():
    doc = nlp(row["headline"] + " " + row["text"])

    filteradj = filter(lambda x: x.pos_ == 'ADJ', doc)
    filternoun = filter(lambda x: x.pos_ == 'NOUN', doc)
    filterverb = filter(lambda x: (x.pos_ == 'AUX') | (x.pos_ == 'VERB'), doc)

    punctlen = len(list(map(lambda x: x.text, filter(lambda x: x.pos_ != 'PUNCT', doc))))
    adjlen = len(list(map(lambda x: x.text, filter(lambda x: x.pos_ == 'ADJ', doc)))) 
    nounlen = len(list(map(lambda x: x.text, filter(lambda x: x.pos_ == 'NOUN', doc))))
    verblen = len(list(map(lambda x: x.text, filter(lambda x: (x.pos_ == 'AUX') | (x.pos_ == 'VERB'), doc))))

    data.at[i, "nr_token"] = punctlen
    data.at[i, "nr_adj"] = adjlen
    data.at[i, "nr_noun"] = nounlen
    data.at[i, "nr_verb"] = verblen

    for a in map(lambda x: x.lemma_, filteradj):
        adjectives[a] += 1 

    for n in map(lambda x: x.lemma_, filternoun):
        nouns[n] +=1 

    for v in map(lambda x: x.lemma_, filterverb):
        verbs[v] += 1

Я бы хотел провести анализ различных файлов JSON.

Базовая структура панд - это так называемая DataFrame . Сначала я создал DataFrame, а затем добавил к нему данные за отдельные годы (здесь только один год). Это гарантирует, что все данные доступны в одной структуре.

Объект NLP , созданный spaCY , очень велик и требует много памяти. Чтобы смягчить это, хранятся только необходимые данные, то есть количество жетонов, прилагательных, существительных и глаголов. Defaultdict помогает, потому что все значения установлены в 0, что сохраняет много различий в регистрах.

Сами слова также необходимы в их лемматизированной форме (то есть грамматически сведены к базовой форме), чтобы иметь возможность проводить с ними анализ позже.

Код работает на виртуальной машине в Google Cloud. При добавлении ЦП время выполнения цикла for изменяется незначительно.

Есть ли способ распараллелить цикл for (например, с помощью многопоточности, многопроцессорной обработки и т. П.), Чтобы значительно сократить время выполнения и добавить больше json-файлов, чем один?

...