PySpark: подсчет пар слов и отдельных слов - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь выполнить базовый c анализ текста с помощью PySpark.

Чтобы начать эту проблему, я загружаю текстовый файл, содержащий сонеты Шекспира, в RDD. Выводом должен быть RDD, содержащий кортежи, как показано ниже:

(word_pair, count_of_word_pair, word_1_count, word_2_count)

, где word_1 и word_2 - отдельные слова, составляющие пару слов.

Пока я могу правильно сгенерировать один СДР, который содержит отдельные уникальные слова и счетчик количества строк, на которых они встречаются, и другой СДР, содержащий word_pairs (порядок имеет значение) и подсчитывает:

distFile = sc.textFile("Shakespeare.txt")

    tokens = (
        distFile.map(simple_tokenize)
        .flatMap(set)
        .map(lambda x: (x, 1))
        .reduceByKey(lambda x, y: x + y)
    )

    token_pairs = (
        distFile.map(simple_tokenize)
        .flatMap(lambda x: itertools.permutations(x, 2))
        .filter(lambda x: x[0] != x[1])
        .map(lambda x: (x, 1))
        .reduceByKey(lambda x, y: x + y)

Примечание: simple_tokenize - это функция, которая устанавливает все символы в нижний регистр и разбивает предложение в каждой строке на список слов.

Пример выходных данных ниже: Первые 10 элементов токенов:

('shakespeare', 38),
  ('we', 3125),
  ('fairest', 42),
  ('increase', 28),
  ('creatures', 38),
  ('die', 461),
  ('rose', 68),
  ("beauty's", 30),
  ('thereby', 26),
  ('never', 996)]

Первые 10 элементов token_pairs:


[('the', 'sonnets', 2),
  ('sonnets', 'the', 2),
  ('by', 'william', 39),
  ('william', 'by', 39),
  ('from', 'desire', 4),
  ('fairest', 'creatures', 1),
  ('fairest', 'we', 1),
  ('fairest', 'increase', 1),
  ('creatures', 'fairest', 1),
  ('creatures', 'we', 4)],

Я застрял в том, что не понимаю как объединить эти разные значения в одном и том же СДР (согласно требуемому результату). Насколько я понимаю, я не могу выполнить какой-либо тип ключа l oop между СДР внутри функции карты (или что я вообще не могу этого сделать, пока не соберу один из них). Это правильно?

Как получить желаемый результат без необходимости сохранять что-либо как локальную переменную в Python?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...