Кортежи кортежей '(' были преобразованы в токены при токенизации твитов с использованием pyspark - PullRequest
0 голосов
/ 22 февраля 2019

Я только начинаю со Spark.Пытаюсь подсчитать количество упоминаний для каждого токена в твитах.Для этого я создал пару rdd с user_id и твитами, сгруппированными по каждому user_id (поэтому у меня есть user в качестве ключа и tweets в качестве каждого пользователя в качестве кортежа для значений).Применили функцию токенизации к твитам и удалили дубликаты токенов для каждого пользователя.Затем я сопоставил каждый токен с 1 и уменьшил его по ключу.Ниже приведен код:

    user_tweets.mapValues(lambda x: list(tok.tokenize(x))).mapValues(set).flatMap(lambda x: ((i, 1) for i in x[1])).reduceByKey(lambda a,b: a+b)

Я замечаю, что когда я токенизирую твиты, '(' и ')' для кортежей создаются как отдельные токены.

Оригинальный твит:

('14241527', ('RT @BernieSanders: «Я непременно посмотрю на это». - @HillaryClinton> \ n \ nГолосовать заслуживают того, чтобы узнать, что она рассказала Уолл-стрит и Большой фарма, вот… », 'RT @CamaraNjeri: Берни ❤️.))

Токенизированный твит:

(' 14241527 ', [' (', "'", 'rt','@berniesanders', ':',
'' ',' i ',' will ',' безусловно ',' look ',' into ',' it ','. ',' "',' -',' @hillaryclinton ',' \ ',' n ',' \ ',
' nvoters ',' заслуживают ',' to ',' знать ',' что ',' она ',
'said ',' wall ',' street ',' and ',' big ',' pharma ',
' beh ','… ',' '', ',', '' ',' rt ','@camaranjeri',
':', 'bernie', '❤', '️', '.',
')'])

Я понимаю, что ток.tokenize (x) получает кортеж как и анализирует все выражение, включая скобки и запятую, которые я пытаюсь избежать.Я пытался

user_tweets.mapValues(lambda x: list(tok.tokenize(i) for i in x)))

, но получаю следующую ошибку:

Can't pickle local object 'Tokenizer.tokenize.<locals>.<lambda>'

Как это исправить, пожалуйста?

1 Ответ

0 голосов
/ 22 февраля 2019

pickle не может сериализовать lambda функции.Вот что пытается сообщить вам ошибка.

Попробуйте явно определить функцию:

def row_tokenizer(row):
    return [tok.tokenize(x) for x in row]

Затем передайте это в ваш mapValues вызов метода вместо lambda.

...