Analisi lessicale

 avatar
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