2017-10-26 2 views
1

Ich versuche, eine Dokumentklassifikation mit PySpark durchzuführen.Schlüsselwörterwörterbuch in die Dokumentklassifikation mit PySpark-Code einbeziehen

Ich benutze die unten beschriebenen Schritte für das:

# Tokenizer 

tokenizer = Tokenizer().setInputCol("text").setOutputCol("words") 

# Stop Word removal 

    updated_stopwords_list = list(set(StopWordsRemover().getStopWords() + 
    custom_stopword_list)) 

remover_custom = StopWordsRemover(inputCol="words", outputCol="filtered", 
stopWords=updated_stopwords_list) 

# HashingTF 

hashingTF = HashingTF().setNumFeatures(1000).setInputCol("filtered").setOutputCol("rawFeatures") 

# IDF 

idf = 
IDF().setInputCol("rawFeatures").setOutputCol("features").setMinDocFreq(0) 
pipeline=Pipeline(stages=[tokenizer,remover_custom,hashingTF,idf]) 

Und ich bin mit ihm in einer Rohrleitung.

Nun, hier nach dem Entfernen der Stoppwörter, möchte ich ein Schlüsselwort Wörterbuch (Data Dictionary) enthalten, so dass es die Wörter aus dem Array (Out Put von Stoppwort Entferner ist ein Array von Wörtern) ausgewählt wird, die vorhanden ist in diesem Wörterbuch.

Kann mir bitte jemand sagen, wie man das macht? Ich lese das Schlüsselwortverzeichnis aus einer CSV-Datei.

Antwort

1

Wenn Sie hier nicht erforderlich verwenden HashingTF ist eine Option, die CountVectorizer mit durch das Vokabular zwingen Sie Ihre Keyword-Liste sein:

# Prepare keyword list to go into CountVectorizer. Can also use Tokenizer if your keywords are only single words 
str_to_arr_udf = udf(lambda s: [s], ArrayType(StringType())) 

# Fit CountVectorizer to keywords list so vocabulary = keywords 
keyword_df = spark.read.format("csv").load(csv_file) 
keyword_df.withColumn("filtered", str_to_arr_udf("keyword")) 
cv = CountVectorizer(inputCol="filtered", outputCol="filtered_only_keywords", binary=True) 
cvm = cv.fit(keyword_df) 

# Transform the actual dataframe 
cv.transform(df_output_from_stopwords) 

Ansonsten wird die UDF-Route ist immer eine Option. Etwas wie:

keyword_list = [x.word for x in spark.read.load(file).collect()] 
keep_words_udf = udf(lambda word_list: [ word for word in word_list if word in keyword_list], ArrayType(StringType())) 

diese Schlüsselwörter Liste Unter der Annahme, keine Worte in der StopWordsRemover Liste enthält, der StopWordsRemover Schritt ist eigentlich überflüssig.

+0

Hallo ayplam, danke für deine Antwort. Ich verwende den Stopwords-Parameter wie in der Frage erwähnt. Es löscht die Stoppwörter von der in Token gesetzten Ausgabe. Ich suche nicht nach etwas, das ich aus meinem Array entfernen könnte. Ich möchte nur die Wörter aus dem Array mit den Schlüsselwörtern auswählen. Also kann ich es nicht in Stoppwörtern verwenden, weil es diese Wörter entfernt. Ich möchte die Wörter beibehalten, indem ich mich auf das Schlüsselwortverzeichnis beziehe. Hoffe es ist jetzt klar. – Joe

+0

Hallo - Ich habe meine Antwort aktualisiert, um dies zu reflektieren. – ayplam

+0

Vielen Dank ayplam..Ich habe versucht, das udf und es funktioniert wie erwartet..Auch du hast recht über die Stopwörter Remover, ich kann diesen Schritt vermeiden :-) – Joe

Verwandte Themen