java统计单词频率
继上一讲Java用PDFTextStripper来剖析pdf文件提取文字 - ivanlee717 - 博客园讲了如何吸收息争析pdf之后,我们把pdf文件全部转为了String范例的字符串,那么这一讲聊聊怎么去统计每个词出现的频率。
正则过滤
首先我们需要把单词弄出来,把其他的文字过滤掉。- Pattern pattern = Pattern.compile("\\b[a-z]+\\b");
- Matcher matcher = pattern.matcher(s.toLowerCase());
复制代码 \\b 是一个元字符(metacharacter),表示单词边界。它匹配的是位置,而不是具体的字符。它确保匹配的单词前后是单词边界,即单词的开头或结尾,大概与非单词字符相邻。比方,在字符串 "hello regina" 中,\b 会匹配 h 之前、o 之后、r 之前和 a 之后的位置。
具体来说,\\b 匹配以下几种情况:
- 字符串的开头或结尾。
- 一个单词字符(字母、数字、下划线)紧接在非单词字符(如空格、标点符号等)之后,或反之亦然。
[a-z] 是一个字符类,表示匹配任意一个小写字母(从 a 到 z)。
- [A-Za-z]:匹配任意巨细写字母。
- [0-9]:匹配任意数字。
- [a-zA-Z0-9_]:匹配任意字母、数字或下划线(相当于 \w)。
- [aeiou]:匹配任意元音字母。
+是一个量词,表示前面的元素必须出现一次或多次。
量词可以应用于单个字符、字符类或更复杂的表达式。常见的量词包括:
- *:匹配零次或多次。
- +:匹配一次或多次。
- ?:匹配零次或一次。
- {n}:精确匹配 n 次。
- {n,}:匹配至少 n 次。
- {n,m}:匹配至少 n 次,最多 m 次。
第二个\\b仍然表示单词边界,但它出现在模式的末尾,确保匹配的单词以单词边界竣事。
在设置好匹配规则以后,就要去进行匹配了。matcher(CharSequence input):这是 Pattern 类的一个实例方法,用于创建一个 Matcher 对象。Matcher 对象可以在给定的输入字符串(input)中查找与正则表达式模式匹配的子串。
find():实验找到下一个与模式匹配的子串。如果找到匹配项,则返回 true,并将匹配位置更新到下一个匹配项的起始位置
group():返回当前匹配的子串。只有在调用 find() 或 matches() 成功后,才能调用 group()。
start() 和 end():分别返回当前匹配项的起始和竣事索引。
replaceAll(String replacement) 和 replaceFirst(String replacement):用于替换全部或第一个匹配项。
reset():重置 Matcher,使其重新开始匹配新的输入字符串。
然后我们用一个哈希表来存储每个单词的出现频率。- HashMap<String, Integer> wordCount = new HashMap<>();
复制代码- while (matcher.find()) {
- String word = matcher.group();
- if (word.length() > 5) {
- wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
- }
- }
复制代码 我们一次来剖析查到的每一个步调。首先如果不绝有单词出现,那么match.find()就会不绝为true,然后始终在遍历循环。
每一次遍历成功之后都会把单词组在一起返回一个String,循环往复我们就可以把全部单词都遍历一次。
HashMap
getOrDefault(K key, V defaultValue):这是 Map 接口的一个方法,用于获取指定键(key)对应的值。如果该键不存在,则返回提供的默认值(defaultValue)。代码里面我们先查找这个ielts的单词,发现并没有存储,于是设置成0 。
put(K key, V value):这是 Map 接口的一个方法,用于将指定的键值对插入到 Map 中。如果该键已经存在,则更新其对应的值。
运行put方法之后,
while循环竣事之后,就形成了一个统计表,然后我们对统计表按照次数排个序。
wordCount.entrySet().stream(): entrySet()是 Map 接口的一个方法,返回一个包含全部键值对的 Set。每个 Map.Entry 对象代表一个键值对。stream()是 Collection 接口的一个方法,用于将聚集转换为一个流(Stream)。流是数据的序列化容器,支持各种中间操作和终端操作,可以进行链式调用,从而实现高效的批量数据处理。
filter(Predicate |