gpt4 book ai didi

Scala匹配某些词并计算频率

转载 作者:行者123 更新时间:2023-12-04 23:49:37 27 4
gpt4 key购买 nike

我读了这篇文章:Scala beginners - simplest way to count words in file

代码只有一行,非常壮观。但是,我无法理解它是什么:

scala.io.Source.fromFile("file.txt")
.getLines
.flatMap(_.split("\\W+"))
.foldLeft(Map.empty[String, Int]){
(count, word) => count + (word -> (count.getOrElse(word, 0) + 1))
}

我无法理解 foldLeft 部分,这直接削弱了我修改此代码的能力。 foldLeft 定义为:def foldLeft[B](z: B)(f: (B, A) => B): B

这个 foldLeft 有什么作用?怎么能把countword抽出来放到第二个curry函数的部分函数里呢?

我要匹配的词在 Map 中表示:

  val dictionary = Map(
"""will""" -> 1,
"""going to""" -> 2,
"""future""" -> 3
)

如何将此 Map 与该代码合并?还是我应该尝试完全不同的东西?

我想到了这个坏主意:我可能会在外面放一个 for 循环……但它看起来会很丑。

最佳答案

假设您只想计算在 dictionary 中作为键出现的单词,您将添加一个过滤器:

scala.io.Source.fromFile("file.txt")
.getLines
.flatMap(_.split("\\W+"))
.filter(dictionary.contains(_))
.foldLeft(Map.empty[String, Int]){
(count, word) => count + (word -> (count.getOrElse(word, 0) + 1))
}

现在,关于这里如何使用 foldLeft 的一般解释...

将我们的类型插入到 foldLeft 定义中,我们有:foldLeft[Map[String, Int]](z: Map[String, Int])(f: (Map[String, Int], String) => Map[String, Int]): Map[String, Int ]

如此简化,foldLeft 有两个柯里化(Currying)参数,一个累加器的初始值(在我们的例子中是一个空的 Map),以及一个本身有两个参数的函数: 累加器,以及正在遍历的结构中的当前项(当前词)。

因此,对于函数的每次调用,count 将是计数的当前 Map,而 word 将是当前单词。

对于每个单词,我们将返回一个新的 Map,其中当前单词的计数(如果不存在则为 0)加 1。foldLeft 的最终结果> 是计数的完整 Map

关于Scala匹配某些词并计算频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22992847/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com