0% au considerat acest document util (0 voturi)
0 vizualizări8 pagini

Cod Pentru Python

Documentul descrie un proces de curățare a textului novelistic, eliminând zgomotul și normalizând spațiile. Apoi, se explică cum să se convertească datele într-un format CoNLL-U pentru antrenarea unui model BERT, inclusiv etichetele necesare pentru clasificarea token-urilor. În final, se prezintă un script pentru a rula predicții pe un text neadnotat utilizând modelul antrenat.

Încărcat de

contact
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
0 vizualizări8 pagini

Cod Pentru Python

Documentul descrie un proces de curățare a textului novelistic, eliminând zgomotul și normalizând spațiile. Apoi, se explică cum să se convertească datele într-un format CoNLL-U pentru antrenarea unui model BERT, inclusiv etichetele necesare pentru clasificarea token-urilor. În final, se prezintă un script pentru a rula predicții pe un text neadnotat utilizând modelul antrenat.

Încărcat de

contact
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd

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")

S-ar putea să vă placă și