【问题标题】:Using Regex to the number of twitter mentions in Spark (Scala)使用正则表达式计算 Spark (Scala) 中的 twitter 提及次数
【发布时间】:2018-04-26 22:20:13
【问题描述】:

我是 Spark 的新手。我想使用这个 test.txt 文件输出前 2 个 twitter 提及:

“我喜欢跳舞@Kelsey,尤其是和你一起@Kelsey!”

“不敢相信你去了@harvard。加油@harvard”

“我爱@harvard”

基本上,一条推文中的多次提及仅计为一次。所以输出会是这样的:

(2, @harvard)

(1, @Kelsey)

到目前为止,我的代码如下所示:

val tweets = sc.textFile("testFile")

val myReg = """(?<=@)([\\w]+)""".r

val mentions = tweets.filter(x => (myReg.pattern.matcher(x).matches))

但是,它不起作用,因为 x 仍然是一条线,因此它不会匹配。无论如何我可以测试行中的单词而不是行本身吗?另外,如何检查推文中的提及是否多余?

【问题讨论】:

    标签: regex scala apache-spark


    【解决方案1】:

    我稍微调整了您的正则表达式,您可能需要将其翻译回 spark 语法,但这样您可以找到所有提及并将它们分组。 .toSet 对删除重复项很重要,.toLowercase 在那里也有意义

      val tweets = List("I love to dance @Kelsey, especially with you @Kelsey!",
                    "Can't believe you went to @harvard. Come on man @harvard",
                    "I love @harvard")
    
    
      val myReg = """(@\w+)""".r
    
      val mentions = tweets.flatMap(x => myReg.findAllIn(x).toSet).groupBy(identity).mapValues(_.length)
    
      println(mentions)
    

    【讨论】:

    • groupBy 在 spark 中是一项昂贵的操作。更好地使用 reduceByKey 看我的答案
    【解决方案2】:

    这对我有用,正则表达式更精确

    val myReg = "(^|[^@\\w])@(\\w{1,15})\\b".r
    
    val mentions = tweets.flatMap(x => myReg.findAllIn(x).matchData.map(_.group(0).trim -> 1)).reduceByKey(_ + _)
    

    【讨论】:

    • 非常感谢!我赞成您的回答,但由于某种原因,stackoverflow 没有显示我的赞成票
    • @Ragnall_Mac_Somairle 如果你认为它是正确的答案,你应该接受它
    • 嘿@Noam Shaish。如果我想在提及前后去除标点符号,我应该如何更改正则表达式?例如,我想要“!@Kelsey”=“@Kelsey!” =“@Kelsey”
    猜你喜欢
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多