1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.init = exports.ChsNameTokenizer = void 0;
|
4 | /**
|
5 | * 中文人名识别模块
|
6 | *
|
7 | * @author 老雷<leizongmin@gmail.com>
|
8 | */
|
9 | const CHS_NAMES_1 = require("../mod/CHS_NAMES");
|
10 | const mod_1 = require("../mod");
|
11 | class 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 | }
|
120 | exports.ChsNameTokenizer = ChsNameTokenizer;
|
121 | // ======================================================================
|
122 | // debug(matchName('刘德华和李娜娜、司马光、上官飞飞'));
|
123 | // debug(matchName('李克'));
|
124 | exports.init = ChsNameTokenizer.init.bind(ChsNameTokenizer);
|
125 | exports.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 |