Scala实现文本词频统计
环境
CentOS Linux release 8.1.1911 (Core)
Scala 2.13.3 (Java HotSpot(TM) 64-Bit Server VM, Java 14.0.2)
实现代码
import scala.io._
object WordFrequenciesCounter {
/*
Description:
词频统计主函数
@param:args: main函数参数
@Returns: Unit
*/
def main(args: Array[String]) : Unit = {
// 若未指定待读取文本文档的路径,默认路径为当前目录下的word.txt
var path : String = if (args.size == 1) args(0) else "word.txt"
// 调用count函数
count(path)
}
/*
Description:
统计给定文本文件的词频并输出结果的函数
@param: path : 待读取文本文件的路径
@return:Unit
*/
def count(path : String) : Unit = {
// 从指定路径的文本文档中获取内容
var content = Source.fromFile(path).getLines().toBuffer
// flatMap方法将获得的文本内容以" "一个空格相隔
// 映射并扁平化为单个单词
// map方法,在建立单词-单词出现次数的键-值Map
// map(_, 1),_代表flatMap得到的集合中的每一个元素,1代表每个单词的频次为1,初始化每个单词词频为1
var flatMap = content.flatMap(_.split(" ")).map((_, 1))
// groupBy方法将得到的flatMap映射依据但单词进行分组
// _._1中的第一个"_"代表映射中的每个元素
// _._1中的"_.1"代表映射中元素的键
// groupBy(_._1)代表依据映射中元素的键值进行分组,即依据单词进行分组
var wordGroup = flatMap.groupBy(_._1)
// 文本中单词总数即为flatMap映射中元素数量
var total : Double = flatMap.size.asInstanceOf[Double]
println("Total number of words is " + total)
// map方法,建立单词-词频键-值Map
// x._1代表wordGroup元素的第一个元素,即单词
// x._2.size代表wordGroup元素第二个元素(数组)包含的元素数量,即单词出现次数
// 单词出现次数除以总数即为词频
var frequencies = wordGroup.map((x => (x._1, x._2.size / total)))
// 迭代遍历,逐行输出结果
frequencies.foreach(println)
}
}
测试样例
- bash命令
源文件名为WordFrequenciesCounter.scala
scala WordFrequenciesCounter.scala
或者在后面指定待读取的文本文件路径,如textFile.txt
scala WordFrequenciesCounter.scala textFile.txt
- word.txt
Hello Scala
Word Count
Hello World
Word Count
This is a Scala program
测试结果
Total number of words is 13.0
(program,0.07692307692307693)
(is,0.07692307692307693)
(This,0.07692307692307693)
(Scala,0.15384615384615385)
(a,0.07692307692307693)
(Count,0.15384615384615385)
(Hello,0.15384615384615385)
(World,0.07692307692307693)
(Word,0.15384615384615385)
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!