utiller 1.0.381 → 1.0.383
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/lib/utiller/index.js +87 -4
- package/package.json +1 -1
- package/template/sample.package.json +1 -1
package/lib/utiller/index.js
CHANGED
|
@@ -306,6 +306,89 @@ var Utiller = /*#__PURE__*/function () {
|
|
|
306
306
|
minimumFractionDigits: 0 // 確保不顯示小數
|
|
307
307
|
}).format(number);
|
|
308
308
|
});
|
|
309
|
+
/**
|
|
310
|
+
* 使用 ES10+ 和 Lodash,將短句子轉換為潛在的搜尋關鍵字陣列。
|
|
311
|
+
* 策略:1. 提取英文單字 2. 提取規格/色號詞組 3. 清理中文 4. 窮舉中文 N-gram 5. 去重和過濾
|
|
312
|
+
* @param {string} sentence - 原始字串。
|
|
313
|
+
* @param {number} [maxLength=50] - 允許的最大字串長度。
|
|
314
|
+
* @param {number} [maxNgramLength=3] - N-gram 的最大長度,預設為 3。
|
|
315
|
+
* @returns {string[]} - 潛在關鍵字陣列(至少 2 個字/中文字)。
|
|
316
|
+
*/
|
|
317
|
+
(0, _defineProperty2["default"])(this, "generateUniversalKeywords", function (sentence) {
|
|
318
|
+
var maxLength = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 50;
|
|
319
|
+
var maxNgramLength = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 4;
|
|
320
|
+
// 引入 Lodash,確保在執行環境中可用
|
|
321
|
+
if (!sentence || typeof sentence !== "string") {
|
|
322
|
+
return [];
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// 假設 Lodash 已經全域引入為 '_'
|
|
326
|
+
if (typeof _lodash["default"] === "undefined") {
|
|
327
|
+
console.error("Lodash is not available. Please ensure it is imported.");
|
|
328
|
+
return [];
|
|
329
|
+
}
|
|
330
|
+
var textToProcess = sentence.trim();
|
|
331
|
+
var keywords = []; // 最終所有關鍵字的集合
|
|
332
|
+
|
|
333
|
+
// 參數安全檢查 (確保 N-gram 長度至少為 2)
|
|
334
|
+
maxNgramLength = Math.max(2, maxNgramLength);
|
|
335
|
+
|
|
336
|
+
// 警告/截斷邏輯
|
|
337
|
+
if (textToProcess.length > maxLength) {
|
|
338
|
+
console.warn("\u8B66\u544A\uFF1A\u8F38\u5165\u5B57\u4E32\u9577\u5EA6\u70BA ".concat(textToProcess.length, "\uFF0C\u5DF2\u6839\u64DA maxLength: ").concat(maxLength, " \u622A\u65B7\u3002"));
|
|
339
|
+
textToProcess = textToProcess.substring(0, maxLength);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// --- 步驟 1: 提取完整英文單字 (SACHIA, sachia, Sachia) ---
|
|
343
|
+
var englishWords = textToProcess.match(/[a-zA-Z]+/g) || [];
|
|
344
|
+
englishWords.forEach(function (word) {
|
|
345
|
+
if (word.length >= 2) {
|
|
346
|
+
keywords.push(word.toUpperCase());
|
|
347
|
+
keywords.push(word.toLowerCase());
|
|
348
|
+
var capitalized = word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
|
|
349
|
+
keywords.push(capitalized);
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
// --- 步驟 2: 提取規格、數量和色號關鍵字 (12W, 10ml, 10色, 1號) ---
|
|
354
|
+
var specKeywordsRegex = /\b[0-9]+[a-zA-Z]{1,4}\b|\b[0-9]{1,3}(w|ml|g|oz|k)\b|[\u4e00-\u9fa5a-zA-Z0-9]{1,4}(色|號)[\u4e00-\u9fa5a-zA-Z0-9]{0,2}/gi;
|
|
355
|
+
var specKeywords = (textToProcess.match(specKeywordsRegex) || []).filter(function (k) {
|
|
356
|
+
return k.length >= 2;
|
|
357
|
+
}).map(function (k) {
|
|
358
|
+
return k.toLowerCase();
|
|
359
|
+
});
|
|
360
|
+
keywords.push.apply(keywords, (0, _toConsumableArray2["default"])(specKeywords));
|
|
361
|
+
|
|
362
|
+
// --- 步驟 3: 清理和標準化 (用於 N-gram 提取) ---
|
|
363
|
+
|
|
364
|
+
var cleanText = textToProcess.toLowerCase();
|
|
365
|
+
|
|
366
|
+
// 1. 將所有提取過的規格詞彙(數字+單位/字母)替換為空格
|
|
367
|
+
cleanText = cleanText.replace(/[0-9]+([\u4e00-\u9fa5a-z]{1,4}|[\/\-\~\\])/g, " ").replace(/\b[a-z]{1,4}\b/g, " ").replace(/\b[0-9]{1,3}\b/g, " ");
|
|
368
|
+
|
|
369
|
+
// 2. 移除通用詞和符號
|
|
370
|
+
cleanText = cleanText.replace(/[!@#$%^&*()_+={}\[\]:;"'<>,.?\/\\|`~]/g, " ").replace(/系列|一組|單色|多款|套組|全套|專用|迷你|頂級|高品質|超閃|奢華|最新|款式|新款|超亮|的|與|和|閃|美甲/g, " ").replace(/\s+/g, "") // **移除所有空格**
|
|
371
|
+
.trim();
|
|
372
|
+
|
|
373
|
+
// --- 步驟 4: 窮舉所有 >= 2 個字的 N-gram 詞組 (針對純中文) ---
|
|
374
|
+
var minLength = 2;
|
|
375
|
+
// maxNgramLength 現在是從參數傳入的
|
|
376
|
+
|
|
377
|
+
for (var len = minLength; len <= maxNgramLength; len++) {
|
|
378
|
+
for (var i = 0; i <= cleanText.length - len; i++) {
|
|
379
|
+
var keyword = cleanText.substring(i, i + len);
|
|
380
|
+
keywords.push(keyword);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// --- 步驟 5: 標準化、去重和過濾 ---
|
|
385
|
+
var finalKeywords = _lodash["default"].chain(keywords).filter(function (k) {
|
|
386
|
+
return k.length >= 2;
|
|
387
|
+
}).filter(function (k) {
|
|
388
|
+
return k.length > 2 || !/^[\u4e00-\u9fa5a-z0-9]$/.test(k);
|
|
389
|
+
}).uniq().sortBy().value();
|
|
390
|
+
return finalKeywords;
|
|
391
|
+
});
|
|
309
392
|
/**
|
|
310
393
|
* 直接修改原本 array,將 object 移動到指定 index
|
|
311
394
|
* @param {Array} array - 要修改的陣列
|
|
@@ -4059,14 +4142,14 @@ var Utiller = /*#__PURE__*/function () {
|
|
|
4059
4142
|
}).keys().compact() // 移除 null、undefined、''、0、false、NaN
|
|
4060
4143
|
.value();
|
|
4061
4144
|
}
|
|
4062
|
-
|
|
4145
|
+
}, {
|
|
4146
|
+
key: "getObjectOfSpecifyKey",
|
|
4147
|
+
value:
|
|
4063
4148
|
/**
|
|
4064
4149
|
* 減少不必要的{}
|
|
4065
4150
|
* 例如 array.map(each => {return {key,value}})
|
|
4066
4151
|
**/
|
|
4067
|
-
|
|
4068
|
-
key: "getObjectOfSpecifyKey",
|
|
4069
|
-
value: function getObjectOfSpecifyKey(value, key) {
|
|
4152
|
+
function getObjectOfSpecifyKey(value, key) {
|
|
4070
4153
|
var object = {};
|
|
4071
4154
|
object[key] = value;
|
|
4072
4155
|
return object;
|
package/package.json
CHANGED