от
Я могу успешно удалить дубликаты, используя метод
Spark Dataframe
dropDuplicates
, который считает 100% совпадение в точном порядке как дубликат. Так, например, если у нас есть два
"red toys"
, один из них считается дубликатом и отфильтровывается. Теперь новое требование говорит о том, что мы должны рассматривать те же слова в обратном порядке также как дубликаты. Поэтому, ссылаясь на приведенный выше пример, если у нас есть
"red toys"
и
"toys red"
, они будут считаться дублирующими и должны быть удалены. Это требование применимо только для 2 словосочетаний. Может кто-нибудь, пожалуйста, предложить подход для этого в
Spark
. Кроме того, интересно, если это вариант использования
Machine Learning
или
NLP
.              

Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.

1 Ответ

0 голосов
от
Наиболее простым решением было бы разделить предложение на массив слов, отсортировать массив и затем удалить дубликаты в зависимости от этого нового столбца. В Spark 2.4.0 это можно сделать с помощью
array_sort
и
split
следующим образом:
df.withColumn("arr", array_sort(split($"words", " ")))
  .dropDuplicates("arr")
Новый столбец
arr
можно удалить с помощью
.drop(arr)
, если требуется. Используя более старую версию Spark или если необходимо использовать более сложную логику (например, учитывайте только две словосочетания для обратного отбрасывания), необходимо использовать
UDF
. Например, чтобы рассмотреть только две словосочетания, мы можем использовать:
val sort_udf = udf((arr: Seq[String]) =
...