首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用正则表达式计算Spark中的twitter提及次数(Scala)

使用正则表达式计算Spark中的twitter提及次数(Scala)
EN

Stack Overflow用户
提问于 2018-04-26 21:11:52
回答 2查看 142关注 0票数 0

我是Spark的新手。我想用这个test.txt文件输出推特上提到的前两个:

“我喜欢跳舞@凯尔西,尤其是和你跳舞@凯尔西!”

“真不敢相信你去了@哈佛。来吧,伙计@哈佛”

“我爱@哈佛”

从本质上讲,在一条推文中多次被提及只算一次。因此输出将如下所示:

代码语言:javascript
复制
(2, @harvard)

(1, @Kelsey)

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

代码语言:javascript
复制
val tweets = sc.textFile("testFile")

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

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

但是,它不会工作,因为x仍然是一条线,因此它不会匹配。有没有什么办法,我可以测试行中的单词,而不是行本身?另外,我如何检查推文中提到的内容是否多余?

EN

回答 2

Stack Overflow用户

发布于 2018-04-26 22:18:45

我稍微调整了您的正则表达式,您可能需要将其转换回spark语法,但通过这种方式,您可以找到所有提及的内容并对它们进行分组。.toSet对于删除重复项很重要,.toLowercase在这方面也很有意义

代码语言:javascript
复制
  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)
票数 0
EN

Stack Overflow用户

发布于 2018-04-26 22:20:13

这对我来说很有效,正则表达式更精确。

代码语言:javascript
复制
val myReg = "(^|[^@\\w])@(\\w{1,15})\\b".r

val mentions = tweets.flatMap(x => myReg.findAllIn(x).matchData.map(_.group(0).trim -> 1)).reduceByKey(_ + _)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50043890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档