词频统计案例:两种方法实现词频统计

词频统计案例:两种方法实现词频统计

  1. 在scala REPL环境下利用针对容器的操作进行词频统计
scala> val list1 = List("Hello world","Hello china")
list1: List[String] = List(Hello world, Hello china)

创建一个list容器,存放需要统计频率的单词

scala> val list2 = list1 flatMap(s=>s.split(" "))
list2: List[String] = List(Hello, world, Hello, china)

split(" ")函数将容器中所有元素以空格分开,而flatMap函数将生成的多个容器“拍扁”成为一个新的容器。

scala> val list3 = list2 map(s=>(s,1))
list3: List[(String, Int)] = List((Hello,1), (world,1), (Hello,1), (china,1))

将List2中每个元素转化为键值对形式,且每个键的值都为1,即<k,1>

scala> val list4 = list3 groupBy(x=>x._1)
list4: scala.collection.immutable.Map[String,List[(String, Int)]] = Map(china -> List((china,1)), world -> List((world,1)), Hello -> List((Hello,1), (Hello,1)))

通过groupBy对List3进行遍历,传入匿名函数x=>x._1,可以看出该匿名函数把列表中每个元素的键名作为返回值返回,而groupBy函数将那个匿名函数返回值相同的元素合并起来成为一个子容器,该子容器作为“值”,而那个返回值作为“键”,构成一个键值对,所有这些键值对合起来构成List4返回。

scala> val list5 = list4 map(x=>(x._1,(x._2).size))
list5: scala.collection.immutable.Map[String,Int] = Map(china -> 1, world -> 1, Hello -> 2)

将List4中每个元素“键”不动,值替换为列表长度,且列表容器的类型,大小不变。因为map函数会返回一个与原容器类型大小都相同的新容器。

  1. 利用编译运行方式,统计某一目录下所有文件中单词出现频率
    (首先需要在代码存放的目录下创建一些txt文件,里面存放一些单词)
import java.io.File
import scala.io.Source
import collection.mutable.Map
object WordCount{
	def main(args:Array[String]){
		val dirfile = new File("testfiles")
		val files = dirfile.listFiles;
		var results = Map.empty[String,Int];
		for(file<-files){
			val data = Source.fromFile(file);
			val strs = data.getLines.flatMap{s => s.split(" ")}
			strs foreach{ word=>
				if(results.contains(word))
				results(word)+=1 else  results(word) = 1
			}
		}
		results foreach{case (k,v) => println(s"$k:$v")}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值