@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.
- package/README.ja.md +609 -0
- package/README.md +600 -0
- package/dist/analyzers/KeywordExtractor.d.ts +48 -0
- package/dist/analyzers/KeywordExtractor.js +253 -0
- package/dist/analyzers/KeywordExtractor.js.map +1 -0
- package/dist/analyzers/PatternDetector.d.ts +38 -0
- package/dist/analyzers/PatternDetector.js +244 -0
- package/dist/analyzers/PatternDetector.js.map +1 -0
- package/dist/analyzers/SimilarityAnalyzer.d.ts +23 -0
- package/dist/analyzers/SimilarityAnalyzer.js +153 -0
- package/dist/analyzers/SimilarityAnalyzer.js.map +1 -0
- package/dist/config/defaultPrompts.d.ts +5 -0
- package/dist/config/defaultPrompts.js +22 -0
- package/dist/config/defaultPrompts.js.map +1 -0
- package/dist/core/ConversationAnalyzer.d.ts +51 -0
- package/dist/core/ConversationAnalyzer.js +213 -0
- package/dist/core/ConversationAnalyzer.js.map +1 -0
- package/dist/core/ManneriDetector.d.ts +64 -0
- package/dist/core/ManneriDetector.js +251 -0
- package/dist/core/ManneriDetector.js.map +1 -0
- package/dist/generators/PromptGenerator.d.ts +15 -0
- package/dist/generators/PromptGenerator.js +45 -0
- package/dist/generators/PromptGenerator.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/persistence/LocalStoragePersistenceProvider.d.ts +45 -0
- package/dist/persistence/LocalStoragePersistenceProvider.js +102 -0
- package/dist/persistence/LocalStoragePersistenceProvider.js.map +1 -0
- package/dist/persistence/index.d.ts +5 -0
- package/dist/persistence/index.js +5 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/types/index.d.ts +114 -0
- package/dist/types/index.js +28 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/persistence.d.ts +78 -0
- package/dist/types/persistence.js +2 -0
- package/dist/types/persistence.js.map +1 -0
- package/dist/types/prompts.d.ts +22 -0
- package/dist/types/prompts.js +36 -0
- package/dist/types/prompts.js.map +1 -0
- package/dist/utils/browserUtils.d.ts +20 -0
- package/dist/utils/browserUtils.js +206 -0
- package/dist/utils/browserUtils.js.map +1 -0
- package/dist/utils/textUtils.d.ts +10 -0
- package/dist/utils/textUtils.js +269 -0
- package/dist/utils/textUtils.js.map +1 -0
- 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
|
+
}
|