Passado, futuro e presente do digital na História: Fontes, método e análise
Conteúdo
Passado, futuro e presente do digital na História: Fontes, método e análise¶
Material para o Encontro Virtual 2, 03/11/2021
Nessa aula vamos debater acerca dos elementos constitutivos da disciplina História e sua relação com as transformações e continuidades na era digital.
Buscamos avaliar o papel dos profissionais da História diante da sociedade contemporânea, assim como refletir sobre as mudanças de percepção do tempo e como isso pode afetar as formas de analisar e entender o passado e impactar nas formas de ensinar e narrar a História.
O historiador do futuro ou será programador ou não será?¶

FORTES, A.; ALVIM, L. G. M. Evidências, códigos e classificações: o ofício do historiador e o mundo digital. Esboços: histórias em contextos globais, v. 27, n. 45, p. 207–227, 19 jun. 2020.
Ofício do Históriador/a¶
Marc Bloch (2001) e E. P. Thompson (1981)¶
Conhecimento histórico => análise de fontes, validado pelo diálogo com a realidade, voltado para orientação da ação humana no presete (210)
Fontes sçao epistemologicamente transformadas em conhecimento histórico pela formulação de problçemas (Bloch) e perguntas que interrogam as evidências (Thompson)
Questões centrais da virada digital na História¶
AMpliação de fontes + ferramentas que auxiliam em análises ‘de qualidade superior’
Qual contribuição do ofício dp historiador/a para o enfrentamento dos dilemas da sociedade contemporânea marcada por Big Data, Fake news e Inteligência Artificial
Codificar e classificar¶
De que modo as operações congnitivas referentes à linguagem realizadas pelo historiador são afetadas pelo desenvolvimento da tecnologia digital? (212)
Processamento de Linguagem Natural (NLP)¶
Computadores “lendo” e “entendendo” linguagem humana.
Produção de conhecimento histórico e a relevância na era Digital¶
Instrumentos do historiodor/a - manipular evidências, transformar em ‘informações racionalmente classificadas’, escrever narrativas: é ao mesmo tempo método e técnica, mas também sensibilidade, ‘intuição alta’ (nas palavras de Ginzburg)
Chegarão as máquinas a desenvolver esse tipo de “alta intuição”? Em que tipo de operação cognitiva a inteligência artificial já pode, hoje em dia, auxiliar a pesquisa histórica? (215)
Possibilidades e caminhos: Inteligência Articifial, Processamento de Linguagem Natural e mais…¶
Análise textual (gramática, semântica, lexicográfica, etc.)
NER (Name Entity Recognition) - Nomes, entidades, etc.
Topic modeling - Modelagem de tópicos
Reconhecimento de Layout
Análise de redes
Georeferenciamento
Um rápido exemplo: Python e spaCy para “ler” Helena de Machado de Assis¶
Esses exemplos foram inspirados pelo material produzido por Melanie Walsh em seu curso “Introduction to cultural analytics & Python”.
# Instalando spacy
!pip install spacy
# importando spacy para ser usado no Python
import spacy
# lendo o arquivo de texto
corpus = open('umhomemclebre.txt', 'r').read()
# carregando o modelo de linguagem
nlp = spacy.load('pt_core_news_lg')
# processando o texto
doc = nlp(corpus)
Analisando as entidades do texto¶
# para cada entidade até 20 tokens
for named_entity in doc.ents[:20]:
# imprimindo o nome da entidade
print(named_entity.text, named_entity.label_)
Pestana LOC
Desculpe
MISC
Vexado PER
Pestana PER
Camargo LOC
Areal LOC
Amava PER
Pestana PER
Pestana PER
Pestana LOC
Diga ORG
Nhonhô PER
Pestana PER
saracotear LOC
Sinhazinha Mota PER
Pestana PER
Pestana PER
Formosa LOC
Dançava-se PER
Pestana PER
spacy.displacy.render(doc,style='ent') # renderizando a entidade
Analisando os tokens
do texto¶
# importando tokens
from spacy import tokens
# transformando em tokens
tokens = [token.orth_ for token in doc] # token.orth_ = token.text
Classes gramaticais¶
classes = [(token.orth_, token.pos_) for token in doc] # part of speech = classes gramaticais
print(f'Classes no corpus: {classes[:50]}')
Classes no corpus: [('Um', 'DET'), ('homem', 'NOUN'), ('célebre', 'ADJ'), (' ', 'SPACE'), ('*', 'PUNCT'), ('\n', 'SPACE'), ('-', 'PROPN'), ('Ah', 'PROPN'), ('!', 'PUNCT'), ('O', 'DET'), ('senhor', 'NOUN'), ('é', 'VERB'), ('que', 'SCONJ'), ('é', 'AUX'), ('o', 'DET'), ('Pestana', 'PROPN'), ('?', 'PUNCT'), ('-', 'PUNCT'), ('perguntou', 'VERB'), ('sinhazinha', 'NOUN'), ('Mota', 'PROPN'), (',', 'PUNCT'), ('fazendo', 'VERB'), ('um', 'DET'), ('largo', 'ADJ'), ('gesto', 'NOUN'), ('admirativo', 'ADJ'), ('.', 'PUNCT'), ('E', 'CCONJ'), ('logo', 'ADV'), ('depois', 'ADV'), (',', 'PUNCT'), ('corrigindo', 'VERB'), ('a', 'DET'), ('familiaridade', 'NOUN'), ('-', 'PUNCT'), (':', 'PUNCT'), ('Desculpe', 'INTJ'), ('\n', 'SPACE'), ('meu', 'DET'), ('modo', 'NOUN'), (',', 'PUNCT'), ('mas', 'CCONJ'), ('...', 'PUNCT'), ('é', 'AUX'), ('mesmo', 'ADV'), ('o', 'DET'), ('senhor', 'NOUN'), ('?', 'PUNCT'), ('\n', 'SPACE')]
Morfologia¶
morfologicas = [(token.orth_, token.morph) for token in doc] # morfologia de cada token
print(f'Morfologias: {morfologicas[:50]}')
Morfologias: [('Um', Definite=Ind|Gender=Masc|Number=Sing|PronType=Art), ('homem', Gender=Masc|Number=Sing), ('célebre', Gender=Masc|Number=Sing), (' ', ), ('*', ), ('\n', ), ('-', Number=Sing), ('Ah', Number=Sing), ('!', ), ('O', Definite=Def|Gender=Masc|Number=Sing|PronType=Art), ('senhor', Gender=Masc|Number=Sing), ('é', Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin), ('que', ), ('é', Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin), ('o', Definite=Def|Gender=Masc|Number=Sing|PronType=Art), ('Pestana', Gender=Masc|Number=Sing), ('?', ), ('-', ), ('perguntou', Mood=Ind|Number=Sing|Person=3|Tense=Past|VerbForm=Fin), ('sinhazinha', Gender=Fem|Number=Sing), ('Mota', Gender=Fem|Number=Sing), (',', ), ('fazendo', VerbForm=Ger), ('um', Definite=Ind|Gender=Masc|Number=Sing|PronType=Art), ('largo', Gender=Masc|Number=Sing), ('gesto', Gender=Masc|Number=Sing), ('admirativo', Gender=Masc|Number=Sing), ('.', ), ('E', ), ('logo', ), ('depois', ), (',', ), ('corrigindo', VerbForm=Ger), ('a', Definite=Def|Gender=Fem|Number=Sing|PronType=Art), ('familiaridade', Gender=Fem|Number=Sing), ('-', ), (':', ), ('Desculpe', ), ('\n', ), ('meu', Gender=Masc|Number=Sing|PronType=Prs), ('modo', Gender=Masc|Number=Sing), (',', ), ('mas', ), ('...', ), ('é', Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin), ('mesmo', ), ('o', Definite=Def|Gender=Masc|Number=Sing|PronType=Art), ('senhor', Gender=Masc|Number=Sing), ('?', ), ('\n', )]
Verbos¶
lemma_tokens = [token.lemma_ for token in doc if token.pos_ == 'VERB'] # reduz a palavra para o lema, nesse caso, apenas os verbos
print(f'Verbos no corpus: {lemma_tokens[:50]}')
Verbos no corpus: ['ser', 'perguntar', 'fazer', 'corrigir', 'responder', 'enxugar', 'ir', 'chegar', 'fazer', 'parar', 'ir', 'jantar', 'Amava', 'entravar', 'folgar', 'rir', 'falecer', 'arranjar', 'pedir', 'tocar', 'acabar', 'curvou-se', 'correr', 'Finda', 'descansar', 'correr', 'bulir', 'fazer', 'dissimular', 'inclinou-se', 'calar', 'ser', 'Ouvidos', 'derramou-se', 'correr', 'entrar', 'saracotear', 'publicar', 'haver', 'conhecido', 'chegar', 'supor', 'virar', 'meter', 'cachear', 'rapar', 'dizer', 'ver', 'ver', 'acabar']
Apenas tokens alfabéticos¶
alpha_tokens = [token.orth_ for token in doc if token.is_alpha]
print(f'Tokens alfa: {alpha_tokens[:50]}')
Tokens alfa: ['Um', 'homem', 'célebre', 'Ah', 'O', 'senhor', 'é', 'que', 'é', 'o', 'Pestana', 'perguntou', 'sinhazinha', 'Mota', 'fazendo', 'um', 'largo', 'gesto', 'admirativo', 'E', 'logo', 'depois', 'corrigindo', 'a', 'familiaridade', 'Desculpe', 'meu', 'modo', 'mas', 'é', 'mesmo', 'o', 'senhor', 'Vexado', 'aborrecido', 'Pestana', 'respondeu', 'que', 'sim', 'que', 'era', 'ele', 'Vinha', 'do', 'piano', 'enxugando', 'a', 'testa', 'com', 'o']
Seperar o texto em pedaços e analisar cada um¶
# criar grupos de tokens
import math
number_of_chunks = 80 # numero de grupos
chunk_size = math.ceil(len(corpus) / number_of_chunks) # tamanho de cada grupo
text_chunks = [] # lista de grupos
for number in range(0, len(corpus), chunk_size): # para cada grupo
text_chunk = corpus[number:number+chunk_size]
text_chunks.append(text_chunk)
chunked_documents = list(nlp.pipe(text_chunks)) # processando cada grupo
import pandas as pd # para criar um dataframe
from collections import Counter # para contar o numero de tokens por grupo
# criando um dataframe com PESSOAS
people = []
for document in chunked_documents:
for named_entity in document.ents:
if named_entity.label_ == "PER":
people.append(named_entity.text)
people_tally = Counter(people)
df = pd.DataFrame(people_tally.most_common(), columns=['character', 'count'])
df
character | count | |
---|---|---|
0 | Pestana | 27 |
1 | Maria | 8 |
2 | Mozart | 6 |
3 | Beethoven | 3 |
4 | Vexado | 2 |
5 | Bach | 2 |
6 | Schumann | 2 |
7 | Chopin | 2 |
8 | Camargo | 1 |
9 | Amava | 1 |
10 | Nhonhô | 1 |
11 | Sinhazinha Mota | 1 |
12 | Dançava-se | 1 |
13 | rentezinho | 1 |
14 | Cimarosa | 1 |
15 | Gluck | 1 |
16 | Haydn | 1 |
17 | sinhazinha Mota | 1 |
18 | pux | 1 |
19 | petiu Pestana | 1 |
20 | Candongas | 1 |
21 | espavento | 1 |
22 | Senhora dona | 1 |
23 | ma noite | 1 |
24 | Mota | 1 |
25 | São Francisco de Paula | 1 |
26 | São Cristóvão | 1 |
27 | Releu | 1 |
28 | Contentou-se | 1 |
29 | Imperador | 1 |
30 | Caxias | 1 |
31 | Conservara | 1 |
32 | César | 1 |
33 | Adeus | 1 |
# criando um dataframe com LOCAIS
places = []
for document in chunked_documents:
for named_entity in document.ents:
if named_entity.label_ == "LOC":
places.append(named_entity.text)
places_tally = Counter(places)
df = pd.DataFrame(places_tally.most_common(), columns=['place', 'count'])
df
place | count | |
---|---|---|
0 | Pestana | 9 |
1 | Aterrado | 2 |
2 | Areal | 1 |
3 | saracotear | 1 |
4 | Formosa | 1 |
5 | rava | 1 |
6 | ão | 1 |
7 | ordou | 1 |
8 | ha | 1 |
9 | Pingos | 1 |
10 | Mergulhava | 1 |
11 | Jordão | 1 |
12 | estana | 1 |
13 | sições | 1 |
14 | Labarraque | 1 |
15 | Redobrou | 1 |
16 | erdeu | 1 |
17 | Bravos | 1 |
18 | Roma | 1 |
19 | riu-lhe | 1 |
Analisar tokens em seu contexto¶
# contexto
from IPython.display import Markdown, display
import re
def get_ner_in_context(keyword, document, desired_ner_labels= False):
if desired_ner_labels != False:
desired_ner_labels = desired_ner_labels
else:
desired_ner_labels = ['PER', 'ORG', 'LOC']
#Iterate through all the sentences in the document and pull out the text of each sentence
for sentence in document.sents:
#process each sentence
sentence_doc = nlp(sentence.text)
for named_entity in sentence_doc.ents:
#Check to see if the keyword is in the sentence (and ignore capitalization by making both lowercase)
if keyword.lower() in named_entity.text.lower() and named_entity.label_ in desired_ner_labels:
#Use the regex library to replace linebreaks and to make the keyword bolded, again ignoring capitalization
#sentence_text = sentence.text
sentence_text = re.sub('\n', ' ', sentence.text)
sentence_text = re.sub(f"{named_entity.text}", f"**{named_entity.text}**", sentence_text, flags=re.IGNORECASE)
display(Markdown('---'))
display(Markdown(f"**{named_entity.label_}**"))
display(Markdown(sentence_text))
for document in chunked_documents:
get_ner_in_context('Mozart', document)
PER
Os demais retratos eram de compositores clássicos, Cimarosa, Mozart, Beethoven,
PER
era a vez de Mozart, pegou de um trecho, e executou-o do mesmo modo, com a alma alhures.
PER
Outras vezes, sentado, ao piano, deixava os dedos correrem, à ventura, a ver se as fantasias brotavam deles, como dos de Mozart;
PER
ar carroça; mas daí a dez minutos, ei-lo outra vez, com os olhos em Mozart, a imitá-lo ao piano.
PER
da véspera, sem exasperação, sem nada pedir ao céu, sem interrogar os olhos de Mozart
PER
empregou tudo, arrojo, paciência, meditação, e até os caprichos do acaso, como fizera outrora, imitando Mozart.
for document in chunked_documents:
get_ner_in_context('Maria', document)
PER
"Maria", balbuciou a alma dele, "dá-me o que não achei na solidão das noites, nem no tumulto dos dias.
PER
Chamar-lhe-ia Ave, Maria.
PER
usa difícil, porque Maria, que amava igualmente a arte, vinha tocar com ele, ou ouvi-lo somente, horas e horas, na sala dos retratos.
PER
Acaba - disse Maria -; não é Chopin?
PER
Maria assentou-se ao piano, e, depois de algum esforço de memória, executou a peça de Chopin.
PER
acordar Maria, que tossira toda noite, e agora dormia profundamente.
PER
Maria não soube nada;
PER
Enterrada a mulher, o viúvo teve uma única preocupação: deixar a música, depois de compor um Requiem, que faria executar no primeiro aniversário da morte de Maria.
O que dá pra fazer com isso?¶
Big Data terá um impacto revolucionário na base epistemológica da História?¶
Voltaremos a uma história quantitativa?
Voltaremos a uma hegemonia das fontes escritas?
Ou não muda nada?
Digital approaches to the past that sit within the digital humanities use our computational power to force us to look at the materials differently, to think about them playfully, and to explore what these sometimes jarring deformations could mean. (34)
Temporalidade e tecnologia digital¶
Não lembro nem o que comi ontem…
Ler, escrever e representar o passado: o que muda com a era digital?¶
Temporalidade: “constitutivo e estruturados do conheciumento histórico” (159)
como entender historicidade quando a orientação temporal é abalada no presente? (160)
Presente: “o tempo-espaço no qual se ministram as tensões e se fazem a gestão e o equacionamento entre passado e futuro: é o espaço das demandas e da onde emergem questões políticas que nos interpelam.”
Que outros ‘espaços de experiência’ e ‘horizontes de expectativa’ a tecnologia possibilita construir? (160)
Uso e problematização da tecnologia: descentralização da concepção de História como progresso linear.