Un’operazione di filtraggio importante, nella processazione dei dataset, consiste nella rimozione delle stop word. In questo post propongo due esempi di implementazione di tale filtraggio basati nell’ambiente Knime. Il secondo esempio, in particolare, fonde la sintesi e la ricchezza di Python con la comodità di impiego di Knime: una coppia eccezionale, come vedremo.

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.

Knime stop list filtering

Knime stop list filtering

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

  • il nodo 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;
  • il nodo 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);
  • il nodo 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.

Nel nodo Stop word Filter è possibile selezionare una stop list built-in per la lingua desiderata (incluso quella Italiana) o, alternativamente, inserire il percorso ad una stop list custom memorizzata come file su disco. 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. Ulteriore processazioni e filtraggi richiederanno il collegamento in cascata di altri nodi di elaborazione, secondo lo stile classico di Knime.

Nel secondo esempio (Ex. 2) si è incapsulato del codice Python nel nodo wrapper Scripting>Python>Python Script (2:1). Il codice incapsulato utilizza un package esterno per la rimozione delle stop word (abbiamo usato la libreria stop-words) e contemporaneamente anche una lista custom (creata mediante il nodo Table Creator in Knime). Il codice non richiede una preventiva conversione al tipo di dato Text Document (quindi opera direttamente sulle stringhe acquisite dal CSV reader). Per scopo dimostrativo, il codice incapsulato è stato ulteriormente esteso aggiungendo un parsing che tiene conto della punteggiatura, esegue un filtraggio sulla lunghezza minima delle parole, esegue la rimozione di token consistenti di soli numeri o sola punteggiatura. Sia ben inteso che queste processazioni aggiuntive potrebbero essere eseguite anche all’interno dell’ambiente Knime, aggiungendo in cascata più nodi. La sinteticità e praticitià di Python consentono, comunque, di snellire il flusso di esecuzione potendo, inoltre, accedere ad una immensa varietà di package del mondo Python.

Il codice incapsulato nel secondo esempio è mostrato nel blocco seguente:

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)

Ovviamente il codice è perfettibile, parametrizzabile ed estendibile, ma ciò che è interessante è la semplicità con cui si è sviluppato un nuovo nodo di elaborazione integrando codice Python e ambiente ospitante Knime (essenzialmente questa interazione si fonda sullo scambio di oggetti Dataframe della libreria pandas). Questo è tutto. Felice utilizzo!

Pubblicato da lorenzo

Full-time engineer. I like to write about data science and artificial intelligence.

Vuoi commentare?