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-файлов, чем один?