使用 AlgorithmStar and Spark 实现 词频统计 并进行对比和解读
(AS 算法之星 机器学习库)(Spark 分布式计算 框架)实现 词频 统计 数据分析 的 案例
# 使用 AlgorithmStar and Spark 实现 词频统计 并进行对比和解读
*数据分析案例*
(AS 算法之星 机器学习库)(Spark 分布式计算 框架)实现 词频 统计 数据分析 的 案例
## 目录
[TOC]

## AlgorithmStar 实现词频统计
[AlgorithmStar](https://github.com/BeardedManZhao/algorithmStar.git) 是相较于Spark来说,使用起来比较简单的框架,API非常简洁,推荐使用Java语言调用,下面开始进行一个实现。
> 优点:非庞大数据量都可以支持,API简单,有预制词频函数,自动识别符号,内存占用非常小
> 缺点:分布式性能与支持略低于spark
### 代码
在下面的代码中,每个步骤都进行了注释,同时在结尾处演示了两种打印方法。
```
package org.example;
import io.github.beardedManZhao.algorithmStar.algorithm.featureExtraction.WordFrequency;
import io.github.beardedManZhao.algorithmStar.core.AlgorithmStar;
import io.github.beardedManZhao.algorithmStar.operands.matrix.ColumnIntegerMatrix;
public class Main {
public static void main(String[] args) {
// 准备一个句子
final String data = "The next step is to demonstrate some operations related to word frequency statistics. You will learn about the relevant operations of word frequency statistics in different frameworks";
// 获取到算法之星门户类 这里的泛型中 第二个参数代表的就是计算组件的计算结果类型
// 词频向量计算之后返回的是个 ColumnIntegerMatrix 矩阵
// 所以 第二个 泛型就要设置为 ColumnIntegerMatrix
final AlgorithmStar<Object, ColumnIntegerMatrix> instance = AlgorithmStar.getInstance();
// 开始转换成为词频向量
final ColumnIntegerMatrix wordCount = instance.extract(WordFrequency.getInstance("wordCount"), data);
// 查看词频向量 这个操作会使用默认的方式打印出矩阵格式
System.out.println(wordCount);
// 获取到其中的值 词频向量在这里计算完毕之后是个带列与行名的 ColumnIntegerMatrix,不过其中只有一行数值
// 列名代表的就是被统计单词
// 行名代表的就是被统计的句子
// 在这里我们需要先获取到列名
final String[] rowFieldNames = wordCount.getRowFieldNames();
for (int i = 0; i < wordCount.getRowCount(); i++) {
// 然后才可以在循环中 使用索引 定位到当前这列的第一个元素(这个就是被统计好的数值)与列名(当前统计的数量对应的单词)关联起来
System.out.println("出现次数:" + wordCount.get(i, 0) + "\t被统计单词:" + rowFieldNames[i]);
}
}
}
```
### 代码计算结果
在计算结果中 我们使用两种方式打印出了词频结果,可以看到这里的结果还是蛮清晰的。
```
------------IntegerMatrixStart-----------
The next step is to demonstrate some operations related to word frequency statistics. You will learn about the relevant operations of word frequency statistics in different frameworks rowColName
[1] next
[1] some
[1] will
[1] learn
[1] in
[1] frameworks
[1] about
[1] is
[2] frequency
[1] The
[1] the
[1] relevant
[2] operations
[1] related
[1] of
[1] step
[2] to
[1] demonstrate
[1] different
[2] word
[1] You
[2] statistics
------------IntegerMatrixEnd------------
出现次数:1 被统计单词:next
出现次数:1 被统计单词:some
出现次数:1 被统计单词:will
出现次数:1 被统计单词:learn
出现次数:1 被统计单词:in
出现次数:1 被统计单词:frameworks
出现次数:1 被统计单词:about
出现次数:1 被统计单词:is
出现次数:2 被统计单词:frequency
出现次数:1 被统计单词:The
出现次数:1 被统计单词:the
出现次数:1 被统计单词:relevant
出现次数:2 被统计单词:operations
出现次数:1 被统计单词:related
出现次数:1 被统计单词:of
出现次数:1 被统计单词:step
出现次数:2 被统计单词:to
出现次数:1 被统计单词:demonstrate
出现次数:1 被统计单词:different
出现次数:2 被统计单词:word
出现次数:1 被统计单词:You
出现次数:2 被统计单词:statistics
进程已结束,退出代码0
```
## Spark 实现词频统计
> 优点:spark适合做大数据量的分布式的计算
> 缺点:代码繁琐,不适合做小量计算,没有阈值的词频统计,因此对于标点符号的处理需要自己来实现,实现的如何取决于开发者!
### 代码
```
package run
import org.apache.spark.{SparkConf, SparkContext}
object MAIN3 {
def main(args: Array[String]): Unit = {
// 准备一个句子
val data = "The next step is to demonstrate some operations related to word frequency statistics. You will learn about the relevant operations of word frequency statistics in different frameworks"
// 构造 Spark 门户类
val sparkContext = new SparkContext(
new SparkConf()
// 在这里我们指定 Spark 计算使用的是本地计算
.setMaster("local[*]")
// 在这里我们指定 Spark 计算任务的名字
.setAppName("wordCount")
)
// 将 句子 加载为 RDD
val value = sparkContext.makeRDD(
// 在这里我们指定按照 逗号拆分
data.split(" ")
)
// 将拆分之后的单词开始进行计算
val tempRes = value.mapPartitions(iter => {
// iter 是当前分区中的单词集合
for (word <- iter) yield {
// 在这里我们将 iter 中的每个单词 word 依次迭代
// 并在这里打标签 为每个单词出现的次数标记为 1
(word, 1)
}
}
).groupByKey()
// 到这里,我们已经实现了最基本的单词分组,每个单词都是 key 每个 key 中都对应了一个 与 key 单词数量相同的容器 容器中的元素都是1
// 例如句子中有两个 operations 则 key 为 operations 对应的 容器中有两个元素为 1
// 例如句子中有一个 is 则 key 为 is 对应的 容器中有一个元素为 1
// 所以我们在这里直接将每个容器的尺寸做为 每个 key 出现的次数
tempRes.map(wc => wc._1 -> wc._2.size).foreach(
// 然后在这里进行打印
wc => println("出现次数:" + wc._2 + "\t被统计单词:" + wc._1)
)
}
}
```
### 代码计算结果
```
出现次数:1 被统计单词:related
出现次数:1 被统计单词:statistics.
出现次数:2 被统计单词:operations
出现次数:1 被统计单词:relevant
出现次数:1 被统计单词:demonstrate
出现次数:1 被统计单词:next
出现次数:1 被统计单词:The
出现次数:1 被统计单词:learn
出现次数:1 被统计单词:in
出现次数:2 被统计单词:word
出现次数:1 被统计单词:the
出现次数:1 被统计单词:is
出现次数:1 被统计单词:different
出现次数:1 被统计单词:You
出现次数:1 被统计单词:some
出现次数:1 被统计单词:step
出现次数:1 被统计单词:of
出现次数:2 被统计单词:frequency
出现次数:2 被统计单词:to
出现次数:1 被统计单词:about
出现次数:1 被统计单词:frameworks
出现次数:1 被统计单词:will
出现次数:1 被统计单词:statistics
```
------
***操作记录***
作者:[root](https://www.lingyuzhao.top//index.html?search=1 "root")
操作时间:2025-02-07 20:35:24 星期五 【时区:UTC 8】
事件描述备注:保存/发布
中国 天津
[](如果不需要此记录可以手动删除,每次保存都会自动的追加记录)