Olá pessoal,
Preciso de ajuda para criar um Script Python no google colab que aplique a estrutura hierárquica específica ao texto fornecido conforme a necessidade e conforme a equivalência das marcações definidas
e identificadas para títulos, item e subitem. Adicionar ou replicar todos os marcadores da sua escala hierárquica.
Os marcadores títulos podem ser identificados nos textos com os seguintes formatos:
- Números únicos: 3
- Números duplos: 22
- Números duplos com ponto: 2.3
- Números triplos: 232
- Números triplos com pontos: 4.3.8
- Números quádruplos com pontos: 4.3.8.1
- Números quintuplos com pontos: 4.3.8.1.2
- Letras minúsculas com apenas um lado do parênteses: a)
- Letras minúsculas entre parênteses: (a)
- Números com apenas um lado do parênteses: 1)
- Números entre parênteses (1)
- Descrição: Attachment A, B, C...
- Descrição: Appendix 1, 2, 3...
- Descrição: Appendix A, B, C...
E os marcadores item e subitem podem ser identificados nos textos com os seguintes formatos:
- Números duplos: 22
- Números duplos com pontos: 2.3
- Números triplos: 232
- Números triplos com pontos: 4.3.8
- Números quádruplos com pontos: 4.3.8.1
- Números quintuplos com pontos: 4.3.8.1.2
- Letras minúsculas com apenas um lado do parênteses: a)
- Letras minúsculas entre parênteses: (a)
- Letras maiúsculas entre parênteses: (A)
- Números com apenas um lado do parênteses: 1)
- Números entre parênteses (1)
- Notas Explicativas: as notas devem ser identificadas como:
"Note 1, Note 2, Note 3...", e devem receber todas marcações hierárquica em ecalada do título, item ou subitem ao qual pertencerem ou estiverem dentro.
Exemplo:
1 TextoTextoTextoTextoTextoTextoTextoTextoTextoTextoTextoTexto
12 TextoTextoTextoTextoTextoTextoTextoTextoTextoTexto
1.1.2 TextoTextoTextoTextoTextoTextoTextoTextoTextoTexto
a) TextoTextoTextoTextoTextoTextoTextoTextoTextoTexto
b) TextoTextoTextoTextoTextoTextoTextoTextoTextoTexto
Note 1 - TextoTextoTextoTextoTextoTextoTextoTexto
Note 2 - TextoTextoTextoTextoTextoTextoTextoTexto
Ao incluir todos os marcadores em escalada ao textos tem que ficar dessa forma:
1 TextoTextoTextoTextoTextoTextoTextoTextoTextoTextoTextoTexto
1 12 TextoTextoTextoTextoTextoTextoTextoTextoTextoTexto
1 12 1.1.2 TextoTextoTextoTextoTextoTextoTextoTextoTextoTexto
1 12 1.1.2 a) TextoTextoTextoTextoTextoTextoTextoTextoTextoTexto
1 12 1.1.2. b) TextoTextoTextoTextoTextoTextoTextoTextoTextoTexto
1 12. 1.1.2. b) Note 1 - TextoTextoTextoTextoTextoTextoTextoTexto
1 12 1.1.2. b) Note 2 - TextoTextoTextoTextoTextoTextoTextoTexto
ESTOU USANDO O TEXTO ABAIXO COMO EXEMPLO, MAS OS TEXTOS PODEM TER QUALQUER UM DOS MARCADORES INFORMADOS ACIMA
Texto a ser aplicado:
3.5.3 The operator shall track the position of an aeroplane through automated reporting at least every 15 minutes for
the portion(s) of the in-flight operation(s) that is planned in an oceanic area(s) under the following conditions:
a) the aeroplane has a maximum certificated take-off mass of over 45 500 kg and a seating capacity greater than 19; and
b) where an ATS unit obtains aeroplane position information at greater than 15 minute intervals.
Note 1.— Oceanic area, for the purpose of aircraft tracking, is the airspace which overlies waters outside the territory of
a State.
Note 2.— See Annex 11, Chapter 2, for coordination between the operator and air traffic services providers regarding
position report messages.
Note 3.— Operational procedures for monitoring the aircraft tracking information are contained in PANS-OPS,
Volume III, Section 10.
COMO OS TEXTOS DEVEM FICAR:
3.5.3 The operator shall track the position of an aeroplane through automated reporting at least every 15 minutes for
the portion(s) of the in-flight operation(s) that is planned in an oceanic area(s) under the following conditions:
3.5.3 a) the aeroplane has a maximum certificated take-off mass of over 45 500 kg and a seating capacity greater than 19; and
3.5.3 b) where an ATS unit obtains aeroplane position information at greater than 15 minute intervals.
3.5.3 b) Note 1.— Oceanic area, for the purpose of aircraft tracking, is the airspace which overlies waters outside the territory of
a State.
3.5.3 b) Note 2.— See Annex 11, Chapter 2, for coordination between the operator and air traffic services providers regarding
position report messages.
3.5.3 b) Note 3.— Operational procedures for monitoring the aircraft tracking information are contained in PANS-OPS,
Volume III, Section 10.
Observe no texto acima que os marcadores foram adicionados aos textos que fazem parte da sua escala hierárquica!
CHEGUEI NESSE CÓDIGO MAS NÃO DEU CERTO:
# Instalação das bibliotecas necessárias
!pip install python-docx
import docx
from google.colab import files
import re
def upload_file():
# Solicita ao usuário que faça upload de um arquivo
uploaded = files.upload()
filename = next(iter(uploaded))
return filename
def detect_marker_type(text):
# Detecta o tipo de marcador e retorna o tipo e o nível
patterns = {
"single_number": r"^\d+\s",
"double_number": r"^\d+\.\d+\s",
"triple_number": r"^\d+\.\d+\.\d+\s",
"quad_number": r"^\d+\.\d+\.\d+\.\d+\s",
"quint_number": r"^\d+\.\d+\.\d+\.\d+\.\d+\s",
"lower_letter_paren": r"^\([a-z]\)\s",
"lower_letter": r"^[a-z]\)\s",
"upper_letter": r"^\([A-Z]\)\s",
"single_number_paren": r"^\(\d+\)\s",
"single_number_one_paren": r"^\d+\)\s",
"attachment": r"^(Attachment|Appendix)\s[A-Z0-9]+",
"note": r"^Note\s\d+"
}
for key, pattern in patterns.items():
if re.match(pattern, text):
return key
return None
def process_document(filename):
doc = docx.Document(filename)
level_stack = []
for para in doc.paragraphs:
text = para.text.strip()
marker_type = detect_marker_type(text)
if marker_type:
# Determine the hierarchy level
if marker_type in ["single_number", "double_number", "triple_number", "quad_number", "quint_number", "attachment"]:
level = 0 # Title levels reset hierarchy
elif marker_type in ["lower_letter", "lower_letter_paren", "upper_letter"]:
level = 1 # Item under title
elif marker_type in ["single_number_one_paren", "single_number_paren"]:
level = 2 # Subitem
elif marker_type == "note":
level = 3 # Note under subitem
# Adjust stack to current level
level_stack = level_stack[:level] + [text]
# Create hierarchical prefix
prefix = ' '.join(level_stack[:-1]) + ' ' if level_stack[:-1] else ''
# Update paragraph text with hierarchical prefix
para.text = prefix + text
# Save the processed document
new_filename = "processed_" + filename
doc.save(new_filename)
return new_filename
def download_file(filename):
# Trigger file download
files.download(filename)
# Running the script
uploaded_filename = upload_file()
processed_filename = process_document(uploaded_filename)
download_file(processed_filename)