Использование Regex для количества упоминаний в Твиттере в Spark (Scala) - PullRequest
0 голосов
/ 26 апреля 2018

Я новичок в Spark. Я хочу вывести 2 верхних упоминания в твиттере, используя этот файл test.txt:

"Я люблю танцевать @ Келси, особенно с тобой @ Келси!"

"Не могу поверить, что ты пошел в @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 по-прежнему является строкой и в результате не будет соответствовать. Можно ли как-то проверить слово в строке вместо самой строки? Кроме того, как я могу проверить, является ли это упоминание избыточным в твите?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Это работает для меня, регулярные выражения более точны

val myReg = "(^|[^@\\w])@(\\w{1,15})\\b".r

val mentions = tweets.flatMap(x => myReg.findAllIn(x).matchData.map(_.group(0).trim -> 1)).reduceByKey(_ + _)
0 голосов
/ 26 апреля 2018

Я немного скорректировал ваше регулярное выражение, и вам, возможно, придется перевести его обратно в синтаксис 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...