%scala
import org.apache.spark.sql.{DataFrame, SparkSession}
import scala.collection.mutable

class CategoriaKeyword(spark: SparkSession) {
  def buscar_palavras_chave(categories_df: DataFrame, text_df: DataFrame): Array[(String, String, Int)] = {
    // Processar categorias e criar um mapa para agilizar as buscas posteriores
    val categoriasProcessadas = mutable.Map.empty[String, String]
    categories_df.foreach(row => {
      val categoria = row.getAs[String](0)
      val palavrasChaveCsv = row.getAs[String](1)
      if (palavrasChaveCsv != null && !palavrasChaveCsv.isEmpty) {
        val palavrasChaveArray = palavrasChaveCsv.split(", ")
        palavrasChaveArray.foreach(palavraChave => {
          categoriasProcessadas.put(palavraChave.toLowerCase, categoria.toLowerCase)
        })
      }
    })
    println("Categorias processadas: " + categoriasProcessadas)

    // Procure por palavras-chave no DataFrame de texto e atribua a categoria mais provável do DataFrame de categorias.
    val resultado = text_df.map(row => {
      val texto = row.getAs[String](0).toLowerCase
      var maxPontuacao = 0
      var categoriaMaiorPontuacao = ""
      categoriasProcessadas.foreach { case (palavraChave, categoria) =>
        if (texto.contains(palavraChave)) {
          val pontuacao = texto.split("\\\\s+").count(_.equals(palavraChave))
          if (pontuacao > maxPontuacao) {
            maxPontuacao = pontuacao
            categoriaMaiorPontuacao = categoria
          }
        }
      }
      (row.getAs[String](0), categoriaMaiorPontuacao, maxPontuacao)
    })
    println("Resultado: " + resultado)

    resultado.collect()
  }
}

object Main {
  def main(args: Array[String]) {
    val spark = SparkSession.builder
      .appName("CategoriaKeyword")
      .master("local")
      .getOrCreate()
    // Definir dados da tabela
    val categoriesDf = spark.createDataFrame(Seq(
      ("Cartões - Anuidade - Negociação", "anuidade, negociação"),
      ("Cartões - Anuidade - Estorno", "anuidade, estorno"),
      ("Cartões - Bloqueio", "bloqueio"),
      ("Cartões - Contestação - Lançamento não reconhecido", "contestação, lançamento"),
      ("Cartões - Contestação - Desacordo comercial", "contestação, desacordo"),
      ("Cartões - Desbloqueio", "desbloqueio"),
      ("Cartões - Fatura - segunda via", "fatura, segunda via"),
      ("Cartões - Fatura - Detalhamento", "fatura, detalhamento"),
      ("Cartões - Fatura - Pagamento", "fatura, pagamento"),
      ("Cartões - Limite - Aumento", "limite, aumento"),
      ("Cartões - Limite - Redução", "limite, redução"),
      ("Cartões - Não Recebimento do cartão, Emissão segunda via", "não recebimento, emissão"),
      ("Cartões - Solicitação de segunda via do cartão", "solicitação, segunda via"),
      ("Cartões - Cancelamento", "cancelamento"),
      ("Cartões - Compra não autorizada", "compra, não autorizada"),
      ("Cartões - Fatura - Recalculo", "fatura, recalculo"),
      ("Cartões - Parcelamento - Contratação", "parcelamento, contratação"),
      ("Cartões - Fatura - Antecipação de Parcelas", "fatura, antecipação")
    )).toDF("categoria", "palavras_chave")

    val textoDf = spark.createDataFrame(Seq(
      ("Estou com problemas com a fatura e a segunda via do cartão.", None),
      ("Preciso de um bloqueio imediato no meu cartão.", None),
      ("Qual o procedimento para contestar uma cobrança?", None),
      ("Gostaria de solicitar a emissão de uma segunda via.", None),
      ("Minha fatura foi recalculada e não está correta.", None)
    )).toDF("texto", "categoria")

    // Criar instância do CategoriaKeyword
    val categorizador = new CategoriaKeyword(spark)

    // Executar a busca por palavras-chave
    val resultadoDf = categorizador.buscar_palavras_chave(categoriesDf, textoDf)

    // Mostrar o resultado
    println("Resultado:")
    resultadoDf.foreach(println)
  }
}cmd12.sc:45: value appName is not a member of org.apache.spark.sql.SparkSession.Builder
possible cause: maybe a semicolon is missing before `value appName'?
      .appName("CategoriaKeyword")
       ^Compilation Failed
Compilation Failed