使用pyspark对推文进行标记化时,将元组括号'('转换为标记

时间:2019-02-22 15:39:30

标签: python apache-spark pyspark tokenize

我刚开始使用Spark。我正在尝试计算推文中每个令牌的提及次数。为此,我用user_id和tweets创建了rdd对,并按每个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投票者应该知道她对华尔街和Big Pharma的看法……”,     'RT @CamaraNjeri:伯尼❤️。))

标记化的推文:

  

('14241527',['(',“'”,'rt','@berniesanders',':',
  “”,“ i”,“将”,“一定”,“外观”,“进入”,“它”,   '。','“','-','@ hillaryclinton','\','n','\',
  'nvoters','deserve','to','know','what','she',
  “告诉”,“墙壁”,“街道”,“与”,“大”,“制药”,
  'beh','...',“'”,',',“','rt','@ camaranjeri',
  ':','bernie','❤','️','。',
  ')'])

我知道tok.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 :(得分:0)

pickle无法序列化lambda函数。那就是错误要告诉你的。

尝试明确定义函数:

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

然后将其传递到mapValues的{​​{1}}方法调用中。