Skip to content

Commit f9cdf3d

Browse files
committed
feat: word frequency distribution
1 parent 70e643b commit f9cdf3d

5 files changed

Lines changed: 56 additions & 4 deletions

File tree

src/main/java/ai/elimu/util/WordFrequencyHelper.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package ai.elimu.util;
22

33
import ai.elimu.model.v2.enums.Language;
4-
import java.util.Collections;
5-
import java.util.Comparator;
64
import java.util.HashMap;
75
import java.util.LinkedHashMap;
86
import java.util.LinkedList;

src/main/java/ai/elimu/web/content/letter/LetterListController.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import ai.elimu.util.LetterFrequencyHelper;
1010

1111
import java.util.ArrayList;
12-
import java.util.HashMap;
1312
import java.util.List;
1413
import java.util.Map;
1514

src/main/java/ai/elimu/web/content/word/WordListController.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package ai.elimu.web.content.word;
22

33
import ai.elimu.dao.EmojiDao;
4+
import ai.elimu.dao.StoryBookParagraphDao;
45
import ai.elimu.dao.WordDao;
56
import ai.elimu.entity.content.Emoji;
7+
import ai.elimu.entity.content.StoryBookParagraph;
68
import ai.elimu.entity.content.Word;
9+
import ai.elimu.model.v2.enums.Language;
10+
import ai.elimu.util.ConfigHelper;
11+
import ai.elimu.util.WordFrequencyHelper;
712

13+
import java.util.ArrayList;
814
import java.util.HashMap;
915
import java.util.List;
1016
import java.util.Map;
@@ -26,6 +32,8 @@ public class WordListController {
2632

2733
private final EmojiDao emojiDao;
2834

35+
private final StoryBookParagraphDao storyBookParagraphDao;
36+
2937
@GetMapping
3038
public String handleRequest(Model model) {
3139
log.info("handleRequest");
@@ -42,6 +50,17 @@ public String handleRequest(Model model) {
4250
}
4351
model.addAttribute("maxUsageCount", maxUsageCount);
4452

53+
// Extract letter frequency distribution from storybook paragraphs
54+
List<String> wordsInParagraphs = new ArrayList<>();
55+
for (StoryBookParagraph storyBookParagraph : storyBookParagraphDao.readAll()) {
56+
for (String word : storyBookParagraph.getOriginalText().split(" ")) {
57+
wordsInParagraphs.add(word);
58+
}
59+
}
60+
Language language = Language.valueOf(ConfigHelper.getProperty("content.language"));
61+
Map<String, Integer> wordFrequencyMap = WordFrequencyHelper.getWordFrequency(wordsInParagraphs, language);
62+
model.addAttribute("wordFrequencyMap", wordFrequencyMap);
63+
4564
return "content/word/list";
4665
}
4766

src/main/webapp/WEB-INF/jsp/content/sound/list.jsp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
'${sound.usageCount}',
2323
</c:forEach>
2424
],
25-
label: 'Sound distribution',
25+
label: 'Sound frequency distribution',
2626
backgroundColor: 'rgba(149,117,205, 0.5)', // #9575cd deep-purple lighten-2
2727
}
2828
]

src/main/webapp/WEB-INF/jsp/content/word/list.jsp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,42 @@
44

55
<content:section cssId="wordListPage">
66
<div class="section row">
7+
<div class="card-panel">
8+
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.4/dist/chart.umd.min.js"></script>
9+
<canvas id="chart"></canvas>
10+
<script>
11+
var ctx = document.getElementById('chart');
12+
var data = {
13+
labels: [
14+
<c:forEach var="key" items="${wordFrequencyMap.keySet()}" varStatus="status">
15+
<c:if test="${status.index < 100}">
16+
"${key}",
17+
</c:if>
18+
</c:forEach>
19+
],
20+
datasets: [
21+
{
22+
data: [
23+
<c:forEach var="key" items="${wordFrequencyMap}">
24+
<c:if test="${status.index < 100}">
25+
${key.value},
26+
</c:if>
27+
</c:forEach>
28+
],
29+
label: 'Word frequency distribution (top 100)',
30+
backgroundColor: 'rgba(149,117,205, 0.5)', // #9575cd deep-purple lighten-2
31+
}
32+
]
33+
};
34+
var options = {};
35+
new Chart(ctx, {
36+
type: 'bar',
37+
data: data,
38+
options: options
39+
});
40+
</script>
41+
</div>
42+
743
<a id="exportToCsvButton" class="right btn waves-effect waves-light grey-text white"
844
href="<spring:url value='/content/word/list/words.csv' />">
945
Export to CSV<i class="material-icons right">vertical_align_bottom</i>

0 commit comments

Comments
 (0)