UNPKG

14.3 kBJavaScriptView Raw
1'use strict';
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.init = exports.ChsNameTokenizer = void 0;
4/**
5 * 中文人名识别模块
6 *
7 * @author 老雷<leizongmin@gmail.com>
8 */
9const CHS_NAMES_1 = require("../mod/CHS_NAMES");
10const mod_1 = require("../mod");
11class ChsNameTokenizer extends mod_1.SubSModuleTokenizer {
12 constructor() {
13 super(...arguments);
14 this.name = 'ChsNameTokenizer';
15 }
16 _cache() {
17 super._cache();
18 this._TABLE = this.segment.getDict('TABLE');
19 this._POSTAG = this.segment.POSTAG;
20 }
21 /**
22 * 对未识别的单词进行分词
23 *
24 * @param {array} words 单词数组
25 * @return {array}
26 */
27 split(words) {
28 const POSTAG = this._POSTAG;
29 let ret = [];
30 for (let i = 0, word; word = words[i]; i++) {
31 if (word.p) {
32 // 仅对未识别的词进行匹配
33 ret.push(word);
34 continue;
35 }
36 let nameinfo = this.matchName(word.w);
37 if (nameinfo.length < 1) {
38 ret.push(word);
39 continue;
40 }
41 // 分离出人名
42 let lastc = 0;
43 for (let ui = 0, url; url = nameinfo[ui]; ui++) {
44 if (url.c > lastc) {
45 ret.push(this.debugToken({
46 w: word.w.substr(lastc, url.c - lastc),
47 }, {
48 [this.name]: false,
49 }, true));
50 }
51 ret.push(this.debugToken({
52 w: url.w,
53 p: POSTAG.A_NR
54 }, {
55 [this.name]: true,
56 }, true));
57 lastc = url.c + url.w.length;
58 }
59 let lastn = nameinfo[nameinfo.length - 1];
60 if (lastn.c + lastn.w.length < word.w.length) {
61 ret.push(this.debugToken({
62 w: word.w.substr(lastn.c + lastn.w.length),
63 }, {
64 [this.name]: false,
65 }, true));
66 }
67 }
68 return ret;
69 }
70 /**
71 * 匹配包含的人名,并返回相关信息
72 *
73 * @param {string} text 文本
74 * @param {int} cur 开始位置
75 * @return {array} 返回格式 {w: '人名', c: 开始位置}
76 */
77 matchName(text, cur = 0) {
78 if (isNaN(cur))
79 cur = 0;
80 let ret = [];
81 while (cur < text.length) {
82 //debug('cur=' + cur + ', ' + text.charAt(cur));
83 let name = null;
84 // 复姓
85 let f2 = text.substr(cur, 2);
86 if (f2 in CHS_NAMES_1.FAMILY_NAME_2) {
87 let n1 = text.charAt(cur + 2);
88 let n2 = text.charAt(cur + 3);
89 if (n1 in CHS_NAMES_1.DOUBLE_NAME_1 && n2 in CHS_NAMES_1.DOUBLE_NAME_2) {
90 name = f2 + n1 + n2;
91 }
92 else if (n1 in CHS_NAMES_1.SINGLE_NAME) {
93 name = f2 + n1 + (n1 == n2 ? n2 : '');
94 }
95 }
96 // 单姓
97 let f1 = text.charAt(cur);
98 if (name === null && f1 in CHS_NAMES_1.FAMILY_NAME_1) {
99 let n1 = text.charAt(cur + 1);
100 let n2 = text.charAt(cur + 2);
101 if (n1 in CHS_NAMES_1.DOUBLE_NAME_1 && n2 in CHS_NAMES_1.DOUBLE_NAME_2) {
102 name = f1 + n1 + n2;
103 }
104 else if (n1 in CHS_NAMES_1.SINGLE_NAME) {
105 name = f1 + n1 + (n1 == n2 ? n2 : '');
106 }
107 }
108 // 检查是否匹配成功
109 if (name === null) {
110 cur++;
111 }
112 else {
113 ret.push({ w: name, c: cur });
114 cur += name.length;
115 }
116 }
117 return ret;
118 }
119}
120exports.ChsNameTokenizer = ChsNameTokenizer;
121// ======================================================================
122// debug(matchName('刘德华和李娜娜、司马光、上官飞飞'));
123// debug(matchName('李克'));
124exports.init = ChsNameTokenizer.init.bind(ChsNameTokenizer);
125exports.default = ChsNameTokenizer;
126//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2hzTmFtZVRva2VuaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkNoc05hbWVUb2tlbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7QUFFYjs7OztHQUlHO0FBRUgsZ0RBQXNIO0FBRXRILGdDQUF5RDtBQUt6RCxNQUFhLGdCQUFpQixTQUFRLHlCQUFtQjtJQUF6RDs7UUFLQyxTQUFJLEdBQUcsa0JBQWtCLENBQUM7SUErSDNCLENBQUM7SUE3SEEsTUFBTTtRQUVMLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUVmLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsS0FBYztRQUVuQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzVCLElBQUksR0FBRyxHQUFZLEVBQUUsQ0FBQztRQUV0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFDMUM7WUFDQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQ1Y7Z0JBQ0MsY0FBYztnQkFDZCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNmLFNBQVM7YUFDVDtZQUNELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ3ZCO2dCQUNDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2YsU0FBUzthQUNUO1lBQ0QsUUFBUTtZ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dXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiDkuK3mlofkurrlkI3or4bliKvmqKHlnZdcbiAqXG4gKiBAYXV0aG9yIOiAgembtzxsZWl6b25nbWluQGdtYWlsLmNvbT5cbiAqL1xuXG5pbXBvcnQgQ0hTX05BTUVTLCB7IEZBTUlMWV9OQU1FXzEsIEZBTUlMWV9OQU1FXzIsIFNJTkdMRV9OQU1FLCBET1VCTEVfTkFNRV8xLCBET1VCTEVfTkFNRV8yIH0gZnJvbSAnLi4vbW9kL0NIU19OQU1FUyc7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgU3ViU01vZHVsZSwgU3ViU01vZHVsZVRva2VuaXplciB9IGZyb20gJy4uL21vZCc7XG5pbXBvcnQgeyBTZWdtZW50LCBJV29yZCwgSURJQ1QsIElESUNUX1NZTk9OWU0gfSBmcm9tICcuLi9TZWdtZW50Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFVTdHJpbmcgfSBmcm9tICd1bmktc3RyaW5nJztcblxuZXhwb3J0IGNsYXNzIENoc05hbWVUb2tlbml6ZXIgZXh0ZW5kcyBTdWJTTW9kdWxlVG9rZW5pemVyXG57XG5cblx0cHJvdGVjdGVkIF9UQUJMRTogSURJQ1Q8SVdvcmQ+O1xuXG5cdG5hbWUgPSAnQ2hzTmFtZVRva2VuaXplcic7XG5cblx0X2NhY2hlKClcblx0e1xuXHRcdHN1cGVyLl9jYWNoZSgpO1xuXG5cdFx0dGhpcy5fVEFCTEUgPSB0aGlzLnNlZ21lbnQuZ2V0RGljdCgnVEFCTEUnKTtcblx0XHR0aGlzLl9QT1NUQUcgPSB0aGlzLnNlZ21lbnQuUE9TVEFHO1xuXHR9XG5cblx0LyoqXG5cdCAqIOWvueacquivhuWIq+eahOWNleivjei/m+ihjOWIhuivjVxuXHQgKlxuXHQgKiBAcGFyYW0ge2FycmF5fSB3b3JkcyDljZXor43mlbDnu4Rcblx0ICogQHJldHVybiB7YXJyYXl9XG5cdCAqL1xuXHRzcGxpdCh3b3JkczogSVdvcmRbXSk6IElXb3JkW11cblx0e1xuXHRcdGNvbnN0IFBPU1RBRyA9IHRoaXMuX1BPU1RBRztcblx0XHRsZXQgcmV0OiBJV29yZFtdID0gW107XG5cblx0XHRmb3IgKGxldCBpID0gMCwgd29yZDsgd29yZCA9IHdvcmRzW2ldOyBpKyspXG5cdFx0e1xuXHRcdFx0aWYgKHdvcmQucClcblx0XHRcdHtcblx0XHRcdFx0Ly8g5LuF5a+55pyq6K+G5Yir55qE6K+N6L+b6KGM5Yy56YWNXG5cdFx0XHRcdHJldC5wdXNoKHdvcmQpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblx0XHRcdGxldCBuYW1laW5mbyA9IHRoaXMubWF0Y2hOYW1lKHdvcmQudyk7XG5cdFx0XHRpZiAobmFtZWluZm8ubGVuZ3RoIDwgMSlcblx0XHRcdHtcblx0XHRcdFx0cmV0LnB1c2god29yZCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Ly8g5YiG56a75Ye65Lq65ZCNXG5cdFx0XHRsZXQgbGFzdGMgPSAwO1xuXHRcdFx0Zm9yIChsZXQgdWkgPSAwLCB1cmw7IHVybCA9IG5hbWVpbmZvW3VpXTsgdWkrKylcblx0XHRcdHtcblx0XHRcdFx0aWYgKHVybC5jID4gbGFzdGMpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRyZXQucHVzaCh0aGlzLmRlYnVnVG9rZW4oe1xuXHRcdFx0XHRcdFx0dzogd29yZC53LnN1YnN0cihsYXN0YywgdXJsLmMgLSBsYXN0YyksXG5cdFx0XHRcdFx0fSwge1xuXHRcdFx0XHRcdFx0W3RoaXMubmFtZV06IGZhbHNlLFxuXHRcdFx0XHRcdH0sIHRydWUpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldC5wdXNoKHRoaXMuZGVidWdUb2tlbih7XG5cdFx0XHRcdFx0dzogdXJsLncsXG5cdFx0XHRcdFx0cDogUE9TVEFHLkFfTlJcblx0XHRcdFx0fSwge1xuXHRcdFx0XHRcdFt0aGlzLm5hbWVdOiB0cnVlLFxuXHRcdFx0XHR9LCB0cnVlKSk7XG5cdFx0XHRcdGxhc3RjID0gdXJsLmMgKyB1cmwudy5sZW5ndGg7XG5cdFx0XHR9XG5cdFx0XHRsZXQgbGFzdG4gPSBuYW1laW5mb1tuYW1laW5mby5sZW5ndGggLSAxXTtcblx0XHRcdGlmIChsYXN0bi5jICsgbGFzdG4udy5sZW5ndGggPCB3b3JkLncubGVuZ3RoKVxuXHRcdFx0e1xuXHRcdFx0XHRyZXQucHVzaCh0aGlzLmRlYnVnVG9rZW4oe1xuXHRcdFx0XHRcdHc6IHdvcmQudy5zdWJzdHIobGFzdG4uYyArIGxhc3RuLncubGVuZ3RoKSxcblx0XHRcdFx0fSwge1xuXHRcdFx0XHRcdFt0aGlzLm5hbWVdOiBmYWxzZSxcblx0XHRcdFx0fSwgdHJ1ZSkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9XG5cblx0LyoqXG5cdCAqIOWMuemFjeWMheWQq+eahOS6uuWQje+8jOW5tui/lOWbnuebuOWFs+S/oeaBr1xuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCDmlofmnKxcblx0ICogQHBhcmFtIHtpbnR9IGN1ciDlvIDlp4vkvY3nva5cblx0ICogQHJldHVybiB7YXJyYXl9ICDov5Tlm57moLzlvI8gICB7dzogJ+S6uuWQjScsIGM6IOW8gOWni+S9jee9rn1cblx0ICovXG5cdG1hdGNoTmFtZSh0ZXh0OiBzdHJpbmcsIGN1cjogbnVtYmVyID0gMCk6IElXb3JkW11cblx0e1xuXHRcdGlmIChpc05hTihjdXIpKSBjdXIgPSAwO1xuXHRcdGxldCByZXQ6IElXb3JkW10gPSBbXTtcblx0XHR3aGlsZSAoY3VyIDwgdGV4dC5sZW5ndGgpXG5cdFx0e1xuXHRcdFx0Ly9kZWJ1ZygnY3VyPScgKyBjdXIgKyAnLCAnICsgdGV4dC5jaGFyQXQoY3VyKSk7XG5cdFx0XHRsZXQgbmFtZTogc3RyaW5nID0gbnVsbDtcblx0XHRcdC8vIOWkjeWnk1xuXHRcdFx0bGV0IGYyID0gdGV4dC5zdWJzdHIoY3VyLCAyKTtcblx0XHRcdGlmIChmMiBpbiBGQU1JTFlfTkFNRV8yKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgbjEgPSB0ZXh0LmNoYXJBdChjdXIgKyAyKTtcblx0XHRcdFx0bGV0IG4yID0gdGV4dC5jaGFyQXQoY3VyICsgMyk7XG5cdFx0XHRcdGlmIChuMSBpbiBET1VCTEVfTkFNRV8xICYmIG4yIGluIERPVUJMRV9OQU1FXzIpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRuYW1lID0gZjIgKyBuMSArIG4yO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKG4xIGluIFNJTkdMRV9OQU1FKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZSA9IGYyICsgbjEgKyAobjEgPT0gbjIgPyBuMiA6ICcnKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8g5Y2V5aeTXG5cdFx0XHRsZXQgZjEgPSB0ZXh0LmNoYXJBdChjdXIpO1xuXHRcdFx0aWYgKG5hbWUgPT09IG51bGwgJiYgZjEgaW4gRkFNSUxZX05BTUVfMSlcblx0XHRcdHtcblx0XHRcdFx0bGV0IG4xID0gdGV4dC5jaGFyQXQoY3VyICsgMSk7XG5cdFx0XHRcdGxldCBuMiA9IHRleHQuY2hhckF0KGN1ciArIDIpO1xuXHRcdFx0XHRpZiAobjEgaW4gRE9VQkxFX05BTUVfMSAmJiBuMiBpbiBET1VCTEVfTkFNRV8yKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0bmFtZSA9IGYxICsgbjEgKyBuMjtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmIChuMSBpbiBTSU5HTEVfTkFNRSlcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG5hbWUgPSBmMSArIG4xICsgKG4xID09IG4yID8gbjIgOiAnJyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIOajgOafpeaYr+WQpuWMuemFjeaIkOWKn1xuXHRcdFx0aWYgKG5hbWUgPT09IG51bGwpXG5cdFx0XHR7XG5cdFx0XHRcdGN1cisrO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0e1xuXHRcdFx0XHRyZXQucHVzaCh7IHc6IG5hbWUsIGM6IGN1ciB9KTtcblx0XHRcdFx0Y3VyICs9IG5hbWUubGVuZ3RoO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmV0O1xuXHR9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8gZGVidWcobWF0Y2hOYW1lKCfliJjlvrfljY7lkozmnY7lqJzlqJzjgIHlj7jpqazlhYnjgIHkuIrlrpjpo57po54nKSk7XG4vLyBkZWJ1ZyhtYXRjaE5hbWUoJ+adjuWFiycpKTtcblxuZXhwb3J0IGNvbnN0IGluaXQgPSBDaHNOYW1lVG9rZW5pemVyLmluaXQuYmluZChDaHNOYW1lVG9rZW5pemVyKSBhcyB0eXBlb2YgQ2hzTmFtZVRva2VuaXplci5pbml0O1xuXG5leHBvcnQgZGVmYXVsdCBDaHNOYW1lVG9rZW5pemVyO1xuIl19
\No newline at end of file