@natlibfi/melinda-record-matching 5.1.2-alpha.1 → 5.1.2
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.
|
@@ -19,7 +19,7 @@ export default () => ({
|
|
|
19
19
|
return result;
|
|
20
20
|
}
|
|
21
21
|
const a = field.subfields.find((sf) => sf.code === "a");
|
|
22
|
-
if (!a || !a.value) {
|
|
22
|
+
if (!a || !a.value || !a.value.match(/[0-9]/u)) {
|
|
23
23
|
return fieldsToPublisherNumber(remainingFields, result);
|
|
24
24
|
}
|
|
25
25
|
const aval = normalizePublisherNumber(`${a.value}`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/match-detection/features/bib/publisherNumber.js"],
|
|
4
|
-
"sourcesContent": ["// Compare publusher number (028$b$a or 028$a)\nimport {uniqArray} from '@natlibfi/marc-record-validators-melinda/dist/utils.js';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/melinda-record-matching:match-detection:features:publisher-number');\nconst debugData = debug.extend('data');\n\nexport default () => ({\n name: 'Publisher or Distributor Number',\n extract: ({record/*, recordExternal*/}) => {\n //const label = recordExternal && recordExternal.label ? recordExternal.label : 'record';\n\n return getIdentifiers();\n\n function getIdentifiers() {\n const values = fieldsToPublisherNumber(record.get(/^028$/u));\n\n debug(`\\t ${values.length} potential publisher identifiers: ${values.join(', ')}`);\n\n return uniqArray(values);\n\n function fieldsToPublisherNumber(fields, result = []) {\n const [field, ...remainingFields] = fields;\n if (!field) {\n return result;\n }\n const a = field.subfields.find(sf => sf.code === 'a');\n if (!a || !a.value) {\n return fieldsToPublisherNumber(remainingFields, result);\n }\n const aval = normalizePublisherNumber(`${a.value}`);\n\n const b = field.subfields.find(sf => sf.code === 'b');\n if (!b || !b.value) {\n return fieldsToPublisherNumber(remainingFields, [...result, aval]);\n }\n const baval = normalizePublisherNumber(`${b.value}${a.value}`);\n return fieldsToPublisherNumber(remainingFields, [...result, baval, aval]);\n }\n\n function normalizePublisherNumber(val) {\n return val.replace(/[- .,:;]/ug, '');\n }\n }\n },\n compare: (aa, bb) => {\n debugData(`Comparing identifier sets ${JSON.stringify(aa)} and ${JSON.stringify(bb)}`);\n if (aa.length === 0 || bb.length === 0) {\n // No data for decision\n return 0;\n }\n const sharedIdentifiers = aa.filter(val => bb.includes(val));\n if (sharedIdentifiers.length > 0) {\n const goodMatch = sharedIdentifiers.find(identifier => identifier.match(/[^0-9]/u));\n if (goodMatch) {\n debug(`\\tShared identifier found: '${goodMatch}'`);\n return 0.5;\n }\n debug(`\\tShared identifier (numbers only) found: '${sharedIdentifiers[0]}'`);\n return 0.2;\n }\n\n const aa2 = aa.map(a => a.replace(/[^0-9]/ug, ''));\n const bb2 = bb.map(b => b.replace(/[^0-9]/ug, ''));\n\n // Numbers matches (aka don't penalize \"Fazer F-123\" vs \"F-123\")\n // Note that FOOLP-123 vs FOOCD-123 will now also return 0.0. Still nothing positive is returned, so no damage done.\n if (aa2.find(val => val !== '' && bb2.includes(val))) {\n return 0.0;\n }\n\n return -0.2;\n\n }\n});\n\n"],
|
|
5
|
-
"mappings": "AACA,SAAQ,iBAAgB;AACxB,OAAO,uBAAuB;AAE9B,MAAM,QAAQ,kBAAkB,6EAA6E;AAC7G,MAAM,YAAY,MAAM,OAAO,MAAM;AAErC,eAAe,OAAO;AAAA,EACpB,MAAM;AAAA,EACN,SAAS,CAAC;AAAA,IAAC;AAAA;AAAA,EAA0B,MAAM;AAGzC,WAAO,eAAe;AAEtB,aAAS,iBAAiB;AACxB,YAAM,SAAS,wBAAwB,OAAO,IAAI,QAAQ,CAAC;AAE3D,YAAM,KAAM,OAAO,MAAM,qCAAqC,OAAO,KAAK,IAAI,CAAC,EAAE;AAEjF,aAAO,UAAU,MAAM;AAEvB,eAAS,wBAAwB,QAAQ,SAAS,CAAC,GAAG;AACpD,cAAM,CAAC,OAAO,GAAG,eAAe,IAAI;AACpC,YAAI,CAAC,OAAO;AACV,iBAAO;AAAA,QACT;AACA,cAAM,IAAI,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,GAAG;
|
|
4
|
+
"sourcesContent": ["// Compare publusher number (028$b$a or 028$a)\nimport {uniqArray} from '@natlibfi/marc-record-validators-melinda/dist/utils.js';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/melinda-record-matching:match-detection:features:publisher-number');\nconst debugData = debug.extend('data');\n\nexport default () => ({\n name: 'Publisher or Distributor Number',\n extract: ({record/*, recordExternal*/}) => {\n //const label = recordExternal && recordExternal.label ? recordExternal.label : 'record';\n\n return getIdentifiers();\n\n function getIdentifiers() {\n const values = fieldsToPublisherNumber(record.get(/^028$/u));\n\n debug(`\\t ${values.length} potential publisher identifiers: ${values.join(', ')}`);\n\n return uniqArray(values);\n\n function fieldsToPublisherNumber(fields, result = []) {\n const [field, ...remainingFields] = fields;\n if (!field) {\n return result;\n }\n const a = field.subfields.find(sf => sf.code === 'a');\n // NB! Publisher number must contain a digit! :-)\n if (!a || !a.value || !a.value.match(/[0-9]/u)) {\n return fieldsToPublisherNumber(remainingFields, result);\n }\n const aval = normalizePublisherNumber(`${a.value}`);\n\n const b = field.subfields.find(sf => sf.code === 'b');\n if (!b || !b.value) {\n return fieldsToPublisherNumber(remainingFields, [...result, aval]);\n }\n const baval = normalizePublisherNumber(`${b.value}${a.value}`);\n return fieldsToPublisherNumber(remainingFields, [...result, baval, aval]);\n }\n\n function normalizePublisherNumber(val) {\n return val.replace(/[- .,:;]/ug, '');\n }\n }\n },\n compare: (aa, bb) => {\n debugData(`Comparing identifier sets ${JSON.stringify(aa)} and ${JSON.stringify(bb)}`);\n if (aa.length === 0 || bb.length === 0) {\n // No data for decision\n return 0;\n }\n const sharedIdentifiers = aa.filter(val => bb.includes(val));\n if (sharedIdentifiers.length > 0) {\n const goodMatch = sharedIdentifiers.find(identifier => identifier.match(/[^0-9]/u));\n if (goodMatch) {\n debug(`\\tShared identifier found: '${goodMatch}'`);\n return 0.5;\n }\n debug(`\\tShared identifier (numbers only) found: '${sharedIdentifiers[0]}'`);\n return 0.2;\n }\n\n const aa2 = aa.map(a => a.replace(/[^0-9]/ug, ''));\n const bb2 = bb.map(b => b.replace(/[^0-9]/ug, ''));\n\n // Numbers matches (aka don't penalize \"Fazer F-123\" vs \"F-123\")\n // Note that FOOLP-123 vs FOOCD-123 will now also return 0.0. Still nothing positive is returned, so no damage done.\n if (aa2.find(val => val !== '' && bb2.includes(val))) {\n return 0.0;\n }\n\n return -0.2;\n\n }\n});\n\n"],
|
|
5
|
+
"mappings": "AACA,SAAQ,iBAAgB;AACxB,OAAO,uBAAuB;AAE9B,MAAM,QAAQ,kBAAkB,6EAA6E;AAC7G,MAAM,YAAY,MAAM,OAAO,MAAM;AAErC,eAAe,OAAO;AAAA,EACpB,MAAM;AAAA,EACN,SAAS,CAAC;AAAA,IAAC;AAAA;AAAA,EAA0B,MAAM;AAGzC,WAAO,eAAe;AAEtB,aAAS,iBAAiB;AACxB,YAAM,SAAS,wBAAwB,OAAO,IAAI,QAAQ,CAAC;AAE3D,YAAM,KAAM,OAAO,MAAM,qCAAqC,OAAO,KAAK,IAAI,CAAC,EAAE;AAEjF,aAAO,UAAU,MAAM;AAEvB,eAAS,wBAAwB,QAAQ,SAAS,CAAC,GAAG;AACpD,cAAM,CAAC,OAAO,GAAG,eAAe,IAAI;AACpC,YAAI,CAAC,OAAO;AACV,iBAAO;AAAA,QACT;AACA,cAAM,IAAI,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,GAAG;AAEpD,YAAI,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,MAAM,QAAQ,GAAG;AAC9C,iBAAO,wBAAwB,iBAAiB,MAAM;AAAA,QACxD;AACA,cAAM,OAAO,yBAAyB,GAAG,EAAE,KAAK,EAAE;AAElD,cAAM,IAAI,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,GAAG;AACpD,YAAI,CAAC,KAAK,CAAC,EAAE,OAAO;AAClB,iBAAO,wBAAwB,iBAAiB,CAAC,GAAG,QAAQ,IAAI,CAAC;AAAA,QACnE;AACA,cAAM,QAAQ,yBAAyB,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,EAAE;AAC7D,eAAO,wBAAwB,iBAAiB,CAAC,GAAG,QAAQ,OAAO,IAAI,CAAC;AAAA,MAC1E;AAEA,eAAS,yBAAyB,KAAK;AACrC,eAAO,IAAI,QAAQ,cAAc,EAAE;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAS,CAAC,IAAI,OAAO;AACnB,cAAU,6BAA6B,KAAK,UAAU,EAAE,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC,EAAE;AACrF,QAAI,GAAG,WAAW,KAAK,GAAG,WAAW,GAAG;AAEtC,aAAO;AAAA,IACT;AACA,UAAM,oBAAoB,GAAG,OAAO,SAAO,GAAG,SAAS,GAAG,CAAC;AAC3D,QAAI,kBAAkB,SAAS,GAAG;AAChC,YAAM,YAAY,kBAAkB,KAAK,gBAAc,WAAW,MAAM,SAAS,CAAC;AAClF,UAAI,WAAW;AACb,cAAM,8BAA+B,SAAS,GAAG;AACjD,eAAO;AAAA,MACT;AACA,YAAM,6CAA8C,kBAAkB,CAAC,CAAC,GAAG;AAC3E,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,GAAG,IAAI,OAAK,EAAE,QAAQ,YAAY,EAAE,CAAC;AACjD,UAAM,MAAM,GAAG,IAAI,OAAK,EAAE,QAAQ,YAAY,EAAE,CAAC;AAIjD,QAAI,IAAI,KAAK,SAAO,QAAQ,MAAM,IAAI,SAAS,GAAG,CAAC,GAAG;AACpD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EAET;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -25,7 +25,8 @@ export default () => ({
|
|
|
25
25
|
return result;
|
|
26
26
|
}
|
|
27
27
|
const a = field.subfields.find(sf => sf.code === 'a');
|
|
28
|
-
|
|
28
|
+
// NB! Publisher number must contain a digit! :-)
|
|
29
|
+
if (!a || !a.value || !a.value.match(/[0-9]/u)) {
|
|
29
30
|
return fieldsToPublisherNumber(remainingFields, result);
|
|
30
31
|
}
|
|
31
32
|
const aval = normalizePublisherNumber(`${a.value}`);
|