cmpstr 2.0.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +75 -499
- package/dist/CmpStr.esm.js +4863 -0
- package/dist/CmpStr.esm.js.map +1 -0
- package/dist/CmpStr.esm.min.js +8 -0
- package/dist/CmpStr.esm.min.js.map +1 -0
- package/dist/CmpStr.umd.js +4875 -0
- package/dist/CmpStr.umd.js.map +1 -0
- package/dist/CmpStr.umd.min.js +8 -0
- package/dist/CmpStr.umd.min.js.map +1 -0
- package/dist/cjs/CmpStr.js +663 -0
- package/dist/cjs/CmpStr.js.map +1 -0
- package/dist/cjs/CmpStrAsync.js +336 -0
- package/dist/cjs/CmpStrAsync.js.map +1 -0
- package/dist/cjs/index.js +15 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/metric/Cosine.js +101 -0
- package/dist/cjs/metric/Cosine.js.map +1 -0
- package/dist/cjs/metric/DamerauLevenshtein.js +110 -0
- package/dist/cjs/metric/DamerauLevenshtein.js.map +1 -0
- package/dist/cjs/metric/DiceSorensen.js +91 -0
- package/dist/cjs/metric/DiceSorensen.js.map +1 -0
- package/dist/cjs/metric/Hamming.js +82 -0
- package/dist/cjs/metric/Hamming.js.map +1 -0
- package/dist/cjs/metric/Jaccard.js +76 -0
- package/dist/cjs/metric/Jaccard.js.map +1 -0
- package/dist/cjs/metric/JaroWinkler.js +114 -0
- package/dist/cjs/metric/JaroWinkler.js.map +1 -0
- package/dist/cjs/metric/LCS.js +89 -0
- package/dist/cjs/metric/LCS.js.map +1 -0
- package/dist/cjs/metric/Levenshtein.js +94 -0
- package/dist/cjs/metric/Levenshtein.js.map +1 -0
- package/dist/cjs/metric/Metric.js +445 -0
- package/dist/cjs/metric/Metric.js.map +1 -0
- package/dist/cjs/metric/NeedlemanWunsch.js +95 -0
- package/dist/cjs/metric/NeedlemanWunsch.js.map +1 -0
- package/dist/cjs/metric/SmithWaterman.js +98 -0
- package/dist/cjs/metric/SmithWaterman.js.map +1 -0
- package/dist/cjs/metric/qGram.js +91 -0
- package/dist/cjs/metric/qGram.js.map +1 -0
- package/dist/cjs/phonetic/Cologne.js +112 -0
- package/dist/cjs/phonetic/Cologne.js.map +1 -0
- package/dist/cjs/phonetic/Metaphone.js +172 -0
- package/dist/cjs/phonetic/Metaphone.js.map +1 -0
- package/dist/cjs/phonetic/Phonetic.js +413 -0
- package/dist/cjs/phonetic/Phonetic.js.map +1 -0
- package/dist/cjs/phonetic/Soundex.js +135 -0
- package/dist/cjs/phonetic/Soundex.js.map +1 -0
- package/dist/cjs/utils/DeepMerge.js +144 -0
- package/dist/cjs/utils/DeepMerge.js.map +1 -0
- package/dist/cjs/utils/DiffChecker.js +500 -0
- package/dist/cjs/utils/DiffChecker.js.map +1 -0
- package/dist/cjs/utils/Filter.js +189 -0
- package/dist/cjs/utils/Filter.js.map +1 -0
- package/dist/cjs/utils/HashTable.js +175 -0
- package/dist/cjs/utils/HashTable.js.map +1 -0
- package/dist/cjs/utils/Normalizer.js +144 -0
- package/dist/cjs/utils/Normalizer.js.map +1 -0
- package/dist/cjs/utils/Pool.js +196 -0
- package/dist/cjs/utils/Pool.js.map +1 -0
- package/dist/cjs/utils/Profiler.js +229 -0
- package/dist/cjs/utils/Profiler.js.map +1 -0
- package/dist/cjs/utils/Registry.js +148 -0
- package/dist/cjs/utils/Registry.js.map +1 -0
- package/dist/cjs/utils/TextAnalyzer.js +358 -0
- package/dist/cjs/utils/TextAnalyzer.js.map +1 -0
- package/dist/esm/CmpStr.js +662 -0
- package/dist/esm/CmpStr.js.map +1 -0
- package/dist/esm/CmpStrAsync.js +331 -0
- package/dist/esm/CmpStrAsync.js.map +1 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/metric/Cosine.js +99 -0
- package/dist/esm/metric/Cosine.js.map +1 -0
- package/dist/esm/metric/DamerauLevenshtein.js +108 -0
- package/dist/esm/metric/DamerauLevenshtein.js.map +1 -0
- package/dist/esm/metric/DiceSorensen.js +89 -0
- package/dist/esm/metric/DiceSorensen.js.map +1 -0
- package/dist/esm/metric/Hamming.js +77 -0
- package/dist/esm/metric/Hamming.js.map +1 -0
- package/dist/esm/metric/Jaccard.js +74 -0
- package/dist/esm/metric/Jaccard.js.map +1 -0
- package/dist/esm/metric/JaroWinkler.js +112 -0
- package/dist/esm/metric/JaroWinkler.js.map +1 -0
- package/dist/esm/metric/LCS.js +87 -0
- package/dist/esm/metric/LCS.js.map +1 -0
- package/dist/esm/metric/Levenshtein.js +92 -0
- package/dist/esm/metric/Levenshtein.js.map +1 -0
- package/dist/esm/metric/Metric.js +442 -0
- package/dist/esm/metric/Metric.js.map +1 -0
- package/dist/esm/metric/NeedlemanWunsch.js +93 -0
- package/dist/esm/metric/NeedlemanWunsch.js.map +1 -0
- package/dist/esm/metric/SmithWaterman.js +96 -0
- package/dist/esm/metric/SmithWaterman.js.map +1 -0
- package/dist/esm/metric/qGram.js +89 -0
- package/dist/esm/metric/qGram.js.map +1 -0
- package/dist/esm/phonetic/Cologne.js +114 -0
- package/dist/esm/phonetic/Cologne.js.map +1 -0
- package/dist/esm/phonetic/Metaphone.js +174 -0
- package/dist/esm/phonetic/Metaphone.js.map +1 -0
- package/dist/esm/phonetic/Phonetic.js +409 -0
- package/dist/esm/phonetic/Phonetic.js.map +1 -0
- package/dist/esm/phonetic/Soundex.js +137 -0
- package/dist/esm/phonetic/Soundex.js.map +1 -0
- package/dist/esm/utils/DeepMerge.js +139 -0
- package/dist/esm/utils/DeepMerge.js.map +1 -0
- package/dist/esm/utils/DiffChecker.js +498 -0
- package/dist/esm/utils/DiffChecker.js.map +1 -0
- package/dist/esm/utils/Filter.js +187 -0
- package/dist/esm/utils/Filter.js.map +1 -0
- package/dist/esm/utils/HashTable.js +173 -0
- package/dist/esm/utils/HashTable.js.map +1 -0
- package/dist/esm/utils/Normalizer.js +142 -0
- package/dist/esm/utils/Normalizer.js.map +1 -0
- package/dist/esm/utils/Pool.js +194 -0
- package/dist/esm/utils/Pool.js.map +1 -0
- package/dist/esm/utils/Profiler.js +227 -0
- package/dist/esm/utils/Profiler.js.map +1 -0
- package/dist/esm/utils/Registry.js +142 -0
- package/dist/esm/utils/Registry.js.map +1 -0
- package/dist/esm/utils/TextAnalyzer.js +356 -0
- package/dist/esm/utils/TextAnalyzer.js.map +1 -0
- package/dist/types/CmpStr.d.ts +472 -0
- package/dist/types/CmpStrAsync.d.ts +233 -0
- package/dist/types/index.d.ts +51 -0
- package/dist/types/metric/Cosine.d.ts +57 -0
- package/dist/types/metric/DamerauLevenshtein.d.ts +50 -0
- package/dist/types/metric/DiceSorensen.d.ts +57 -0
- package/dist/types/metric/Hamming.d.ts +49 -0
- package/dist/types/metric/Jaccard.d.ts +48 -0
- package/dist/types/metric/JaroWinkler.d.ts +50 -0
- package/dist/types/metric/LCS.d.ts +50 -0
- package/dist/types/metric/Levenshtein.d.ts +50 -0
- package/dist/types/metric/Metric.d.ts +261 -0
- package/dist/types/metric/NeedlemanWunsch.d.ts +47 -0
- package/dist/types/metric/SmithWaterman.d.ts +48 -0
- package/dist/types/metric/index.d.ts +41 -0
- package/dist/types/metric/qGram.d.ts +56 -0
- package/dist/types/phonetic/Cologne.d.ts +46 -0
- package/dist/types/phonetic/Metaphone.d.ts +50 -0
- package/dist/types/phonetic/Phonetic.d.ts +189 -0
- package/dist/types/phonetic/Soundex.d.ts +49 -0
- package/dist/types/phonetic/index.d.ts +30 -0
- package/dist/types/utils/DeepMerge.d.ts +70 -0
- package/dist/types/utils/DiffChecker.d.ts +137 -0
- package/dist/types/utils/Filter.d.ts +97 -0
- package/dist/types/utils/HashTable.d.ts +86 -0
- package/dist/types/utils/Normalizer.d.ts +76 -0
- package/dist/types/utils/Pool.d.ts +63 -0
- package/dist/types/utils/Profiler.d.ts +129 -0
- package/dist/types/utils/Registry.d.ts +57 -0
- package/dist/types/utils/TextAnalyzer.d.ts +199 -0
- package/dist/types/utils/Types.d.ts +313 -0
- package/package.json +62 -49
- package/src/CmpStr.d.ts +0 -70
- package/src/CmpStr.js +0 -912
- package/src/CmpStrAsync.d.ts +0 -19
- package/src/CmpStrAsync.js +0 -204
- package/src/algorithms/cosine.js +0 -86
- package/src/algorithms/damerau.js +0 -78
- package/src/algorithms/dice.js +0 -65
- package/src/algorithms/hamming.js +0 -44
- package/src/algorithms/jaccard.js +0 -34
- package/src/algorithms/jaroWinkler.js +0 -106
- package/src/algorithms/lcs.js +0 -58
- package/src/algorithms/levenshtein.js +0 -70
- package/src/algorithms/needlemanWunsch.js +0 -72
- package/src/algorithms/qGram.js +0 -63
- package/src/algorithms/smithWaterman.js +0 -78
- package/src/algorithms/soundex.js +0 -152
- package/src/index.d.ts +0 -3
- package/src/index.js +0 -47
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
// CmpStr v3.0.0 dev-1a82e20-250612 by Paul Köhler @komed3 / MIT License
|
|
2
|
+
/**
|
|
3
|
+
* TextAnalyzer Utility
|
|
4
|
+
* src/utils/TextAnalyzer.ts
|
|
5
|
+
*
|
|
6
|
+
* The TextAnalyzer class provides a comprehensive set of methods for analyzing and
|
|
7
|
+
* extracting statistics from a given text. It supports word and sentence tokenization,
|
|
8
|
+
* character and word frequency analysis, syllable estimation, readability metrics
|
|
9
|
+
* (Flesch, Kincaid, LIX, WSTF), and various ratios and histograms. Designed for
|
|
10
|
+
* efficiency and flexibility, it is suitable for linguistic research, readability
|
|
11
|
+
* scoring, and text preprocessing tasks.
|
|
12
|
+
*
|
|
13
|
+
* @module Utils/TextAnalyzer
|
|
14
|
+
* @author Paul Köhler (komed3)
|
|
15
|
+
* @license MIT
|
|
16
|
+
*/
|
|
17
|
+
class TextAnalyzer {
|
|
18
|
+
// The original text to analyze
|
|
19
|
+
text;
|
|
20
|
+
// Tokenized words and sentences
|
|
21
|
+
words = [];
|
|
22
|
+
sentences = [];
|
|
23
|
+
// Frequency maps for characters and words
|
|
24
|
+
charFrequency = new Map();
|
|
25
|
+
wordHistogram = new Map();
|
|
26
|
+
syllableCache = new Map();
|
|
27
|
+
/**
|
|
28
|
+
* Constructs a new TextAnalyzer instance with the provided input text.
|
|
29
|
+
*
|
|
30
|
+
* @param {string} input - The text to analyze
|
|
31
|
+
*/
|
|
32
|
+
constructor(input) {
|
|
33
|
+
this.text = input.trim();
|
|
34
|
+
this.tokenize();
|
|
35
|
+
this.computeFrequencies();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Tokenizes the input text into words and sentences.
|
|
39
|
+
*/
|
|
40
|
+
tokenize() {
|
|
41
|
+
(this.words = []), (this.sentences = []);
|
|
42
|
+
const text = this.text;
|
|
43
|
+
const wordRegex = /\p{L}+/gu;
|
|
44
|
+
let match;
|
|
45
|
+
// Tokenize words using Unicode property escapes for letters
|
|
46
|
+
while ((match = wordRegex.exec(text)) !== null) {
|
|
47
|
+
this.words.push(match[0].toLowerCase());
|
|
48
|
+
}
|
|
49
|
+
// Tokenize sentences using punctuation marks as delimiters
|
|
50
|
+
this.sentences = text.split(/(?<=[.!?])\s+/).filter(Boolean);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Computes character and word frequencies from the tokenized text.
|
|
54
|
+
*/
|
|
55
|
+
computeFrequencies() {
|
|
56
|
+
// Compute character frequencies
|
|
57
|
+
for (const char of this.text)
|
|
58
|
+
this.charFrequency.set(char, (this.charFrequency.get(char) ?? 0) + 1);
|
|
59
|
+
// Compute word frequencies
|
|
60
|
+
for (const word of this.words)
|
|
61
|
+
this.wordHistogram.set(word, (this.wordHistogram.get(word) ?? 0) + 1);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Estimates the number of syllables in a word using a simple heuristic.
|
|
65
|
+
*
|
|
66
|
+
* @param {string} word - The word to estimate syllables for
|
|
67
|
+
* @returns {number} - Estimated syllable count
|
|
68
|
+
*/
|
|
69
|
+
estimateSyllables(word) {
|
|
70
|
+
// Check cache first to avoid redundant calculations
|
|
71
|
+
if (this.syllableCache.has(word)) return this.syllableCache.get(word);
|
|
72
|
+
// Normalize the word: lowercase and remove non-letter characters
|
|
73
|
+
const clean = word.toLowerCase().replace(/[^a-zäöüß]/g, '');
|
|
74
|
+
const matches = clean.match(/[aeiouyäöü]+/g);
|
|
75
|
+
// Count syllables based on vowel groups
|
|
76
|
+
const count = matches ? matches.length : 1;
|
|
77
|
+
this.syllableCache.set(word, count);
|
|
78
|
+
return count;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Gets the original text length in characters.
|
|
82
|
+
*
|
|
83
|
+
* @return {number} - Length of the text
|
|
84
|
+
*/
|
|
85
|
+
getLength() {
|
|
86
|
+
return this.text.length;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Gets the number of words in the text.
|
|
90
|
+
*
|
|
91
|
+
* @return {number} - Count of words
|
|
92
|
+
*/
|
|
93
|
+
getWordCount() {
|
|
94
|
+
return this.words.length;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Gets the number of sentences in the text.
|
|
98
|
+
*
|
|
99
|
+
* @return {number} - Count of sentences
|
|
100
|
+
*/
|
|
101
|
+
getSentenceCount() {
|
|
102
|
+
return this.sentences.length;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Gets the average word length in the text.
|
|
106
|
+
*
|
|
107
|
+
* @return {number} - Average length of words
|
|
108
|
+
*/
|
|
109
|
+
getAvgWordLength() {
|
|
110
|
+
let totalLen = 0;
|
|
111
|
+
for (const w of this.words) totalLen += w.length;
|
|
112
|
+
return this.words.length ? totalLen / this.words.length : 0;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Gets the average sentence length in words.
|
|
116
|
+
*
|
|
117
|
+
* @return {number} - Average length of sentences
|
|
118
|
+
*/
|
|
119
|
+
getAvgSentenceLength() {
|
|
120
|
+
return this.sentences.length
|
|
121
|
+
? this.words.length / this.sentences.length
|
|
122
|
+
: 0;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Gets a histogram of word frequencies in the text.
|
|
126
|
+
*
|
|
127
|
+
* @returns {Record<string, number>} - A histogram of word frequencies
|
|
128
|
+
*/
|
|
129
|
+
getWordHistogram() {
|
|
130
|
+
return Object.fromEntries(this.wordHistogram);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Gets the most common words in the text, limited to a specified number.
|
|
134
|
+
*
|
|
135
|
+
* @param {number} [limit=5] - Maximum number of common words to return
|
|
136
|
+
* @returns {string[]} - Array of the most common words
|
|
137
|
+
*/
|
|
138
|
+
getMostCommonWords(limit = 5) {
|
|
139
|
+
return [...this.wordHistogram.entries()]
|
|
140
|
+
.sort((a, b) => b[1] - a[1])
|
|
141
|
+
.slice(0, limit)
|
|
142
|
+
.map((e) => e[0]);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Gets the least common words (hapax legomena) in the text.
|
|
146
|
+
*
|
|
147
|
+
* Hapax legomena are words that occur only once in the text.
|
|
148
|
+
*
|
|
149
|
+
* @returns {string[]} - Array of hapax legomena
|
|
150
|
+
*/
|
|
151
|
+
getHapaxLegomena() {
|
|
152
|
+
return [...this.wordHistogram.entries()]
|
|
153
|
+
.filter(([, c]) => c === 1)
|
|
154
|
+
.map((e) => e[0]);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Checks if the text contains any numbers.
|
|
158
|
+
*
|
|
159
|
+
* @returns {boolean} - True if numbers are present, false otherwise
|
|
160
|
+
*/
|
|
161
|
+
hasNumbers() {
|
|
162
|
+
return /\d/.test(this.text);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Calculates the ratio of uppercase letters to total letters in the text.
|
|
166
|
+
*
|
|
167
|
+
* @return {number} - Ratio of uppercase letters to total letters
|
|
168
|
+
*/
|
|
169
|
+
getUpperCaseRatio() {
|
|
170
|
+
let upper = 0,
|
|
171
|
+
letters = 0;
|
|
172
|
+
for (let i = 0, len = this.text.length; i < len; i++) {
|
|
173
|
+
const c = this.text[i];
|
|
174
|
+
if (/[A-Za-zÄÖÜäöüß]/.test(c)) {
|
|
175
|
+
letters++;
|
|
176
|
+
if (/[A-ZÄÖÜ]/.test(c)) upper++;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return letters ? upper / letters : 0;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Gets the frequency of each character in the text.
|
|
183
|
+
*
|
|
184
|
+
* @returns {Record<string, number>} - A record of character frequencies
|
|
185
|
+
*/
|
|
186
|
+
getCharFrequency() {
|
|
187
|
+
return Object.fromEntries(this.charFrequency);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Gets the frequency of each Unicode block in the text.
|
|
191
|
+
*
|
|
192
|
+
* @returns {Record<string, number>} - A record of Unicode block frequencies
|
|
193
|
+
*/
|
|
194
|
+
getUnicodeStats() {
|
|
195
|
+
const result = {};
|
|
196
|
+
for (const [char, count] of this.charFrequency) {
|
|
197
|
+
// Get the Unicode block for the character
|
|
198
|
+
const block = char
|
|
199
|
+
.charCodeAt(0)
|
|
200
|
+
.toString(16)
|
|
201
|
+
.padStart(4, '0')
|
|
202
|
+
.toUpperCase();
|
|
203
|
+
// Increment the count for the block
|
|
204
|
+
result[block] = (result[block] ?? 0) + count;
|
|
205
|
+
}
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Gets the ratio of long words (words with length >= len) to total words.
|
|
210
|
+
*
|
|
211
|
+
* @param {number} [len=7] - Minimum length for a word to be considered long
|
|
212
|
+
* @returns {number} - Ratio of long words to total words
|
|
213
|
+
*/
|
|
214
|
+
getLongWordRatio(len = 7) {
|
|
215
|
+
let long = 0;
|
|
216
|
+
for (const w of this.words) if (w.length >= len) long++;
|
|
217
|
+
return this.words.length ? long / this.words.length : 0;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Gets the ratio of short words (words with length <= len) to total words.
|
|
221
|
+
*
|
|
222
|
+
* @param {number} [len=3] - Maximum length for a word to be considered short
|
|
223
|
+
* @returns {number} - Ratio of short words to total words
|
|
224
|
+
*/
|
|
225
|
+
getShortWordRatio(len = 3) {
|
|
226
|
+
let short = 0;
|
|
227
|
+
for (const w of this.words) if (w.length <= len) short++;
|
|
228
|
+
return this.words.length ? short / this.words.length : 0;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Estimates the number of syllables in the text.
|
|
232
|
+
*
|
|
233
|
+
* @returns {number} - Total estimated syllable count
|
|
234
|
+
*/
|
|
235
|
+
getSyllablesCount() {
|
|
236
|
+
let count = 0;
|
|
237
|
+
for (const w of this.words) count += this.estimateSyllables(w);
|
|
238
|
+
return count;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Gets the number of monosyllabic words (words with exactly one syllable).
|
|
242
|
+
*
|
|
243
|
+
* @returns {number} - Count of monosyllabic words
|
|
244
|
+
*/
|
|
245
|
+
getMonosyllabicWordCount() {
|
|
246
|
+
let count = 0;
|
|
247
|
+
for (const w of this.words) if (this.estimateSyllables(w) === 1) count++;
|
|
248
|
+
return count;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Gets the number of words with at least a specified minimum syllable count.
|
|
252
|
+
*
|
|
253
|
+
* @param {number} min - Minimum syllable count for a word to be included
|
|
254
|
+
* @returns {number} - Count of words meeting the syllable criteria
|
|
255
|
+
*/
|
|
256
|
+
getMinSyllablesWordCount(min) {
|
|
257
|
+
let count = 0;
|
|
258
|
+
for (const w of this.words) if (this.estimateSyllables(w) >= min) count++;
|
|
259
|
+
return count;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Gets the number of words with at most a specified maximum syllable count.
|
|
263
|
+
*
|
|
264
|
+
* @param {number} max - Maximum syllable count for a word to be included
|
|
265
|
+
* @returns {number} - Count of words meeting the syllable criteria
|
|
266
|
+
*/
|
|
267
|
+
getMaxSyllablesWordCount(max) {
|
|
268
|
+
let count = 0;
|
|
269
|
+
for (const w of this.words) if (this.estimateSyllables(w) <= max) count++;
|
|
270
|
+
return count;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Calculates the Honore's R statistic for the text as a measure of lexical richness.
|
|
274
|
+
*
|
|
275
|
+
* @returns {number} - The Honore's R statistic
|
|
276
|
+
*/
|
|
277
|
+
getHonoresR() {
|
|
278
|
+
return (
|
|
279
|
+
(100 * Math.log(this.words.length)) /
|
|
280
|
+
(1 - this.getHapaxLegomena().length / (this.wordHistogram.size ?? 1))
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Estimates the reading time for the text based on words per minute (WPM).
|
|
285
|
+
*
|
|
286
|
+
* @param {number} [wpm=200] - Words per minute for the calculation
|
|
287
|
+
* @returns {number} - Estimated reading time in minutes
|
|
288
|
+
*/
|
|
289
|
+
getReadingTime(wpm = 200) {
|
|
290
|
+
return Math.max(1, this.words.length / (wpm ?? 1));
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Calculates various readability scores based on the text.
|
|
294
|
+
*
|
|
295
|
+
* This method supports multiple readability metrics:
|
|
296
|
+
* - Flesch Reading Ease
|
|
297
|
+
* - Flesch-Kincaid Grade Level
|
|
298
|
+
*
|
|
299
|
+
* @param {'flesch'|'fleschde'|'kincaid'} [metric='flesch'] - The readability metric to calculate
|
|
300
|
+
* @returns {number} - The calculated readability score
|
|
301
|
+
*/
|
|
302
|
+
getReadabilityScore(metric = 'flesch') {
|
|
303
|
+
const w = this.words.length || 1;
|
|
304
|
+
const s = this.sentences.length || 1;
|
|
305
|
+
const y = this.getSyllablesCount() || 1;
|
|
306
|
+
const asl = w / s;
|
|
307
|
+
const asw = y / w;
|
|
308
|
+
switch (metric) {
|
|
309
|
+
// Flesch Reading Ease formula
|
|
310
|
+
case 'flesch':
|
|
311
|
+
return 206.835 - 1.015 * asl - 84.6 * asw;
|
|
312
|
+
// Flesch Reading Ease formula for German texts
|
|
313
|
+
case 'fleschde':
|
|
314
|
+
return 180 - asl - 58.5 * asw;
|
|
315
|
+
// Flesch-Kincaid Grade Level formula
|
|
316
|
+
case 'kincaid':
|
|
317
|
+
return 0.39 * asl + 11.8 * asw - 15.59;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Calculates the LIX (Lesbarhetsindex) score for the text.
|
|
322
|
+
*
|
|
323
|
+
* The LIX score is a readability index that combines average word length and sentence length.
|
|
324
|
+
*
|
|
325
|
+
* @returns {number} - The LIX score
|
|
326
|
+
*/
|
|
327
|
+
getLIXScore() {
|
|
328
|
+
const w = this.words.length || 1;
|
|
329
|
+
const s = this.sentences.length || 1;
|
|
330
|
+
const l = this.getLongWordRatio() * w;
|
|
331
|
+
return w / s + (l / w) * 100;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Calculates the Wiener Sachtextformel (WSTF) scores for the text.
|
|
335
|
+
*
|
|
336
|
+
* The WSTF scores are a set of readability metrics based on word and sentence characteristics.
|
|
337
|
+
*
|
|
338
|
+
* @returns {[number, number, number, number]} - An array of WSTF scores
|
|
339
|
+
*/
|
|
340
|
+
getWSTFScore() {
|
|
341
|
+
const w = this.words.length || 1;
|
|
342
|
+
const h = (this.getMinSyllablesWordCount(3) / w) * 100;
|
|
343
|
+
const s = this.getAvgSentenceLength();
|
|
344
|
+
const l = this.getLongWordRatio() * 100;
|
|
345
|
+
const m = (this.getMonosyllabicWordCount() / w) * 100;
|
|
346
|
+
return [
|
|
347
|
+
0.1935 * h + 0.1672 * s + 0.1297 * l - 0.0327 * m - 0.875,
|
|
348
|
+
0.2007 * h + 0.1682 * s + 0.1373 * l - 2.779,
|
|
349
|
+
0.2963 * h + 0.1905 * s - 1.1144,
|
|
350
|
+
0.2744 * h + 0.2656 * s - 1.693
|
|
351
|
+
];
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
export { TextAnalyzer };
|
|
356
|
+
//# sourceMappingURL=TextAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextAnalyzer.js","sources":["../../../src/utils/TextAnalyzer.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|