我已经成功使用Spark Dataframe
的方法dropDuplicates
来删除重复项,该方法将完全匹配且顺序相同的项视为重复项。例如,如果我们有两个"red toys"
,其中一个会被视为重复项并被过滤掉。
现在新的需求指出,我们需要将相同词语的逆序也视为重复项。参照上面的例子,如果我们有"red toys"
和"toys red"
,它们将被视为重复项并应被移除。这一需求仅适用于两个词的短语。
请问有人可以建议在Spark
中实现这一需求的方法吗?另外,我想知道这是否属于机器学习
或自然语言处理
的用例。
回答:
最直接的解决方案是将句子拆分为词语数组,对数组进行排序,然后根据这个新列来删除重复项。
在Spark 2.4.0+中,可以使用array_sort
和split
来实现,如下所示:
df.withColumn("arr", array_sort(split($"words", " "))) .dropDuplicates("arr")
如果需要,可以使用.drop(arr)
来删除新的arr
列。
如果使用的是较旧的Spark版本,或者需要使用更复杂的逻辑(例如仅对两个词的短语进行逆序删除),则需要使用UDF
。例如,要仅考虑两个词的短语,我们可以使用:
val sort_udf = udf((arr: Seq[String]) => { if (arr.size == 2) arr.sorted else arr})df.withColumn("arr", sort_udf(split($"words", " "))) .dropDuplicates("arr")