Как использовать файл обзора фильма, чтобы распечатать средние значения тональности для слов в другом файле?

#java

#java

Вопрос:

Я работаю над проектом, в котором много разных частей и методов. Для этой конкретной части мне нужно запросить у пользователя имя файла, который содержит набор слов, по одному в строке. (см. прикрепленный) Затем мне нужно вычислить среднюю оценку / настроение слова, сравнив его с файлом movieReview, который оценивает настроение слов. (см. прикрепленный)

[Редактировать] : я не получил свой код, чтобы взять первую строку файла списка слов, выполнить поиск по слову в файле movieReview и найти среднюю оценку слова. И после завершения поиска перейдите к следующему слову. Однако для остальных слов после первого, «механического», печатается NaN

Пример: Первое слово в файле списка слов — «механический». Mechanical встречается в файле movieReview 6 раз, и общая оценка равна 4. Среднее значение тональности для слова «механический» равно .666666666.

Как я могу сделать свой код таким, чтобы цикл продолжался, находил среднее значение для каждого отдельного слова и распечатывал его? Извините, если это звучит непонятно, дайте мне знать, если мне нужно уточнить. Кроме того, я очень начинающий программист, поэтому, пожалуйста, постарайтесь не использовать сложные концепции. (Также было сказано, что использование массива или буфера не требуется)

Файл рецензии на фильм: http://nifty.stanford.edu/2016/manley-urness-movie-review-sentiment/movieReviews.txt

Содержимое файла списка слов (txt): механический автомобиль, бездушный стиль, семья, замечательная история, ни сильный фарс, сложный, вызывающий интерес актерский состав, остроумный, с приглушенным чувством, повествование, освежающее, нравоучительное, ужасный, решительно ужасный диалог, бессвязный расход слов, движущийся, лишенный снисходительной скучной ценности, рассказ о собаке, почти всегда расфокусированный, шаблонный, эксцентричный, изворотливый, непредсказуемый, написание со слезами

 import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class methodThree {
public static void main (String [] args) throws FileNotFoundException {

Scanner in = new Scanner(System.in);
System.out.println("Enter the name of the file with words you want to score: ");
String inputFileName = in.next();
File inputFile = new File(inputFileName);

while(!inputFile.exists())
{
  System.out.println("Please enter a valid file name:");
  inputFile = new File(in.next());
}

Scanner wordFile = new Scanner (inputFile);

File inputMovie = new File("movieReviews.txt");
Scanner movieReview = new Scanner (inputMovie);


String reviewText;
int reviewScore;

while (wordFile.hasNextLine())
{
int count = 0;
double total = 0;
String word = wordFile.nextLine();

while (movieReview.hasNext()) {
  reviewScore = movieReview.nextInt();
  reviewText = movieReview.nextLine();

  if (reviewText.contains(word)) {
    count  ;
    total = total   reviewScore;
  }
}

double average = (total / count);
System.out.println (word   " "   average);
}
}
}
  

Ответ №1:

Итак, что вы в основном хотите сделать, это повторить этот код для каждой строки в wordfile?

 int count = 0;
double total = 0;
String word = wordFile.nextLine();

while(movieReview.hasNext()){
    reviewScore = movieReview.nextInt();
    reviewText = movieReview.nextLine();

    if (reviewText.contains(word)) {
        count  ;
        total = total   reviewScore;
    }
}
double average = (total / count);
System.out.println(average);
  

в этом случае вы могли бы окружить его другим циклом while. Цикл должен выполняться для каждой строки в WordFile, так что это более или менее тот же цикл, что и ваш цикл movieReview.hasNext().

 while(wordFile.hasNext()){
    int count = 0;
    ...
}
  

Цикл выполняется до тех пор, пока в WordFile есть другое слово для оценки.

Комментарии:

1. Да, это концепция, которой я пытаюсь достичь! Однако этот код сработал для первого слова, mechanical, но затем вернул NaN для остальных слов.

2. @A.Hodges затем вы должны опубликовать (отредактировать свой вопрос) свой код, который зацикливается на файле WORD, и мы можем попытаться найти ошибку.

3. @A.Hodges ах, поскольку он возвращает NaN, вы, скорее всего, делите на 0 или что-то в этом роде. Вы должны спросить, является ли (count> 0) перед выполнением двойного среднего значения = (total / count);

4. Понял, спасибо! Я обновил свой код в сообщении. Я также пытался использовать оператор if, чтобы избежать NaN, но это вернуло к исходной проблеме отсутствия публикации средних значений для остальных слов.

5. Ах да, ваш сканер movieReview выполняется один раз над файлом (для первого слова), и после этого сканер не сбрасывается (ваша программа считывает файл рецензии только один раз, но он должен считывать файл рецензии для каждого слова). Самый простой способ решить эту проблему — добавить Scanner movieReview в цикл while (если это не сработает, попробуйте также поместить файл inputMovie внутрь цикла). (Информация: Чтение файла снова и снова — плохое решение. Но поскольку вы новичок в Java, это совершенно нормально, и более простые решения важнее хороших)