@aituber-onair/manneri 0.1.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.
Files changed (48) hide show
  1. package/README.ja.md +609 -0
  2. package/README.md +600 -0
  3. package/dist/analyzers/KeywordExtractor.d.ts +48 -0
  4. package/dist/analyzers/KeywordExtractor.js +253 -0
  5. package/dist/analyzers/KeywordExtractor.js.map +1 -0
  6. package/dist/analyzers/PatternDetector.d.ts +38 -0
  7. package/dist/analyzers/PatternDetector.js +244 -0
  8. package/dist/analyzers/PatternDetector.js.map +1 -0
  9. package/dist/analyzers/SimilarityAnalyzer.d.ts +23 -0
  10. package/dist/analyzers/SimilarityAnalyzer.js +153 -0
  11. package/dist/analyzers/SimilarityAnalyzer.js.map +1 -0
  12. package/dist/config/defaultPrompts.d.ts +5 -0
  13. package/dist/config/defaultPrompts.js +22 -0
  14. package/dist/config/defaultPrompts.js.map +1 -0
  15. package/dist/core/ConversationAnalyzer.d.ts +51 -0
  16. package/dist/core/ConversationAnalyzer.js +213 -0
  17. package/dist/core/ConversationAnalyzer.js.map +1 -0
  18. package/dist/core/ManneriDetector.d.ts +64 -0
  19. package/dist/core/ManneriDetector.js +251 -0
  20. package/dist/core/ManneriDetector.js.map +1 -0
  21. package/dist/generators/PromptGenerator.d.ts +15 -0
  22. package/dist/generators/PromptGenerator.js +45 -0
  23. package/dist/generators/PromptGenerator.js.map +1 -0
  24. package/dist/index.d.ts +21 -0
  25. package/dist/index.js +27 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/persistence/LocalStoragePersistenceProvider.d.ts +45 -0
  28. package/dist/persistence/LocalStoragePersistenceProvider.js +102 -0
  29. package/dist/persistence/LocalStoragePersistenceProvider.js.map +1 -0
  30. package/dist/persistence/index.d.ts +5 -0
  31. package/dist/persistence/index.js +5 -0
  32. package/dist/persistence/index.js.map +1 -0
  33. package/dist/types/index.d.ts +114 -0
  34. package/dist/types/index.js +28 -0
  35. package/dist/types/index.js.map +1 -0
  36. package/dist/types/persistence.d.ts +78 -0
  37. package/dist/types/persistence.js +2 -0
  38. package/dist/types/persistence.js.map +1 -0
  39. package/dist/types/prompts.d.ts +22 -0
  40. package/dist/types/prompts.js +36 -0
  41. package/dist/types/prompts.js.map +1 -0
  42. package/dist/utils/browserUtils.d.ts +20 -0
  43. package/dist/utils/browserUtils.js +206 -0
  44. package/dist/utils/browserUtils.js.map +1 -0
  45. package/dist/utils/textUtils.d.ts +10 -0
  46. package/dist/utils/textUtils.js +269 -0
  47. package/dist/utils/textUtils.js.map +1 -0
  48. package/package.json +50 -0
@@ -0,0 +1,269 @@
1
+ export function normalizeText(text, options = {}) {
2
+ const opts = {
3
+ caseSensitive: false,
4
+ language: 'auto',
5
+ ...options,
6
+ };
7
+ let normalized = text.trim();
8
+ if (!opts.caseSensitive) {
9
+ normalized = normalized.toLowerCase();
10
+ }
11
+ normalized = normalized.replace(/\s+/g, ' ');
12
+ if (opts.language === 'ja' ||
13
+ (opts.language === 'auto' && containsJapanese(text))) {
14
+ normalized = normalized.replace(/[、。!?]/g, '');
15
+ }
16
+ return normalized;
17
+ }
18
+ export function containsJapanese(text) {
19
+ return /[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FAF]/.test(text);
20
+ }
21
+ export function tokenize(text, options = {}) {
22
+ const opts = {
23
+ minWordLength: 2,
24
+ includeStopWords: false,
25
+ language: 'auto',
26
+ ...options,
27
+ };
28
+ const normalized = normalizeText(text, opts);
29
+ const isJapanese = opts.language === 'ja' ||
30
+ (opts.language === 'auto' && containsJapanese(text));
31
+ let tokens;
32
+ if (isJapanese) {
33
+ tokens = tokenizeJapanese(normalized);
34
+ }
35
+ else {
36
+ tokens = normalized.split(/\s+/).filter((token) => token.length > 0);
37
+ }
38
+ tokens = tokens.filter((token) => token.length >= opts.minWordLength);
39
+ if (!opts.includeStopWords) {
40
+ tokens = tokens.filter((token) => !isStopWord(token, isJapanese));
41
+ }
42
+ return tokens;
43
+ }
44
+ function tokenizeJapanese(text) {
45
+ const tokens = [];
46
+ let currentToken = '';
47
+ for (let i = 0; i < text.length; i++) {
48
+ const char = text[i];
49
+ if (/[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FAF]/.test(char)) {
50
+ if (currentToken &&
51
+ !/[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FAF]/.test(currentToken)) {
52
+ tokens.push(currentToken);
53
+ currentToken = '';
54
+ }
55
+ currentToken += char;
56
+ }
57
+ else if (/[a-zA-Z0-9]/.test(char)) {
58
+ if (currentToken &&
59
+ /[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FAF]/.test(currentToken)) {
60
+ tokens.push(currentToken);
61
+ currentToken = '';
62
+ }
63
+ currentToken += char;
64
+ }
65
+ else {
66
+ if (currentToken) {
67
+ tokens.push(currentToken);
68
+ currentToken = '';
69
+ }
70
+ }
71
+ }
72
+ if (currentToken) {
73
+ tokens.push(currentToken);
74
+ }
75
+ return tokens.filter((token) => token.length > 0);
76
+ }
77
+ function isStopWord(word, isJapanese) {
78
+ const japaneseStopWords = [
79
+ 'は',
80
+ 'が',
81
+ 'を',
82
+ 'に',
83
+ 'で',
84
+ 'と',
85
+ 'から',
86
+ 'まで',
87
+ 'より',
88
+ 'の',
89
+ 'や',
90
+ 'か',
91
+ 'な',
92
+ 'だ',
93
+ 'である',
94
+ 'です',
95
+ 'ます',
96
+ 'した',
97
+ 'します',
98
+ 'する',
99
+ 'されて',
100
+ 'いる',
101
+ 'いた',
102
+ 'ある',
103
+ 'あり',
104
+ 'あった',
105
+ 'この',
106
+ 'その',
107
+ 'あの',
108
+ 'どの',
109
+ 'ここ',
110
+ 'そこ',
111
+ 'あそこ',
112
+ 'どこ',
113
+ 'こと',
114
+ 'もの',
115
+ 'はい',
116
+ 'いいえ',
117
+ 'そうです',
118
+ 'そうですね',
119
+ ];
120
+ const englishStopWords = [
121
+ 'the',
122
+ 'is',
123
+ 'at',
124
+ 'which',
125
+ 'on',
126
+ 'and',
127
+ 'a',
128
+ 'an',
129
+ 'as',
130
+ 'are',
131
+ 'was',
132
+ 'were',
133
+ 'been',
134
+ 'be',
135
+ 'have',
136
+ 'has',
137
+ 'had',
138
+ 'do',
139
+ 'does',
140
+ 'did',
141
+ 'will',
142
+ 'would',
143
+ 'could',
144
+ 'should',
145
+ 'may',
146
+ 'might',
147
+ 'must',
148
+ 'can',
149
+ 'i',
150
+ 'you',
151
+ 'he',
152
+ 'she',
153
+ 'it',
154
+ 'we',
155
+ 'they',
156
+ 'me',
157
+ 'him',
158
+ 'her',
159
+ 'us',
160
+ 'them',
161
+ 'my',
162
+ 'your',
163
+ 'his',
164
+ 'her',
165
+ 'its',
166
+ 'our',
167
+ 'their',
168
+ 'this',
169
+ 'that',
170
+ 'these',
171
+ 'those',
172
+ 'yes',
173
+ 'no',
174
+ 'ok',
175
+ 'okay',
176
+ ];
177
+ const stopWords = isJapanese ? japaneseStopWords : englishStopWords;
178
+ return stopWords.includes(word.toLowerCase());
179
+ }
180
+ export function generateNgrams(tokens, n) {
181
+ if (n <= 0 || n > tokens.length)
182
+ return [];
183
+ const ngrams = [];
184
+ for (let i = 0; i <= tokens.length - n; i++) {
185
+ ngrams.push(tokens.slice(i, i + n).join(' '));
186
+ }
187
+ return ngrams;
188
+ }
189
+ export function calculateJaccardSimilarity(set1, set2) {
190
+ if (set1.size === 0 && set2.size === 0)
191
+ return 1.0;
192
+ const intersection = new Set([...set1].filter((x) => set2.has(x)));
193
+ const union = new Set([...set1, ...set2]);
194
+ return intersection.size / union.size;
195
+ }
196
+ export function calculateCosineSimilarity(vector1, vector2) {
197
+ if (vector1.length !== vector2.length)
198
+ return 0;
199
+ let dotProduct = 0;
200
+ let norm1 = 0;
201
+ let norm2 = 0;
202
+ for (let i = 0; i < vector1.length; i++) {
203
+ dotProduct += vector1[i] * vector2[i];
204
+ norm1 += vector1[i] * vector1[i];
205
+ norm2 += vector2[i] * vector2[i];
206
+ }
207
+ if (norm1 === 0 || norm2 === 0)
208
+ return 0;
209
+ return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));
210
+ }
211
+ export function createTfIdfVector(tokens, vocabulary, documentFrequencies, totalDocuments) {
212
+ const tokenCounts = new Map();
213
+ for (const token of tokens) {
214
+ tokenCounts.set(token, (tokenCounts.get(token) || 0) + 1);
215
+ }
216
+ return vocabulary.map((term) => {
217
+ const tf = (tokenCounts.get(term) || 0) / tokens.length;
218
+ const df = documentFrequencies.get(term) || 1;
219
+ const idf = Math.log(totalDocuments / df);
220
+ return tf * idf;
221
+ });
222
+ }
223
+ export function extractKeywords(text, options = {}) {
224
+ const tokens = tokenize(text, options);
225
+ const tokenCounts = new Map();
226
+ for (const token of tokens) {
227
+ tokenCounts.set(token, (tokenCounts.get(token) || 0) + 1);
228
+ }
229
+ const sortedTokens = Array.from(tokenCounts.entries())
230
+ .sort((a, b) => b[1] - a[1])
231
+ .map(([token]) => token);
232
+ return sortedTokens.slice(0, Math.min(10, sortedTokens.length));
233
+ }
234
+ export function calculateTextSimilarity(text1, text2, options = {}) {
235
+ const normalized1 = normalizeText(text1, options);
236
+ const normalized2 = normalizeText(text2, options);
237
+ // Quick check for exact match after normalization
238
+ if (normalized1 === normalized2)
239
+ return 1.0;
240
+ const tokens1 = tokenize(text1, options);
241
+ const tokens2 = tokenize(text2, options);
242
+ if (tokens1.length === 0 && tokens2.length === 0)
243
+ return 1.0;
244
+ if (tokens1.length === 0 || tokens2.length === 0)
245
+ return 0.0;
246
+ const set1 = new Set(tokens1);
247
+ const set2 = new Set(tokens2);
248
+ const jaccardSimilarity = calculateJaccardSimilarity(set1, set2);
249
+ // For short texts or when Jaccard similarity is very high, just use Jaccard
250
+ if (tokens1.length < 5 || tokens2.length < 5 || jaccardSimilarity > 0.9) {
251
+ return jaccardSimilarity;
252
+ }
253
+ // For longer texts, use a combination of Jaccard and token-based similarity
254
+ const vocabulary = Array.from(new Set([...tokens1, ...tokens2]));
255
+ const tokenFreq1 = new Map();
256
+ const tokenFreq2 = new Map();
257
+ for (const token of tokens1) {
258
+ tokenFreq1.set(token, (tokenFreq1.get(token) || 0) + 1);
259
+ }
260
+ for (const token of tokens2) {
261
+ tokenFreq2.set(token, (tokenFreq2.get(token) || 0) + 1);
262
+ }
263
+ // Calculate simple cosine similarity based on token frequencies
264
+ const vector1 = vocabulary.map((term) => tokenFreq1.get(term) || 0);
265
+ const vector2 = vocabulary.map((term) => tokenFreq2.get(term) || 0);
266
+ const cosineSimilarity = calculateCosineSimilarity(vector1, vector2);
267
+ return (jaccardSimilarity + cosineSimilarity) / 2;
268
+ }
269
+ //# sourceMappingURL=textUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textUtils.js","sourceRoot":"","sources":["../../src/utils/textUtils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@aituber-onair/manneri",
3
+ "version": "0.1.0",
4
+ "description": "A lightweight conversation pattern detection library to prevent repetitive AI responses",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "files": ["dist", "README.md"],
10
+ "scripts": {
11
+ "build": "tsc --project tsconfig.json",
12
+ "typecheck": "tsc --noEmit",
13
+ "test": "npm run typecheck && vitest run",
14
+ "test:watch": "vitest",
15
+ "test:coverage": "vitest run --coverage",
16
+ "fmt": "biome format . --write",
17
+ "fmt:check": "biome format .",
18
+ "lint": "biome lint .",
19
+ "clean": "rm -rf dist",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "keywords": [
23
+ "conversation",
24
+ "ai",
25
+ "chatbot",
26
+ "pattern-detection",
27
+ "aituber",
28
+ "frontend",
29
+ "browser"
30
+ ],
31
+ "author": "shinshin86 (https://github.com/shinshin86)",
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/shinshin86/aituber-onair.git",
36
+ "directory": "packages/manneri"
37
+ },
38
+ "devDependencies": {
39
+ "@biomejs/biome": "1.9.4",
40
+ "@types/node": "^18.15.0",
41
+ "@vitest/coverage-v8": "^1.3.1",
42
+ "jsdom": "^22.1.0",
43
+ "typescript": "^5.0.0",
44
+ "vitest": "^1.3.1"
45
+ },
46
+ "browserslist": ["defaults", "not IE 11"],
47
+ "publishConfig": {
48
+ "access": "public"
49
+ }
50
+ }