utiller 1.0.382 → 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.
@@ -308,20 +308,30 @@ var Utiller = /*#__PURE__*/function () {
308
308
  });
309
309
  /**
310
310
  * 使用 ES10+ 和 Lodash,將短句子轉換為潛在的搜尋關鍵字陣列。
311
- * 策略:1. 清理 2. 窮舉所有可能的 2 字或 3 字詞組 3. 去重和過濾
311
+ * 策略:1. 提取英文單字 2. 提取規格/色號詞組 3. 清理中文 4. 窮舉中文 N-gram 5. 去重和過濾
312
312
  * @param {string} sentence - 原始字串。
313
- * @param {number} [maxLength=50] - 允許的最大字串長度,預設為 30。
314
- * @returns {string[]} - 潛在關鍵字陣列(至少 2 個中文字)。
313
+ * @param {number} [maxLength=50] - 允許的最大字串長度。
314
+ * @param {number} [maxNgramLength=3] - N-gram 的最大長度,預設為 3。
315
+ * @returns {string[]} - 潛在關鍵字陣列(至少 2 個字/中文字)。
315
316
  */
316
317
  (0, _defineProperty2["default"])(this, "generateUniversalKeywords", function (sentence) {
317
318
  var maxLength = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 50;
319
+ var maxNgramLength = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 4;
318
320
  // 引入 Lodash,確保在執行環境中可用
319
- // 由於在瀏覽器環境中執行,我們假設 Lodash 已經全域引入或在 Node.js 環境中運行。
320
- // 在大多數現代前端框架中,這行可能需要根據實際模組系統調整(例如 import _ from 'lodash')。
321
321
  if (!sentence || typeof sentence !== "string") {
322
322
  return [];
323
323
  }
324
- var textToProcess = sentence;
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);
325
335
 
326
336
  // 警告/截斷邏輯
327
337
  if (textToProcess.length > maxLength) {
@@ -329,23 +339,40 @@ var Utiller = /*#__PURE__*/function () {
329
339
  textToProcess = textToProcess.substring(0, maxLength);
330
340
  }
331
341
 
332
- // 步驟 1: 清理和標準化
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
+
333
364
  var cleanText = textToProcess.toLowerCase();
334
365
 
335
- // 移除規格、數量和常見符號,然後移除通用詞
336
- cleanText = cleanText.replace(/[a-z0-9]+(w|led|uv|顆|組|片|入|ml|g|oz|號|色|\/|\-|\~|k)/g, " ") // 移除規格和數量 (新增了 k, 修正了 w)
337
- .replace(/[!@#$%^&*()_+={}\[\]:;"'<>,.?\/\\|`~]/g, " ") // 移除特殊符號
338
- .replace(/系列|一組|單色|多款|套組|全套|專用|迷你|頂級|高品質|超閃|奢華|最新|款式|新款|超亮|的|與|和|閃|美甲/g, " ") // 移除通用詞 (新增了 閃, 美甲)
339
- .replace(/\s+/g, "") // **移除所有空格**,確保中文句子連貫提取
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, "") // **移除所有空格**
340
371
  .trim();
341
- if (cleanText.length < 2) {
342
- return []; // 如果清理後長度不足,直接返回空陣列
343
- }
344
372
 
345
- // 步驟 2: 窮舉所有 >= 2 個字的 N-gram 詞組
346
- var keywords = [];
373
+ // --- 步驟 4: 窮舉所有 >= 2 個字的 N-gram 詞組 (針對純中文) ---
347
374
  var minLength = 2;
348
- var maxNgramLength = 3; // N-gram 最大長度
375
+ // maxNgramLength 現在是從參數傳入的
349
376
 
350
377
  for (var len = minLength; len <= maxNgramLength; len++) {
351
378
  for (var i = 0; i <= cleanText.length - len; i++) {
@@ -354,14 +381,12 @@ var Utiller = /*#__PURE__*/function () {
354
381
  }
355
382
  }
356
383
 
357
- // 步驟 3: 標準化、去重和過濾
358
- var finalKeywords = _lodash["default"].chain(keywords)
359
- // 確保只包含長度 >= 2 的詞
360
- .filter(function (k) {
384
+ // --- 步驟 5: 標準化、去重和過濾 ---
385
+ var finalKeywords = _lodash["default"].chain(keywords).filter(function (k) {
361
386
  return k.length >= 2;
362
- })
363
- // 去除重複
364
- .uniq().value();
387
+ }).filter(function (k) {
388
+ return k.length > 2 || !/^[\u4e00-\u9fa5a-z0-9]$/.test(k);
389
+ }).uniq().sortBy().value();
365
390
  return finalKeywords;
366
391
  });
367
392
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "utiller",
3
- "version": "1.0.382",
3
+ "version": "1.0.383",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -11,7 +11,7 @@
11
11
  "license": "ISC",
12
12
  "dependencies": {
13
13
  "configerer": "^1.0.23",
14
- "utiller": "^1.0.381",
14
+ "utiller": "^1.0.382",
15
15
  "linepayer": "^1.0.15",
16
16
  "databazer": "^1.0.17",
17
17
  "lodash": "^4.17.20",