pii-filter
Version:
118 lines • 5.21 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PhoneNumber = void 0;
const Parsing = __importStar(require("../../../core/parsing"));
const ds_phone_number_0_json_1 = __importDefault(require("../dataset/ds_phone_number_0.json"));
/**
* Checks wether a string is a valid phone number.
* @private
* @param phone_number the phone number
*/
function validate_phone_number(phone_number) {
return /^((00)?31)?((?!((00)?31))((0[1-9][0-9]{7,8})|([1-9][0-9]{7,8})))$/.test(phone_number.replace(/\D/g, ''));
}
/**
* Checks whether a phone number is a mobile number.
* @private
* @param phone_number the phone number string
*/
function is_06(phone_number) {
return /^((00)?31)?0?6/.test(phone_number.replace(/\D/g, ''));
}
/**
* A simple phone number classifier.
* @private
*/
class PhoneNumber extends Parsing.CoreAssociativeClassifier {
/**
* Creates a new Dutch phone number classifier.
*/
constructor() {
super(ds_phone_number_0_json_1.default);
/** @inheritdoc */
this.name = 'phone_number';
}
/** @inheritdoc */
classify_confidence(token) {
if (/^(\+|\(|0|6)/.test(token.symbol)) {
const min_number_length = 7;
const max_number_length = 15;
let has_numbers = /\d+/;
let has_letters = /[a-zA-Z]+/;
let has_symbols = /\-|\+|\(|\)/;
let deferred_text = '';
let number_value = '';
let total_num_length = 0;
let last_seen_number = null;
let [matched, [start_token, end_token, matches]] = Parsing.collect_tokens(token, (token, deferred_matches) => {
let token_symbol = token.symbol;
let token_is_space = token_symbol == ' ';
let token_has_symbol = has_symbols.test(token_symbol);
if (has_letters.test(token_symbol))
return Parsing.collect_tokens.Control.INVALID;
else if (has_numbers.test(token_symbol)) {
total_num_length += token_symbol.replace(/\D+/g, '').length;
if (total_num_length > max_number_length)
return Parsing.collect_tokens.Control.INVALID;
number_value += deferred_text + token_symbol;
deferred_text = '';
if (total_num_length > min_number_length) {
last_seen_number = token;
if (validate_phone_number(number_value))
return Parsing.collect_tokens.Control.MATCH_AND_CONTINUE;
}
return Parsing.collect_tokens.Control.VALID;
}
else if (token_has_symbol || token_is_space) {
if (deferred_matches.length == 5) //+31 - ( >^06)
return Parsing.collect_tokens.Control.INVALID;
deferred_text += token_symbol;
return Parsing.collect_tokens.Control.DEFER_VALID;
}
return Parsing.collect_tokens.Control.INVALID;
});
if (!matched || (last_seen_number != end_token && matches.length > 3)) // includes space
{
return [[], new Parsing.CoreClassificationScore(0.0, 0.0, this)];
}
else {
let is_06_number = is_06(number_value);
let score = (is_06_number ? 0.75 : 0.25);
let severity_sum = (is_06_number ? 0.35 : 0.25);
let assoc_sum = 0.0;
let [assoc_sum_, severity_sum_] = Parsing.calc_assoc_severity_sum(start_token, end_token, this, this.language_model, this.language_model.max_assoc_distance);
assoc_sum += assoc_sum_;
severity_sum += severity_sum_;
return [matches, new Parsing.CoreClassificationScore(Math.min(score + assoc_sum, 1.0), Math.min(severity_sum, 1.0), this)];
}
}
else {
return [[], new Parsing.CoreClassificationScore(0.0, 0.0, this)];
}
}
}
exports.PhoneNumber = PhoneNumber;
;
//# sourceMappingURL=phone-number.js.map