pyspark:具有用户定义函数(UDF)的 StopWordsRemover
pyspark: StopWordsRemover with user defined functions (UDF)
我有一个由文本和语言组成的数据框
sf = spark.createDataFrame([
('eng', "I saw the red balloon"),
('eng', 'She was drinking tea from a black mug'),
('ger','Er ging heute sehr weit'),
('ger','Ich habe dich seit hundert Jahren nicht mehr gesehen')
], ["lang", "text"])
display(sf)
输出:
+----+--------------------+
|lang| text|
+----+--------------------+
| eng|I saw the red bal...|
| eng|She was drinking ...|
| ger|Er ging heute seh...|
| ger|Ich habe dich sei...|
+----+--------------------+
我想删除每个文本的停用词,为此我创建了一个字典:
from pyspark.ml.feature import StopWordsRemover
ger_stopwords = StopWordsRemover.loadDefaultStopWords("german")
eng_stopwords = StopWordsRemover.loadDefaultStopWords("english")
stopwords = {'eng':eng_stopwords,
'ger':ger_stopwords}
现在我不明白如何使用 udf 将停用词应用于 col('text') ?因为在这种情况下 transform() 不适合我
我不知道如何使用 StopWordsRemover,但根据你所做的和文档,我可以提供这个解决方案(没有 UDF):
from functools import reduce
df = reduce(
lambda a, b: a.unionAll(b),
(
StopWordsRemover(
inputCol="splitted_text", outputCol="words", stopWords=value
).transform(
sf.where(F.col("lang") == key).withColumn(
"splitted_text", F.split("text", " ")
)
)
for key, value in stopwords.items()
),
)
df.show()
+----+----------------------------------------------------+--------------------------------------------------------------+--------------------------------------+
|lang|text |splitted_text |words |
+----+----------------------------------------------------+--------------------------------------------------------------+--------------------------------------+
|eng |I saw the red balloon |[I, saw, the, red, balloon] |[saw, red, balloon] |
|eng |She was drinking tea from a black mug |[She, was, drinking, tea, from, a, black, mug] |[drinking, tea, black, mug] |
|ger |Er ging heute sehr weit |[Er, ging, heute, sehr, weit] |[ging, heute, weit] |
|ger |Ich habe dich seit hundert Jahren nicht mehr gesehen|[Ich, habe, dich, seit, hundert, Jahren, nicht, mehr, gesehen]|[seit, hundert, Jahren, mehr, gesehen]|
+----+----------------------------------------------------+--------------------------------------------------------------+--------------------------------------+
我有一个由文本和语言组成的数据框
sf = spark.createDataFrame([
('eng', "I saw the red balloon"),
('eng', 'She was drinking tea from a black mug'),
('ger','Er ging heute sehr weit'),
('ger','Ich habe dich seit hundert Jahren nicht mehr gesehen')
], ["lang", "text"])
display(sf)
输出:
+----+--------------------+
|lang| text|
+----+--------------------+
| eng|I saw the red bal...|
| eng|She was drinking ...|
| ger|Er ging heute seh...|
| ger|Ich habe dich sei...|
+----+--------------------+
我想删除每个文本的停用词,为此我创建了一个字典:
from pyspark.ml.feature import StopWordsRemover
ger_stopwords = StopWordsRemover.loadDefaultStopWords("german")
eng_stopwords = StopWordsRemover.loadDefaultStopWords("english")
stopwords = {'eng':eng_stopwords,
'ger':ger_stopwords}
现在我不明白如何使用 udf 将停用词应用于 col('text') ?因为在这种情况下 transform() 不适合我
我不知道如何使用 StopWordsRemover,但根据你所做的和文档,我可以提供这个解决方案(没有 UDF):
from functools import reduce
df = reduce(
lambda a, b: a.unionAll(b),
(
StopWordsRemover(
inputCol="splitted_text", outputCol="words", stopWords=value
).transform(
sf.where(F.col("lang") == key).withColumn(
"splitted_text", F.split("text", " ")
)
)
for key, value in stopwords.items()
),
)
df.show()
+----+----------------------------------------------------+--------------------------------------------------------------+--------------------------------------+
|lang|text |splitted_text |words |
+----+----------------------------------------------------+--------------------------------------------------------------+--------------------------------------+
|eng |I saw the red balloon |[I, saw, the, red, balloon] |[saw, red, balloon] |
|eng |She was drinking tea from a black mug |[She, was, drinking, tea, from, a, black, mug] |[drinking, tea, black, mug] |
|ger |Er ging heute sehr weit |[Er, ging, heute, sehr, weit] |[ging, heute, weit] |
|ger |Ich habe dich seit hundert Jahren nicht mehr gesehen|[Ich, habe, dich, seit, hundert, Jahren, nicht, mehr, gesehen]|[seit, hundert, Jahren, mehr, gesehen]|
+----+----------------------------------------------------+--------------------------------------------------------------+--------------------------------------+