计算地图减少中所有字母的出现概率

Posted

技术标签:

【中文标题】计算地图减少中所有字母的出现概率【英文标题】:Computing probability of occurrence for all alphabets in map reduce 【发布时间】:2021-05-30 04:39:59 【问题描述】:

我正在尝试使用 Map-reduce 程序计算文件中每个字母出现的概率。

我正在使用以下框架进行 map-reduce。 1 个映射器来映射所有字符,例如 ('a',1)。 1个组合器来计算每个字符的出现总数。 1 个减速器来计算平均值。

但是,我无法计算减速器中的平均值。所以,我添加了一个虚拟字符,每当映射器映射一个新字符时,它就会写入一次。

这个虚拟字符代表字符的总数,我不知道如何在reducer中访问它并将所有其他值除以总数。

例如,以下是组合器的输出。

# 10
a 2
b 2
c 2
d 4

我尝试了 1 个减速器,但没有输出。

我特别需要知道必须写在reducer中的逻辑。

public void reduce(Text key, Iterable<DoubleWritable> values, Context context)
        throws IOException, InterruptedException 

    int wordCount = 0;
    double total = 1;
    System.out.println("In Reducer now!");
    double avg = 0;
    total = values.iterator().next().get();

    avg = values.get() / total;
    context.write(key, new DoubleWritable(avg));

上面的代码没有在输出上写任何东西。

映射器

public void map(LongWritable key, Text value, Context context)
        throws IOException, InterruptedException 

    String s = value.toString();

    char[] arrayofChar = s.toCharArray();
    for (char ch : arrayofChar) 
        System.out.print(ch);
        if (Character.isLetter(ch)) 
            context.write(new Text(String.valueOf(ch)), new DoubleWritable(1));
            context.write(new Text("#"), new DoubleWritable(1));

        
    

组合器

public void reduce(Text key, Iterable<DoubleWritable> values, Context context)
        throws IOException, InterruptedException 

    double total = 0;
    System.out.println("In Combiner now!");
    for (DoubleWritable value : values) 
        total += value.get();
    
    context.write(key, new DoubleWritable(total));

【问题讨论】:

您是否尝试运行您的代码?您必须提供有关使用 id 的对象的更多信息:“values”变量、DoubleWritable 类... 我已经为 Reducer、Combiner 和 Mapper 添加了代码。 【参考方案1】:

为了整理这个我写了单独的消费者:

public class Test 
    public static void main(String[] arg) throws Exception
        String s= "aabccdaaab"; 
        Averager av = s.chars().collect(Averager::new,Averager::accept, Averager::combine);
        System.out.println(av.averages());
    


class Averager implements IntConsumer  
    private int count = 0;
    private Map<Character,Integer> data = new HashMap<>();
        
    public  Map<Character, Double>averages() 
        Map<Character, Double> result = new HashMap<>();
        for(Character c : data.keySet()) 
            double d = (double)data.get(c)/count;
            result.put(c,d);
        
        return result;
    
        
    public void accept(int c)  
        Character cc = new Character((char)c);
        count++;
        if(data.containsKey(cc)) 
            int i = data.get(cc);
            i++;
            data.put(cc, i);
         else 
            data.put(cc, 1);
        
    

    public void combine(Averager other) 
        for(Character c : data.keySet()) 
            if(other.data.containsKey(c)) 
                int sum = data.get(c) + other.data.get(c);
                other.data.put(c, sum);
             else 
                other.data.put(c, data.get(c));
            
        
        data = other.data;
    

输出:

a=0.5, b=0.2, c=0.2, d=0.1

【讨论】:

是的,这是一个使用 Java Streams 的解决方案,但是 OP 显然使用的是Hadoop MapReduce(类型名称与他的代码匹配)。 谢谢。但是,给定输入所需的输出是 a=.2,b=.2,c=.2d=.4。另外,我正在尝试使用 MapReduce 解决问题。 如果您在 OP 中给出公式/示例,那就太好了 :) 在我的代码中,我使用了输入“aabccdaaab”。 我现在已经编辑了我的原始帖子。我通过驱动程序类从文件中读取的实际输入。

以上是关于计算地图减少中所有字母的出现概率的主要内容,如果未能解决你的问题,请参考以下文章

计算最终地图中的总行数减少hadoop中的输出

[人工智能-数学基础-1]:深度学习中的数学地图:计算机数学数值计算数值分析数值计算微分积分概率统计.....

Oracle:一个查询,它计算字符串中所有非字母数字字符的出现次数

智邮普创c语言面试题 ---- 字母概率

中文分词

减少谷歌地图成本计算,只能调用谷歌地图javascript api