Напишите программу, которая будет вычислять словарный запас текста в файле и частоту наиболее распространенного слова.Словарный запас - это количество слов в тексте, разделенное на количество отдельных слов.Частота слова - это количество раз, когда слово упоминается в тексте, деленное на общее количество слов в тексте.
Определите и внедрите класс WordCounter
с двумя частными полями: String word и int count, конструктор WordCounter(String word)
и открытые методы String getName()
, int getCount()
и void addToCounter()
.
Определить и реализовать класс Corpus
(как в текстовом корпусе) с одним закрытым полем ArrayList<WordCounter>
слова,конструктор Corpus(BufferedReader infile)
и открытые методы double getVocabularyRichness()
и String getMostFrequentWord()
.
Реализация тестовой программы (как общедоступного метода static void main в Corpus
), которая считывает все файлы в определенной папке, создает объект Corpus
из каждого (ранее открытого) файла и сохраняет запрошенныйстатистика в другой файл stats.csv.Вы можете создать новый объект Корпус для каждого файла или определить ArrayList<Corpus>
корпуса.
Каждая строка файла CSV должна состоять из трех полей, разделенных запятыми (но без пробелов!): Имя файла, богатство словарного запаса и наиболее часто используемое слово.Запустите вашу программу на все пьесы Шекспира.Отправьте CSV-файл вместе с Java-файлом.
Я написал, как мне кажется, правильную реализацию проблемы HW, поскольку она корректно работает для некоторых текстовых файлов, но только для words.get(i).getName()
(я тестировал сwords.get(i).getCount()
) метод выведет пробел для некоторых файлов.Я перепробовал все, и не могу понять это.Можете ли вы дать мне подсказку или несколько советов, как решить эту проблему?
public class Corpus {
private ArrayList<WordCounter> words = new ArrayList <WordCounter>() ;
Corpus(BufferedReader infile){
String ln;
try {
while((ln = infile.readLine()) != null) {
for (String word : ln.toLowerCase().split("([,.\\s]+)")) {
int reference = 0;
for(int i = 0; i < words.size(); i++) {
if (word.equals(words.get(i).getName())) {
reference++;
words.get(i).addToCounter();
} }
if (reference==0) { words.add(new WordCounter(word)); }
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public double getVocabularyRichness() {
int word_count=0;
for(int i = 0; i < words.size(); i++) {
word_count=word_count+words.get(i).getCount();
}
return (double)word_count/(double)words.size();
}
public String getMostFrequentWord() {
String winner = "*AN ERROR OCCURRED*";
int max_count = 0;
for(int i = 0; i < words.size(); i++) {
if(words.get(i).getCount() > max_count){
max_count = words.get(i).getCount();
}
}
for(int i = 0; i < words.size(); i++) {
if(words.get(i).getCount() == max_count){
winner = words.get(i).getName();
}
}
//winner="Test " + String.valueOf(words.get(i).getName());;
//return String.valueOf(max_count);
return winner;
}
public static void main(String [] args) throws Exception{
BufferedWriter writer = null;
File folder_location = new File("/Users/joaquindelaguardia/Desktop/Shakespeare");
File[] file_array = folder_location.listFiles();
for(File iteration_file: file_array) {
FileReader current_file = new FileReader(iteration_file);
BufferedReader infile = new BufferedReader(current_file);
Corpus obj1 = new Corpus(infile);
String file_name = iteration_file.getName();
String frequent_word = obj1.getMostFrequentWord();
String vocabulary_richness = String.valueOf(obj1.getVocabularyRichness());
System.out.println(file_name);
System.out.println(frequent_word);
System.out.println(vocabulary_richness);
System.out.println("-----------------------------");
//FileWriter file_writer = new FileWriter("/Users/joaquindelaguardia/Desktop/stats.csv");
//writer = new BufferedWriter(file_writer);
//String output = file_name+", "+frequent_word+", "+vocabulary_richness + "\n";
//writer.append(output);
}
//writer.close();
}
}
public class WordCounter {
private String word;
private int count=1;
WordCounter(String word){
this.word=word;
}
public String getName() {
return word;
}
public int getCount() {
return count;
}
public void addToCounter() {
count++;
}
}
Я проверяю информацию, печатая перед добавлением в файл, и, как вы можете видеть на небольшом фрагменте выводавключенный ниже, в некоторых случаях он печатает наиболее распространенное слово (и), а во втором случае ничего не печатает.
shakespeare-lovers-62.txt
и
2.2409948542024014
Шекспир-Джулиус-26.txt
6.413205537806177