Я пытаюсь запустить задание mapreduce на hadoop, который читает пятую запись файла с разделителями табуляции (пятая запись - обзоры пользователей), а затем выполняет некоторый анализ настроений и подсчет слов на них.
Однако,как вы знаете из отзывов пользователей, они обычно включают разрывы строк и пустые строки.Мой код перебирает слова каждого отзыва, чтобы найти ключевые слова и проверить настроение, если ключевое слово найдено.
Проблема в том, что код повторяет обзор, он выдает мне ArrayIndexOutofBoundsException
Ошибка из-за этих разрывов строк и пустых строк в одном обзоре.
Я пытался использовать replaceAll("\r", " ")
иreplaceAll("\n", " ")
безрезультатно.
Я тоже пробовал if(tokenizer.countTokens() == 2){
word.set(tokenizer.nextToken());}
else {
}
тоже безрезультатно.Ниже приведен мой код:
public class KWSentiment_Mapper extends Mapper<LongWritable, Text, Text, IntWritable> {
ArrayList<String> keywordsList = new ArrayList<String>();
ArrayList<String> posWordsList = new ArrayList<String>();
ArrayList<String> tokensList = new ArrayList<String>();
int e;
@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] line = value.toString().split("\t");
String Review = line[4].replaceAll("[\\-\\+\\\\)\\.\\(\"\\{\\$\\^:,]", "").toLowerCase();
StringTokenizer tokenizer = new StringTokenizer(Review);
while (tokenizer.hasMoreTokens()) {
// 1- first read the review line and store the tokens in an arraylist, 2-
// iterate through review to check for KW if found
// 3-check if there's PosWord near (upto +3 and -2)
// 4- setWord & context.write 5- null the review line arraylist
String CompareString = tokenizer.nextToken();
tokensList.add(CompareString);
}
{
for (int i = 0; i < tokensList.size(); i++)
{
for (int j = 0; j < keywordsList.size(); j++) {
boolean flag = false;
if (tokensList.get(i).startsWith(keywordsList.get(j)) == true) {
for (int e = Math.max(0, i - 2); e < Math.min(tokensList.size(), i + 4); e++) {
if (posWordsList.contains(tokensList.get(e))) {
word.set(keywordsList.get(j));
context.write(word, one);
flag = true;
break; // breaks out of e loop }}
}
}
}
if (flag)
break;
}
}
tokensList.clear();
}
}
Ожидаемые результаты таковы: Возьмите эти два случая обзоров, где возникает ошибка:
Случай 1: «Красивый и просторный!
Я очень рекомендую это место и замечательного хозяина. "
Случай 2:" В целом место было действительно тихим, но мы не чувствовали себя оставленными.
Помимо этого,ванная комната большая, а душ действительно хороший, но есть проблема. "
Система должна прочитать весь обзор одной строкой и перебрать слова в нем.Однако, он просто останавливается, когда находит разрыв строки или пустую строку, как в случае 2.
Случай 1 следует читать так: «Красиво и просторно! Я очень рекомендую это место и замечательного хозяина».
Случай 2 должен звучать так: «В общем, место было действительно тихим, но мы не чувствовали себя оставленными. Кроме этого, ванная комната большая, а душ действительно хороший, но есть проблема».
У меня мало времени, и я очень признателен за помощь.
Спасибо!