Чтение строки и создание массива упомянутых подстрок - PullRequest
0 голосов
/ 01 марта 2019

В настоящее время я пытаюсь решить проблему, когда у меня есть большая строка текста (резюме), и я ищу определенные слова в этом резюме.Основываясь на одном из нескольких слов, которые существуют в определенной категории, я хочу иметь возможность создать массив соответствующих тегов, как указано ниже:

ground = ['car', 'motorbike']
air = ['plane']
colour = ['blue', 'red']

| Summary                | Tag_Array            |
|------------------------|----------------------|
| This is a blue car     | ['ground', 'colour'] |
| This is red motorbike  | ['ground', 'colour'] |
| This is a plane        | ['air']              |

Идея состоит в том, что он читает каждую сводку, а затем создает массив в столбце Tag_Array, который содержит соответствующие теги, связанные с текстом сводки.Метка для заземления может основываться на любом количестве возможных вариантов, в этом случае мотоцикл и автомобиль возвращают метку на землю.

Функционально у меня это работает с действительно ужасным подходом и очень многословно, и поэтому я собираюсь найти наиболее подходящий способ достичь этого в Pyspark.

    df = (df
        .withColumn("summary_as_array", f.split('summary', " "))
        .withColumn("tag_array", f.array(
            f.when(f.array_contains('summary_as_array', "car"), "ground").otherwise(""),
            f.when(f.array_contains('summary_as_array', "motorbike"), "ground").otherwise("")
            )
        )
    )

1 Ответ

0 голосов
/ 02 марта 2019

Если бы вы могли преобразовать теги в пары ключ-значение, как это,

tagDict = {'ground':['car', 'motorbike'],'air':['plane'],'colour':['blue','red']}

, тогда мы можем создать UDF для итерации по словам в summary & значениям, чтобы получить ключи, которые будуттеги.Простое решение,

l = [('This is a blue car',),('This is red motorbike',),('This is a plane',)]
df = spark.createDataFrame(l,['summary'])

tag_udf = F.udf(lambda x : [k for k,v in tagDict.items() if any(itm in x for itm in v)])
df = df.withColumn('tag_array',tag_udf(df['summary']))
df.show()
+---------------------+----------------+
|summary              |tag_array       |
+---------------------+----------------+
|This is a blue car   |[colour, ground]|
|This is red motorbike|[colour, ground]|
|This is a plane      |[air]           |
+---------------------+----------------+

Надеюсь, это поможет.

...