Map Reduce 删除重复项

Map Reduce Removing Duplicates

我得到了一个很大的文本文件,我想找出以每个字母开头的不同单词的数量。我正在尝试了解 map 和 reduce 函数的输入和输出值。

我理解了一个更简单的不需要处理重复单词的问题:使用 map reduce 确定字母表中每个字母开始单词的频率。

Map input: <0, “everyday i am city in tomorrow easy over school i iterate tomorrow city community”>

Map output: [<e,1>,<i,1>,<a,1>,<c,1>,<i,1>,<t,1>,<e,1>,<o,1>,<s,1>,<i,1>,<i,1>,<t,1>,<c,1>,<c,1>]

Reduce input: <a,[1]>,<c,[1,1,1]>,<e,[1,1]>,<i,[1,1,1,1]>,<o,[1]>,<s,[1]>,<t,[1,1]>

Reduce output: [<a,1>,<c,3>,<e,2>,<i,4>,<o,1>,<s,1>,<t,2>]

对于上面的问题,单词 'i' 'city' 和 'tomorrow' 出现了不止一次,所以我的最终输出应该是:

Reduce output: [<a,1>,<c,2>,<e,2>,<i,3>,<o,1>,<s,1>,<t,1>]

我不确定如何确保在上述问题中删除重复的单词(是在预处理阶段完成还是可以在 map 或 reduce 函数上实现)。如果我能在理解地图和减少新问题的输出方面得到帮助,我将不胜感激。

也许这样的事情会有所帮助,

let str = "everyday i am city in tomorrow easy over school i iterate tomorrow city community"

let duplicatesRemoved = Set(str.split(separator: " "))

输出:

["city", "community", "tomorrow", "easy", "everyday", "over", "in", "iterate", "i", "am", "school"]

也许您不需要那些 map 语句并且可以实现类似的东西,

代码

var varCount = [Character: Int]()
for subStr in duplicatesRemoved {
    if let firstChar = subStr.first {
        varCount[firstChar] = (varCount[firstChar] ?? 0) + 1
    }
}

输出

["i": 3, "t": 1, "e": 2, "c": 2, "s": 1, "a": 1, "o": 1]

您可以在两个 map-reduce 过程中完成:

  1. 通过使用单词作为映射输出并减少每个单词一次输出来找到所有不同的单词
  2. 您已经解决了 - 找到每个唯一单词上每个首字母的频率。

或者,由于没有太多独特的单词,您可以将它们缓存在映射器中,并只输出每个单词(或其第一个字母)一次,并且 reduce 将与您的更简单的问题相同。实际上,不,那是行不通的,因为相同的词可以出现在不同的映射器中。但是你仍然可以在第一个解决方案中缓存映射器中的单词,并且每个映射器只输出一次每个单词 - 映射和减少之间的流量稍微少一点。