P4-2 案例:对英语真题进行词频分析

案例:对英语真题进行词频分析


需求说明

  • 有一堆英语考试真题(PDF格式),要求读取它们,然后分析出来每个单词出现的词频,然后输出到一个文本文件中,每行是一个“单词 词频”。暂不实现按照词频排序,因为涉及到stream或者SQL
  • 先分析思路,写出伪代码,然后实现。不能没有准备的写代码
    • 怎么分析思路呢?1.
      • 先站在人的角度去看这个需求,正常人的方式怎么进行?
      • 然后切换到计算机的视角去,看看怎么利用计算机去达到这个目的

思路分析

声明一个LinkedHashMap,Key是单词(忽略大小写),Value是词频
遍历每一个pdf文件
{
读取这个pdf的所有文本
对于文件按照 空格,口号,句号等来分割为单词。然后全部转为小写
然后在遍历每一个单词,看在map中是否存在,不存在则新增,存在则词频+1
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public static void main(String[] args) {
LinkedHashMap<String,Integer> map =new LinkedHashMap<>();
String[] PDFFiles= IOHelpers.getFilesRecursively("D:/JavaTest1/PDFTest2","pdf");//获取文件夹下所有的pdf文件
for (String Files :PDFFiles)
{
PDDocument doc = PDFHelpers.openFile(Files); //读取对应路径的pdf文件
String text = PDFHelpers.parseText(doc);//pdf的txt文本提取成字符串
String[] texts = text.toLowerCase().split("\\s|\\.|\\,|\\:|\\!|\\?|;|\\(|\\)");//符号转成小写并分割
for (String word:texts)
{
if (!isEnglishWord(word))//如果这个word不是英语单词,则跳过
{
continue;//处理下一个单词
}

if (word.equals(""))
{
continue;
}
Integer frqe =map.get(word);//获得当前的词频
if (frqe==null)//如果为null就证明不存在
{
map.put(word,1);
}
else
{
map.put(word,frqe+1);//存在就词频+1

}

}

PDFHelpers.close(doc);//关闭pdf*/
}
String outputString ="";
for (String word:map.keySet())//keyset()是map中所有key的集合
{
int freq =map.get(word);
outputString =outputString+word+"="+freq+"\r\n";

}
//System.out.println(outputString);
IOHelpers.writeAllText("D:/JavaTest1/PDFTest2/1.txt",outputString);


}
//判断字符串中是否是一个英文单词(全部由英文字母组成)
public static boolean isEnglishWord(String s)
{
int numbers=s.length();
for (int i =0;i<numbers;i++)
{
char ch =s.charAt(i);
if (Character.isLowerCase(ch)==false)//只要碰到一个非字母,函数就返回false
{
return false;
}
}
return true;//如果运行到这里,就说明每个都是字母
}

P4-2 案例:对英语真题进行词频分析
http://example.com/2024/08/14/SE101-零基础玩Java/Part4-笔记/P4-2 案例:对英语真题进行词频分析/
Author
John Doe
Posted on
August 14, 2024
Licensed under