Analisi lessicale
unknown
python
a year ago
5.6 kB
10
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