Analisi lessicale
unknown
python
a year ago
5.6 kB
5
Indexable
import os import spacy import pandas as pd from lexical_diversity import lex_div as ld from collections import Counter import numpy as np nlp = spacy.load('it_core_news_sm') def analizza_testo(testo): testo = testo.lower() doc = nlp(testo) tokens = [token.text for token in doc if not token.is_punct and not token.is_digit] # Metriche di base e classificazione delle parole total_tokens = len(tokens) types = set(tokens) total_types = len(types) parole_contenuto = [token.text for token in doc if token.pos_ in ['NOUN', 'VERB', 'ADJ', 'ADV'] and not token.is_punct and not token.is_digit] parole_funzione = [token.text for token in doc if token.pos_ in ['ADP', 'CONJ', 'DET', 'PRON'] and not token.is_punct and not token.is_digit] lexical_density = len(parole_contenuto) / total_tokens if total_tokens > 0 else 0 # Calcolo della MTLD, HD-D, e MATTR mtld = ld.mtld(tokens) hdd = ld.hdd(tokens) mattr = ld.mattr(tokens) # Calcolo del rapporto contenuto/funzione if len(parole_funzione) > 0: rapporto_contenuto_funzione = len(parole_contenuto) / len(parole_funzione) else: rapporto_contenuto_funzione = float('inf') # Evita la divisione per zero # Calcolo reference to reality num_nouns = sum(1 for token in doc if token.pos_ == 'NOUN') num_verbs = sum(1 for token in doc if token.pos_ == 'VERB') reference_to_reality = num_nouns / num_verbs if num_verbs > 0 else 0 # Calcolo del numero medio di parole per frase sentences = list(doc.sents) num_sentences = len(sentences) mean_words_per_sentence = total_tokens / num_sentences if num_sentences > 0 else 0 # Calcolo del tasso delle parti del discorso pos_counts = doc.count_by(spacy.attrs.POS) total_pos = sum(pos_counts.values()) pos_rate = {doc.vocab.strings[k]: v / total_pos for k, v in pos_counts.items()} # Frequenza delle parole più comuni freq_words = Counter(tokens).most_common(10) # Distribuzione delle lunghezze delle frasi sentence_lengths = [len(sent) for sent in sentences] mean_sentence_length = np.mean(sentence_lengths) median_sentence_length = np.median(sentence_lengths) return { 'total_tokens': total_tokens, 'total_types': total_types, 'ttr': total_types / total_tokens if total_tokens > 0 else 0, 'lexical_density': lexical_density, 'rapporto_contenuto_funzione': rapporto_contenuto_funzione, 'MTLD': mtld, 'HDD': hdd, 'MATTR': mattr, 'reference_to_reality': reference_to_reality, 'mean_words_per_sentence': mean_words_per_sentence, 'pos_rate': pos_rate, 'freq_words': freq_words, 'mean_sentence_length': mean_sentence_length, 'median_sentence_length': median_sentence_length } def analizza_cartelle(root_folder): results = [] for root, dirs, files in os.walk(root_folder): for file in files: if file.endswith('.txt'): file_path = os.path.join(root, file) with open(file_path, 'r', encoding='utf-8') as f: testo = f.read() risultato = analizza_testo(testo) risultato['file'] = file # Aggiungi il nome del file per riferimento results.append(risultato) return results percorso_cartella_radice = "/Users/lauraocchipinti/analisi_lessicale/analisi_lessicale/corpus_covicor copia 2" risultati_analisi = analizza_cartelle(percorso_cartella_radice) df = pd.DataFrame(risultati_analisi) # Gestione delle colonne con valori di dizionario pos_rate_df = pd.json_normalize(df['pos_rate']) freq_words_df = pd.json_normalize(df['freq_words'].apply(dict)) df = df.drop(columns=['pos_rate', 'freq_words']) df = pd.concat([df, pos_rate_df, freq_words_df], axis=1) df.to_csv('metriche_dettaglio_dev.csv', index=False, escapechar='\\') # Calcolo delle statistiche complessive summary_stats = { 'Media TTR': df['ttr'].mean(), 'Deviazione Standard TTR': df['ttr'].std(), 'Media Lexical Density': df['lexical_density'].mean(), 'Deviazione Standard Lexical Density': df['lexical_density'].std(), 'Media Rapporto Contenuto/Funzione': df[df['rapporto_contenuto_funzione'] != float('inf')][ 'rapporto_contenuto_funzione'].mean(), 'Deviazione Standard Rapporto Contenuto/Funzione': df[df['rapporto_contenuto_funzione'] != float('inf')][ 'rapporto_contenuto_funzione'].std(), 'Media MTLD': df['MTLD'].mean(), 'Deviazione Standard MTLD': df['MTLD'].std(), 'Media HDD': df['HDD'].mean(), 'Deviazione Standard HDD': df['HDD'].std(), 'Media MATTR': df['MATTR'].mean(), 'Deviazione Standard MATTR': df['MATTR'].std(), 'Media Reference to Reality': df['reference_to_reality'].mean(), 'Deviazione Standard Reference to Reality': df['reference_to_reality'].std(), 'Media Mean Words per Sentence': df['mean_words_per_sentence'].mean(), 'Deviazione Standard Mean Words per Sentence': df['mean_words_per_sentence'].std(), 'Media Sentence Length': df['mean_sentence_length'].mean(), 'Deviazione Standard Sentence Length': df['mean_sentence_length'].std() } # Salvataggio delle statistiche complessive pd.DataFrame([summary_stats]).to_csv('metriche_riassuntive_dev_aaka.csv', index=False, escapechar='\\') print("Dettagli delle metriche salvati in 'metriche_dettaglio_dev.csv'.") print("Statistiche riassuntive del corpus salvate in 'metriche_riassuntive_dev_aaka.csv'.")
Editor is loading...
Leave a Comment