Scala实现文本词频统计

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)

最后

  • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值