Scala 语言 实战 Spark ML Pipeline 构建分类模型 垃圾邮件识别

Scala阿木 发布于 2025-06-10 10 次阅读


Scala语言实战Spark ML Pipeline构建垃圾邮件识别模型

随着互联网的快速发展,电子邮件已经成为人们日常工作和生活中不可或缺的沟通工具。垃圾邮件的泛滥也成为了困扰用户的一大问题。为了提高用户体验,减少垃圾邮件的干扰,本文将使用Scala语言结合Apache Spark ML库,构建一个垃圾邮件识别模型。

环境准备

在开始之前,请确保您的环境中已经安装了以下软件:

- Scala:版本2.11或更高
- Apache Spark:版本2.4.0或更高
- IntelliJ IDEA:用于编写和运行Scala代码

数据集介绍

本文使用的数据集为著名的垃圾邮件数据集——SMSSpamCollection,该数据集包含5574条短信,其中4461条为垃圾邮件,1113条为正常短信。数据集的每条短信都包含一个标签(1表示垃圾邮件,0表示正常短信)和短信内容。

数据预处理

在构建模型之前,需要对数据进行预处理,包括以下步骤:

1. 读取数据集
2. 清洗数据:去除无用字符、数字等
3. 分词:将短信内容分割成单词
4. 停用词过滤:去除常见的无意义词汇
5. 词干提取:将单词转换为词干形式
6. 向量化:将文本数据转换为数值向量

以下是Scala代码实现:

scala
import org.apache.spark.ml.feature.{RegexTokenizer, StopWordsRemover, Word2Vec}
import org.apache.spark.sql.SparkSession

// 创建SparkSession
val spark = SparkSession.builder()
.appName("Scala Spark ML Pipeline")
.master("local[]")
.getOrCreate()

// 读取数据集
val smsData = spark.read.textFile("SMSSpamCollection.txt")

// 清洗数据
val cleanedData = smsData.map(line => line.toLowerCase().replaceAll("[^a-zA-Zs]", ""))

// 分词
val tokenizer = new RegexTokenizer()
.setInputCol("text")
.setOutputCol("words")
.setPattern("W")

val tokenizedData = tokenizer.transform(cleanedData)

// 停用词过滤
val remover = new StopWordsRemover()
.setInputCol("words")
.setOutputCol("filtered")

val filteredData = remover.transform(tokenizedData)

// 词干提取
val word2Vec = new Word2Vec()
.setInputCol("filtered")
.setOutputCol("features")

val model = word2Vec.fit(filteredData)

// 向量化
val vectorizedData = model.transform(filteredData)

// 显示前10条数据
vectorizedData.show(10)

模型训练

在完成数据预处理后,我们可以使用向量化的数据构建分类模型。本文采用逻辑回归模型进行垃圾邮件识别。

scala
import org.apache.spark.ml.classification.LogisticRegression
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator

// 创建逻辑回归模型
val lr = new LogisticRegression()
.setLabelCol("label")
.setFeaturesCol("features")

// 训练模型
val lrModel = lr.fit(vectorizedData)

// 显示模型参数
println("Logistic Regression coefficients: " + lrModel.coefficients)
println("Logistic Regression intercept: " + lrModel.intercept)

模型评估

为了评估模型的性能,我们可以使用混淆矩阵、准确率、召回率等指标。

scala
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator

// 评估模型
val predictions = lrModel.transform(vectorizedData)
val evaluator = new MulticlassClassificationEvaluator()
.setLabelCol("label")
.setPredictionCol("prediction")
.setMetricName("accuracy")

val accuracy = evaluator.evaluate(predictions)
println("Accuracy: " + accuracy)

结论

本文使用Scala语言和Apache Spark ML库,成功构建了一个垃圾邮件识别模型。通过数据预处理、模型训练和评估,我们得到了一个准确率较高的模型。在实际应用中,可以根据具体需求调整模型参数,提高模型的性能。

总结

本文介绍了使用Scala语言结合Apache Spark ML库构建垃圾邮件识别模型的过程。通过数据预处理、模型训练和评估,我们得到了一个准确率较高的模型。在实际应用中,可以根据具体需求调整模型参数,提高模型的性能。希望本文对您有所帮助。