Удаление тех же слов в обратном порядке, что и дубликатов, с использованием Spark Dataframe - PullRequest
1 голос
/ 04 июля 2019

Я могу успешно удалить дубликаты, используя Spark Dataframe метод dropDuplicates, который считает 100% совпадение в точном порядке как дубликат. Так, например, если у нас есть два "red toys", один из них считается дубликатом и отфильтровывается.

Теперь новое требование говорит о том, что мы должны рассматривать те же слова в обратном порядке также как дубликаты. Поэтому, ссылаясь на приведенный выше пример, если у нас есть "red toys" и "toys red", они будут считаться дублирующими и должны быть удалены. Это требование применимо только для 2 словосочетаний.

Может кто-нибудь, пожалуйста, предложить подход для этого в Spark. Кроме того, интересно, если это вариант использования Machine Learning или NLP.

1 Ответ

0 голосов
/ 04 июля 2019

Наиболее простым решением было бы разбить предложение на массив слов, отсортировать массив и затем отбросить дубликаты в зависимости от этого нового столбца.

В 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]) => {
  if (arr.size == 2) arr.sorted else arr
})

df.withColumn("arr", sort_udf(split($"words", " ")))
  .dropDuplicates("arr")
...