Pre Process bei csv dateien

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Silentium
User
Beiträge: 1
Registriert: Sonntag 13. Juni 2021, 20:17

Ich versuche leerzeichen, satzzeichen usw. aus der Tabelle zu entfernen(Für einen SpamSchutz)
Aber immer wenn ich das Script ausführe sieht er das lambda bzw das sms bei lowercase als float und wirft anschließend einen Fehler(da float nicht iterable sind)
Nach meinem Verständnis sollte es trotzdem gehen daher die Frage was falsch ist bzw. was ich ändern kann um dieses Problem zu "umschiffen"


import string
import nltk
import math
import csv
import pandas as pd
import numpy as np

# read data
data = pd.read_csv('spam-sms.data', header=None, names=['Class', 'SMS'], engine='python')
data.head()
# load stopwords and punctuation
nltk.download('stopwords')
nltk.download('punkt')
stopwords = nltk.corpus.stopwords.words('english')
punctuation = string.punctuation

# pre-process
def pre_process(sms):
lowercase = "".join([char.lower() for char in sms if char not in punctuation])
tokenize = nltk.tokenize.word_tokenize(lowercase)
remove_stopwords = [word for word in tokenize if word not in stopwords]
return remove_stopwords

data['Pre-Processed'] = data['SMS'].apply(lambda x: pre_process(x))
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Silentium: Das Problem kann ich nicht nachvollziehen. Zeig mal die tatsächliche Fehlermeldung mit Traceback 1:1 kopiert.

Anmerkungen zum Quelltext: Die Module `csv`, `math`, und `numpy` werden importiert, aber nicht verwendet.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Funktionen sollten alles was sie ausser Konstanten benötigen, als Argument(e) übergeben bekommen. `pre_process()` braucht also noch `stopwords` und `punctuation` als Argumente. Dann macht auch der ``lambda``-Ausdruck Sinn, denn vorher hätte man den nicht gebraucht wenn der nur das eine Argument entgegen nimmt und an `pre_process()` weiter gibt. Da hätte man gleich die Funktion an `apply()` übergeben können.

`data.head()` macht keinen Sinn wenn man mit dem Rückgabewert nichts macht.

`tokenize` und `remove_stopwords` beschreiben Tätigkeiten und wären damit gute Namen für Funktionen/Methoden, aber nicht für die Rückgabewerte von Funktionen/Methoden.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import string
from functools import partial

import nltk
import pandas as pd

SMS_DATA_FILENAME = "spam-sms.data"
SMS_DATA_FILENAME = "test.csv"


def pre_process(stopwords, punctuation, sms):
    return [
        word
        for word in nltk.tokenize.word_tokenize(
            "".join(
                character.lower()
                for character in sms
                if character not in punctuation
            )
        )
        if word not in stopwords
    ]


def main():
    data = pd.read_csv(
        SMS_DATA_FILENAME, header=None, names=["Class", "SMS"], engine="python"
    )
    nltk.download("stopwords")
    nltk.download("punkt")
    data["Pre-Processed"] = data["SMS"].apply(
        partial(
            pre_process,
            nltk.corpus.stopwords.words("english"),
            string.punctuation,
        )
    )
    print(data)


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten