2016-04-04 3 views
1

Я хочу посчитать совпадение слов в строке в тексте, как и сколько раз слово появляется в одной строке с другими словами. Для этого я создал специальный класс пар слов, поэтому MapReduce даст мне пару слов, а затем счет. Дело в том, что я хочу показать только совпадение разных слов.Устранение пар одних и тех же слов в MapReduce

Это код:

public class Co_OcurrenciaMapper extends Mapper<LongWritable, Text, Par, IntWritable> { 
    @Override 
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
     IntWritable one = new IntWritable(1); 
     String[] palabras = value.toString().split("\\W+"); 
     String palabra = new String(); 
     String vecino = new String(); 
     if (palabras.length > 1) { 
      for (int i = 0; i < palabras.length - 1; i++) { 
       for (int j = i + 1; j < palabras.length; j++) { 
        palabra = palabras[i]; 
        vecino = palabras[j]; 
        if (palabra.length() == 0 || vecino.length() == 0 || Character.isDigit(palabra.charAt(0)) || Character.isDigit(vecino.charAt(0))) { 
         continue; 
        } 
         if (palabra.compareTo(vecino) != 0) { 
          context.write(new Par(palabras[i], palabras[j]), one); /* here I am trying to go to the next pair if the words in the current pair are the same */ 
         }      
        } 

       } 
      } 
     } 
    } 
} 

«Par» является новый класс, который содержит пару слов.

И это выход картографа:

[[email protected] ~]$ hadoop fs -cat salidaO34/part-r-00000 |tail -15 
Par [young , youthful] 1 
Par [younger , your] 5 
Par [your , your] 88 
Par [your , yours] 23 
Par [your , yourself] 36 
Par [your , yourselves] 8 
Par [your , youth] 18 
Par [your , youthful] 3 
Par [your , zeal] 3 
Par [your , zir] 1 
Par [your , zounds] 1 
Par [yours , yours] 2 
Par [yours , yourself] 3 
Par [yours , zeal] 1 
Par [yourself , yourself] 1 

И вы можете видеть, что у меня есть пары слов, которые являются одинаковыми.

+0

Можете ли вы не просто сравнить «palabras [i] .equals (palabras [j])'? –

ответ

0

Попробуйте сначала обрезать струны.

palabra = palabras[i].trim(); 
vecino = palabras[j].trim(); 

boolean emptyStrings = palabra.isEmpty() || vecino.isEmpty(); 
boolean haveDigit = Character.isDigit(palabra.charAt(0)) || Character.isDigit(vecino.charAt(0)); 
boolean sameWords = palabra.equals(vecino); 

if (!(emptyStrings || haveDigit || sameWords)) { 
    context.write(new Par(palabra, vecino), one); 
} 
Смежные вопросы