版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzx_2011/article/details/80557649
统计单词出现的次数,不同的单词数,单词的重复率
目的
之前在一本学习英文的书中看到成人中文常用词汇5000字,英文大概2-3万字,感到很诧异,所以就有了这两篇文章。之前的中文名著统计 统计名著中汉字出现频率,纸上得来终觉浅,绝知此事要躬行。
思路
这次统计的英文名著是以《简爱》为例,处理的方法和之前一样,就是处理单词时变了:先把一行单词大写转小写,然后根据空格分割出单词,并检查每个单词的最后一个字符是不是标点符号,是的话就去掉。
实现
代码基本和之前的一篇文章一样,只是处理文字的方法变了
public class StatisticCharacter {
public static double totalCount = 0;
public static double diffWord = 0;
public static Map<String, Integer> characterMap = new HashMap<String, Integer>();
public static ArrayList<Map.Entry<String, Integer>> sortWordList;
public static void main(String[] args) throws IOException {
String fileName = "/Users/gary/Documents/JaneEyre.txt";
StringBuilder words = new StringBuilder();
File file = new File(fileName);
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
String str;
while ((str = bufferedReader.readLine()) != null) {
//sumChineseWordNum(str);
sumEnglishWordNum(str);
}
bufferedReader.close();
System.out.println("总字数------" + totalCount);
System.out.println("不同的字数------" + diffWord);
sort(characterMap);
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter("/Users/gary/Documents/Study/output.txt");
for (Map.Entry<String, Integer> entry : sortWordList) {
// System.out.println(entry.getKey() + "------" + entry.getValue());
words.append(entry.getKey()).append("------").append(entry.getValue()).append("\r\n");
}
fileWriter.write(words.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileWriter != null) {
fileWriter.close();
}
}
System.out.println("重复率-----" + ((totalCount-diffWord)/totalCount));
}
/**
* 统计英文总字数和每个字出现的次数
*
* 大写转小写,过滤非英文字符
*
* @param str
*/
public static void sumEnglishWordNum(String str) {
if(StringUtils.isBlank(str)){
return;
}
int num;
String[] strArr = str.toLowerCase().split(" ", -1);
if(strArr.length < 1){
return;
}
for (int i = 0; i < strArr.length; i++) {
if (StringUtils.isBlank(strArr[i])) {
continue;
}
char lastCharacter = strArr[i].charAt(strArr[i].length() - 1);
if(!(lastCharacter >='a' && lastCharacter <= 'z')){
strArr[i] = strArr[i].substring(0, strArr[i].length() - 1);
}
if (StringUtils.isBlank(strArr[i])) {
continue;
}
totalCount++;
if (!characterMap.containsKey(strArr[i])) {
num = 1;
diffWord++;
characterMap.put(strArr[i], num);
} else {
num = characterMap.get(strArr[i]) + 1;
characterMap.put(strArr[i], num);
}
}
}
/**
* 按value排序hashmap,统计单词的频率从高到低
* @param map
*/
public static void sort(Map<String, Integer> map){
sortWordList = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
Collections.sort(sortWordList,new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> map1 , Map.Entry<String, Integer> map2){
return (map2.getValue() - map1.getValue());
}
});
}
}
结果
总字数------185684.0
不同的字数------17575.0
重复率-----0.9053499493763598