Knime

Dataset di esempio

Il dataset che ho usato per verificare il funzionamento delle due catene Knime è scaricabile seguendo il link:

corpus-ML-58-082816.csv

Il dataset è memorizzato in formato CSV e contiene un corpus di documenti. Ogni documento è codificato come una stringa e corrisponde ad una linea del file CSV.

Implementazione con nodi nativi Knime (Esempio 1)

Immagine dell'articolo

Nel primo esempio (Ex. 1) abbiamo una catena di tre elementi:

Struttura del workflow

  • File Reader: Per la lettura del CSV e la generazione di una tabella con una stringa per riga (una stringa corrisponde al testo di un documento). La tabella di output sarà poi usata ed estesa dai nodi seguenti.

  • Strings to Document: Per la conversione di ogni stringa in un oggetto di tipo Text Document (tipo interno di Knime). L'output consiste in una tabella contenente una colonna con gli oggetti Text Document (uno per riga).

  • Stop word Filter: Cicla su ogni riga, legge gli oggetti di tipo Text Document e provvede alla rimozione delle stop word dal contenuto, aggiungendo una nuova colonna con oggetti Text Document filtrati.

Caratteristiche del nodo Stop word Filter

Nel nodo Stop word Filter è possibile selezionare:

  • Stop list built-in per la lingua desiderata (incluso quella Italiana)
  • Stop list custom memorizzata come file su disco

Nota importante: Non è possibile impiegare contemporaneamente due stop list: una built-in e una custom. Nel caso di impiego combinato di più liste, è necessario collegare in cascata più nodi Stop word Filter. Ulteriori processazioni e filtraggi richiederanno il collegamento in cascata di altri nodi di elaborazione, secondo lo stile classico di Knime.

Implementazione con Python Script (Esempio 2)

Nel secondo esempio (Ex. 2) si è incapsulato del codice Python nel nodo wrapper Scripting > Python > Python Script (2:1).

Vantaggi dell'approccio Python

Il codice incapsulato utilizza:

  • Package esterno per la rimozione delle stop word (libreria stop-words)
  • Lista custom creata mediante il nodo Table Creator in Knime
  • Processazione diretta sulle stringhe (senza conversione a Text Document)
stop-words

Funzionalità aggiuntive

Per scopo dimostrativo, il codice incapsulato è stato ulteriormente esteso aggiungendo:

  • Parsing che tiene conto della punteggiatura
  • Filtraggio sulla lunghezza minima delle parole
  • Rimozione di token consistenti di soli numeri o sola punteggiatura

Codice Python integrato

Il codice incapsulato nel secondo esempio:

from nltk.tokenize import wordpunct_tokenize
import string
import pandas as pd
from stop_words import get_stop_words

min_word_len=3
input_column_name="Col0"
custom_column_name="stopword"

stoplist=get_stop_words('italian')
output_table=pd.DataFrame(columns=[input_column_name])

for index, row in input_table_1.iterrows():
	filtered_corpus = [word for word in wordpunct_tokenize(row[input_column_name].lower()) 
					   if word not in stoplist 
					   and not word in input_table_2[custom_column_name].values 
					   and word not in string.punctuation 
					   and len(word)>min_word_len 
					   and not word.isdigit()]
	output_table.loc[len(output_table)]=" ".join(str(item) for item in filtered_corpus)

Analisi del codice

Il codice implementa un pipeline di filtraggio completo che:

  1. Tokenizza il testo usando wordpunct_tokenize
  2. Converte in minuscolo per uniformità
  3. Filtra le stop word italiane
  4. Rimuove parole della lista custom
  5. Esclude la punteggiatura
  6. Applica filtro lunghezza minima
  7. Elimina token numerici

Confronto tra gli approcci

Approccio nativo Knime

Vantaggi:

  • ✅ Interfaccia grafica intuitiva
  • ✅ Nessuna programmazione richiesta
  • ✅ Integrazione nativa con l'ecosistema Knime
  • ✅ Visualizzazione immediata dei risultati

Limitazioni:

  • ⚠️ Limitato a stop list predefinite o singole liste custom
  • ⚠️ Richiede conversione a Text Document
  • ⚠️ Workflow più lungo per operazioni complesse

Approccio Python Script

Vantaggi:

  • Flessibilità massima nella logica di filtraggio
  • Accesso a librerie Python specializzate
  • Combinazione di multiple stop list
  • Processazione avanzata (regex, parsing complesso)
  • Codice compatto per operazioni multiple

Considerazioni:

  • 🔧 Richiede conoscenza di Python
  • 🔧 Debug più complesso rispetto all'interfaccia grafica

Vantaggi dell'integrazione Python-Knime

La sinteticità e praticità di Python consentono di:

  • Snellire il flusso di esecuzione
  • Accedere ad una immensa varietà di package del mondo Python
  • Implementare logiche complesse in poche righe
  • Mantenere la comodità dell'interfaccia Knime per il workflow generale

Interazione tecnica

L'interazione tra Python e Knime si fonda sullo scambio di oggetti DataFrame della libreria pandas, rendendo l'integrazione naturale e efficiente.

pandas

Ottimizzazioni e estensioni

Il codice presentato è perfettibile, parametrizzabile ed estendibile. Possibili miglioramenti includono:

Parametrizzazione

  • Configurazione esterna dei parametri di filtraggio
  • Selezione dinamica della lingua
  • Controllo granulare delle regole di filtraggio

Estensioni funzionali

  • Stemming e lemmatizzazione
  • Riconoscimento di entità nominate
  • Analisi della frequenza dei termini
  • Normalizzazione avanzata del testo

Performance

  • Ottimizzazione per grandi dataset
  • Parallelizzazione del processing
  • Caching delle stop list

Conclusioni

Questo esempio dimostra la potenza dell'integrazione tra Python e Knime per il text processing. Mentre l'approccio nativo offre semplicità e immediatezza, l'integrazione con Python apre possibilità praticamente illimitate per implementazioni avanzate di NLP.

La scelta dell'approccio dipende da:

  • Complessità dei requisiti di filtraggio
  • Esperienza del team con Python
  • Necessità di personalizzazione avanzata
  • Volume e varietà dei dati da processare

L'integrazione Python-Knime rappresenta il meglio dei due mondi: la potenza e flessibilità di Python con l'usabilità e la gestione visuale dei workflow di Knime.

Questo è tutto. Felice utilizzo!