到目前为止我有这个,但它只将.txt文件打印到屏幕上:
import java.io.*;
public class ReadFile {
public static void main(String[] args) throws IOException {
String Wordlist;
int Frequency;
File file = new File("file1.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String line = null;
while( (line = br.readLine()) != null) {
String [] tokens = line.split("\\s+");
System.out.println(line);
}
}
}
任何人都可以帮助我这样打印一个单词列表和单词频率吗?
答案 0 :(得分:2)
是否必须使用Java?这样做了:
sed 's/[^A-Za-z]/\n/g' filename.txt | sort | uniq -c
基本上,将任何非字母字符转换为换行符,对项目列表进行排序,然后让uniq计算出现次数。只需丢弃第一行输出,即空行数。这可以快速运行,甚至可以更快地进行编码。
您可以调整正则表达式,例如包括数字[A-Za-z0-9]或外语的重音字符[A-Za-zàèìòù]。
答案 1 :(得分:1)
做这样的事情。我假设文件中只能出现逗号或句号。否则,您还必须删除其他标点字符。我正在使用TreeMap,因此地图中的单词将以其自然字母顺序存储
public static TreeMap<String, Integer> generateFrequencyList()
throws IOException {
TreeMap<String, Integer> wordsFrequencyMap = new TreeMap<String, Integer>();
String file = "/tmp/lorem.txt";
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while( (line = br.readLine()) != null){
String [] tokens = line.split("\\s+");
for (String token : tokens) {
token = removePunctuation(token);
if (!wordsFrequencyMap.containsKey(token.toLowerCase())) {
wordsFrequencyMap.put(token.toLowerCase(), 1);
} else {
int count = wordsFrequencyMap.get(token.toLowerCase());
wordsFrequencyMap.put(token.toLowerCase(), count + 1);
}
}
}
return wordsFrequencyMap;
}
private static String removePunctuation(String token) {
token = token.replaceAll("[^a-zA-Z]", "");
return token;
}
测试的主要方法如下所示。为了获得百分比,您可以通过迭代地图并添加所有值来计算所有单词,然后再进行第二次获取百分比。顺便说一句,如果这是一个更大的工作的一部分,你还可以看看apache commons数学库来计算Frequency distributions。如果您使用他们的Frequency
课程,您可以继续添加所有单词,然后在最后获得描述性统计数据。
public static void main(String[] args) {
try {
int totalWords = 0;
TreeMap<String, Integer> freqMap = generateFrequencyList();
for (String key : freqMap.keySet()) {
totalWords += freqMap.get(key);
}
System.out.println("Word\tCount\tPercentage");
for (String key : freqMap.keySet()) {
System.out.println(key+"\t"+freqMap.get(key)+"\t"+((double)freqMap.get(key)*100.0/(double)totalWords));
}
} catch (Exception e) {
e.printStackTrace();
}
}
答案 2 :(得分:0)
创建HashMap
HashMap<String, Integer> occurrences = new HashMap<String, Integer>();
遍历每一行的数组
for(String word: tokens) {
// Do stuff
}
然后检查每个单词之前是否已经读过该单词
if(occurrences.containsKey(word))
occurrences.put(word, occurrences.get(word)+1);
else
occurrences.put(word, 1);
完整版:
String Wordlist;
int Frequency;
File file = new File("file1.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
HashMap<String, int> occurrences = new HashMap<String, int>();
String line = null;
while( (line = br.readLine()) != null){
String [] tokens = line.split("\\s+");
for(String word: tokens) {
if(occurences.contains(word))
occurences.put(word, occurences.get(word)+1);
else
occurences.put(word, 1);
}
}
可能是一个错字,没有经过测试,但这应该可以胜任。