У меня есть Pandas Dataframe с некоторыми текстами от автора, и я хочу сделать некоторые статистические вещи с суммой различных типов слов.
Dataframe - мои данные:
>>> data
name style text year year_dt
number
0001 Demetrius D Demetrius an der russischen Grenze Er ist vo... 1805 1805-01-01
0002 Der versöhnte Menschenfeind D Der versöhnte Menschenfeind -Fragment Gegend... 1790 1790-01-01
0003 Die Braut von Messina D Die Braut von Messina oder die feindlichen B... 1803 1803-01-01
Несколько месяцев назад я написал функцию, которая выполняет итерацию от строки к строке df, берет имя и содержание «книги», делает pos-теги из spacy и подсчитывает количество существительных, прилагательных.и глаголы для начала.после этого номер сохраняется в новом столбце.
моя функция:
import spacy
from spacy.lang.de import German
from collections import defaultdict
nlp = spacy.load('de')
def calculate_the_word_types(data):
nouns = defaultdict(lambda: 0)
verbs = defaultdict(lambda: 0)
adjectives = defaultdict(lambda: 0)
# count all tokens, but not the punctuations
for i, row in data.iterrows():
doc = nlp(row["name"] + " " + row["text"])
data.set_value(i, "nr_token", len(list(map(lambda x: x.text,
filter(lambda x: x.pos_ != 'PUNCT', doc)))))
# count only the adjectives
for a in map(lambda x: x.lemma_, filter(lambda x: x.pos_ == 'ADJ', doc)):
adjectives[a] += 1
data.set_value(i, "nr_adj", len(list(map(lambda x: x.text,
filter(lambda x: x.pos_ == 'ADJ', doc)))))
# count only the nouns
for n in map(lambda x: x.lemma_, filter(lambda x: x.pos_ == 'NOUN', doc)):
nouns[n] +=1
data.set_value(i, "nr_noun", len(list(map(lambda x: x.text,
filter(lambda x: x.pos_ == 'NOUN', doc)))))
# count only the verbs
for v in map(lambda x: x.lemma_, filter(lambda x: (x.pos_ == 'AUX') | (x.pos_ == 'VERB'), doc)):
verbs[v] += 1
data.set_value(i, "nr_verb", len(list(map(lambda x: x.text,
filter(lambda x: (x.pos_ == 'AUX') | (x.pos_ == 'VERB'), doc)))))
return data
выход
>>> data
name style text year year_dt nr_token br_adj nr_noun nr_verb
number
0001 Deme... D Deme... 1805 1805-01-01 NaN NaN NaN NaN
0002 Der ... D Der ... 1790 1790-01-01 NaN NaN NaN NaN
0003 Die ... D Die ... 1803 1803-01-01 7127.0 584.0 1328.0 1286.0
Я думаю, это работало тогда, но не сейчас.потому что моя функция выводится следующим образом, и благодаря тестированию я знаю, что она работает, но числа всегда находятся только в последней строке, поэтому я думаю, что она перезаписывает себя.
где сбой?приветствуются любые советы или предложения по улучшению этой функции или, возможно, более простое решение!