使用 Spark Dataframe 以与重复项相反的顺序删除相同的单词

Dropping same words in reverse order as duplicates using Spark Dataframe

我能够使用 Spark Dataframe 方法 dropDuplicates 成功删除重复项,该方法将 100% 完全匹配的匹配项视为重复项。因此,例如,如果我们有两个 "red toys",其中一个被认为是重复的并被过滤掉。

现在新要求说,我们需要将相同的单词倒序也视为重复。所以参考上面的例子,如果我们有 "red toys""toys red",它们将被认为是重复的,应该被删除。此要求仅适用于 2 个单词的短语。

有人可以在 Spark 中建议为此采取的方法吗?另外,想知道这是否是 Machine LearningNLP.

的用例

最直接的解决方案是将句子拆分为单词数组,对数组进行排序,然后根据这个新列删除重复项。

Spark 2.4.0+ 中,这可以使用 array_sort and 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")