Denoising
import re
import os
def clean_novel_text(raw_text):
# 1. ELIMINAREA LINIUȚELOR DE DESPĂRȚIRE (De-hyphenation)
# Caută o liniuță urmată de un rând nou și eventuale spații, apoi le șterge
text = [Link](r'-\s*\n\s*', '', raw_text)
# 2. ELIMINAREA ZGOMOTULUI DE BIBLIOTECĂ / METADATE
# Definim o listă de tipare specifice care apar în OCR-ul tău
noise_patterns = [
r'UNIVERSITATEA TRANSILVANIA DIN.*',
r'BAA\$0\'t',
r'BIBLIOTECA.*',
r'Rotbuch Verlag',
r'I\b' # \b asigură că șterge 'I' doar ca literă separată, nu în cuvinte ca 'In'
]
for pattern in noise_patterns:
text = [Link](pattern, '', text, flags=[Link])
# 3. NORMALIZAREA SPAȚIILOR
# Înlocuim rândurile noi simple cu un spațiu (pentru a uni propozițiile rupte)
# Dar păstrăm paragrafele (unde există cel puțin două rânduri noi)
text = [Link](r'(?<!\n)\n(?!\n)', ' ', text)
# Eliminăm spațiile multiple rezultate din ștergeri
text = [Link](r' +', ' ', text)
# 4. CURĂȚAREA FINALĂ
text = [Link]()
return text
# --- UTILIZARE ---
input_filename = "B_Lied_testneadnotat.txt" # Verifică dacă extensia e .txt sau .csv
output_filename = "roman_clean.txt"
try:
# Verificăm dacă fișierul există înainte de a-l deschide
with open(input_filename, "r", encoding="utf-8") as f:
raw_content = [Link]()
cleaned_content = clean_novel_text(raw_content)
with open(output_filename, "w", encoding="utf-8") as f:
[Link](cleaned_content)
print(f"Denoising complet! Verifică fișierul '{output_filename}'.")
except FileNotFoundError:
print(f"Eroare: Asigură-te că fișierul '{input_filename}' există în folder.")
except Exception as e:
print(f"A apărut o eroare neașteptată: {e}")
Dupa ce am clean text creez CONLL-U file, cu Stanza o sa creeze automat 9
coloane si imi lasa mie MISC pentru adnotarile culturale
pip install stanza
import stanza
from [Link] import CoNLL
genereaza_conllu.py – am creat in Notepad un fisier genereaza_conllu.py care continue
codul pe care trebuie sa il rulez in python
Etichete in MISC
Sie war geflohen von den Verhaltnissen, vor allem vor ihrem Vater.
Conversia înapoi în formatul CoNLL-U pur
BERT (prin bibliotecile Hugging Face) preferă formatul text standard CoNLL-U, nu CSV.
Pentru a ajunge la [Link](), ai nevoie de o funcție care să citească fișierul tău
CSV/Excel și să îl transforme în formatul [Link].
Cod pentru conversie
python
import pandas as pd
import torch
from transformers import AutoTokenizer, AutoModelForTokenClassification,
TrainingArguments, Trainer
pip install datasets
from datasets import Dataset
# 1. Încărcarea datelor
def load_and_parse_data(file_path):
df = pd.read_csv(file_path)
sentences = []
labels = []
current_words = []
current_labels = []
for _, row in [Link]():
token_id = str(row['Column1.1'])
word = str(row['Column1.2'])
misc = str(row['Column1.10'])
# Detectăm începutul unei noi propoziții (după comentarii sau ID 1)
if token_id.startswith("#"):
continue
if token_id == "1" and current_words:
[Link](current_words)
[Link](current_labels)
current_words = []
current_labels = []
# Extragem tag-ul sociolingvistic (ex: din Trait=habitus extragem habitus)
# Dacă nu există tag, punem "O" (Outside)
tag = "O"
if "Trait=" in misc:
try:
tag = [Link]("Trait=")[1].split("|")[0]
except:
tag = "O"
current_words.append(word)
current_labels.append(tag)
# Adăugăm ultima propoziție
if current_words:
[Link](current_words)
[Link](current_labels)
return sentences, labels
# Rulează parsarea
sentences, labels = load_and_parse_data("fisierul_tau.csv")
# Creăm harta de label-uri
unique_tags = sorted(list(set([t for sublist in labels for t in sublist])))
tag2id = {tag: i for i, tag in enumerate(unique_tags)}
id2tag = {i: tag for tag, i in [Link]()}
Instalare BERT si Instalare parser de CoNLL-U
pip install transformers[torch] datasets seqeval conllu
pip install conllu seqeval
Deschid Notepad si scriu codul pentru antrenarea BERT acolo si
salvez ca prepare_bert.py - Acest script îi va arăta lui BERT ce are de
învățat.
Pentru proiectul tău, avem nevoie de un script de Token Classification
Label list
label_list = [
"O",
"trait=habitus|branch=ideational|valence=pos",
"trait=habitus|branch=social|valence=pos",
"trait=habitus|branch=ideational|valence=neg",
"trait=habitus|branch=social|valence=neg",
"trait=capital|branch=ideational|valence=pos",
"trait=capital|branch=social|valence=pos",
"trait=capital|branch=ideational|valence=neg",
"trait=capital|branch=social|valence=neg",
"trait=field|branch=ideational|valence=pos",
"trait=field|branch=social|valence=pos",
"trait=field|branch=ideational|valence=neg",
"trait=field|branch=social|valence=neg"
]
Rulare cod pe test neadnotat – creeaza un notepad predict_bert.py
import torch
from transformers import BertTokenizerFast, BertForTokenClassification
# 1. Configurare (Aceeași listă ca la antrenare)
label_list = [
"O",
"trait=habitus|branch=ideational|valence=pos",
"trait=habitus|branch=social|valence=pos",
"trait=habitus|branch=ideational|valence=neg",
"trait=habitus|branch=social|valence=neg",
"trait=capital|branch=ideational|valence=pos",
"trait=capital|branch=social|valence=pos",
"trait=capital|branch=ideational|valence=neg",
"trait=capital|branch=social|valence=neg",
"trait=field|branch=ideational|valence=pos",
"trait=field|branch=social|valence=pos",
"trait=field|branch=ideational|valence=neg",
"trait=field|branch=social|valence=neg"
id2label = {i: l for i, l in enumerate(label_list)}
# 2. Încărcare Model și Tokenizer salvat
model_path = "./gbert-literary-agency"
tokenizer = BertTokenizerFast.from_pretrained('deepset/gbert-base')
model = BertForTokenClassification.from_pretrained(model_path)
device = [Link]('cuda' if [Link].is_available() else 'cpu')
[Link](device)
[Link]()
# 3. Citire text neadnotat
input_file = "[Link]"
with open(input_file, "r", encoding="utf-8") as f:
text = [Link]()
# Împărțim textul în propoziții brute (o metodă simplă)
sentences = [Link]("!", ".").replace("?", ".").split(".")
print(f"Rezultate pentru textul: {input_file}\n" + "-"*50)
for sent in sentences:
if len([Link]()) < 5: continue
# Pregătire input
inputs = tokenizer(sent, return_tensors="pt", truncation=True, padding=True,
max_length=128).to(device)
with torch.no_grad():
outputs = model(**inputs).logits
predictions = [Link](outputs, dim=2)
# Conversie înapoi în cuvinte și etichete
tokens = tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
preds = predictions[0].cpu().numpy()
output_results = []
for sent in sentences:
if len([Link]()) < 5: continue
inputs = tokenizer(sent, return_tensors="pt", truncation=True, padding=True,
max_length=128).to(device)
with torch.no_grad():
outputs = model(**inputs).logits
predictions = [Link](outputs, dim=2)
tokens = tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
preds = predictions[0].cpu().numpy()
sent_output = f"\nPropoziție: {[Link]()}\n"
found_traits = False
for token, pred_id in zip(tokens, preds):
label = id2label[pred_id]
if label != "O" and not [Link]("["):
sent_output += f" >>> [{token}] -> {label}\n"
found_traits = True
if found_traits:
output_results.append(sent_output)
# SALVARE ÎN FIȘIER
with open("rezultate_predictie.txt", "w", encoding="utf-8") as out_f:
out_f.writelines(output_results)
print("GATA! Rezultatele au fost salvate în: rezultate_predictie.txt")