我想计算文本中每行的单词的共现数,就像单词与其他单词出现在同一行中的次数一样。为此,我创建了一个特殊的单词对,所以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'是包含一对单词的新类。
这是映射器输出:
[cloudera@quickstart ~]$ 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 :(得分: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);
}