编写一个程序,该程序将计算文件中文本的词汇丰富度以及最常见单词的频率。词汇丰富度是文本中的单词数量除以不同单词的数量。单词的出现频率是该单词在文本中被提及的次数除以文本中单词的总数。
使用两个私有字段定义和实现类WordCounter
,包括字符串和整数,构造函数WordCounter(String word)
和公共方法String getName()
,int getCount()
和void addToCounter()
使用一个私有字段Corpus
词,构造函数ArrayList<WordCounter>
以及公共方法Corpus(BufferedReader infile)
和double getVocabularyRichness()
定义和实现类String getMostFrequentWord()
(如在文本语料库中一样) 。
实施一个测试程序(作为Corpus
中的public static void main方法),该程序读取特定文件夹中的所有文件,从每个(先前打开的)文件中创建一个Corpus
对象,并保存将请求的统计信息放入另一个文件stats.csv。您可以为每个文件创建一个新的语料库对象,也可以定义一个语料库的ArrayList<Corpus>
。
CSV文件的每一行必须包含三个用逗号分隔的字段(但不能有空格!):文件名,词汇量丰富和最常用的单词。在莎士比亚的所有戏剧中运行您的程序。提交CSV文件和Java文件。
我写了我认为是硬件问题的正确实现的方法,因为它对某些文本文件正常工作,但是只有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
和
shakespeare-julius-26.txt