1 | import { SubSModuleTokenizer, ISubTokenizerCreate } from '../mod';
|
2 | import Segment, { IDICT, IWord, IDICT2 } from '../Segment';
|
3 | export declare const DEFAULT_MAX_CHUNK_COUNT = 40;
|
4 | export declare const DEFAULT_MAX_CHUNK_COUNT_MIN = 30;
|
5 | /**
|
6 | * 字典识别模块
|
7 | *
|
8 | * @author 老雷<leizongmin@gmail.com>
|
9 | */
|
10 | export declare class DictTokenizer extends SubSModuleTokenizer {
|
11 | /**
|
12 | * 防止因無分段導致分析過久甚至超過處理負荷
|
13 | * 越高越精準但是處理時間會加倍成長甚至超過記憶體能處理的程度
|
14 | *
|
15 | * 數字越小越快
|
16 | *
|
17 | * FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
|
18 | *
|
19 | * @type {number}
|
20 | */
|
21 | MAX_CHUNK_COUNT: number;
|
22 | /**
|
23 | *
|
24 | * 追加新模式使 MAX_CHUNK_COUNT 遞減來防止無分段長段落的總處理次數過高 由 DEFAULT_MAX_CHUNK_COUNT_MIN 來限制最小值
|
25 | */
|
26 | DEFAULT_MAX_CHUNK_COUNT_MIN: number;
|
27 | protected _TABLE: IDICT<IWord>;
|
28 | protected _TABLE2: IDICT2<IWord>;
|
29 | _cache(): void;
|
30 | /**
|
31 | * 对未识别的单词进行分词
|
32 | *
|
33 | * @param {array} words 单词数组
|
34 | * @return {array}
|
35 | */
|
36 | split(words: IWord[]): IWord[];
|
37 | /**
|
38 | * 匹配单词,返回相关信息
|
39 | *
|
40 | * @param {string} text 文本
|
41 | * @param {int} cur 开始位置
|
42 | * @param {object} preword 上一个单词
|
43 | * @return {array} 返回格式 {w: '单词', c: 开始位置}
|
44 | */
|
45 | protected matchWord(text: string, cur: number, preword: IWord): Segment.IWord[];
|
46 | /**
|
47 | * 选择最有可能匹配的单词
|
48 | *
|
49 | * @param {array} words 单词信息数组
|
50 | * @param {object} preword 上一个单词
|
51 | * @param {string} text 本节要分词的文本
|
52 | * @return {array}
|
53 | */
|
54 | protected filterWord(words: IWord[], preword: IWord, text: string): Segment.IWord[];
|
55 | /**
|
56 | * 评价排名
|
57 | *
|
58 | * @param {object} assess
|
59 | * @return {object}
|
60 | */
|
61 | getTops(assess: Array<IAssessRow>): number;
|
62 | /**
|
63 | * 将单词按照位置排列
|
64 | *
|
65 | * @param {array} words
|
66 | * @param {string} text
|
67 | * @return {object}
|
68 | */
|
69 | getPosInfo(words: IWord[], text: string): {
|
70 | [index: number]: IWord[];
|
71 | };
|
72 | /**
|
73 | * 取所有分支
|
74 | *
|
75 | * @param {{[p: number]: Segment.IWord[]}} wordpos
|
76 | * @param {number} pos 当前位置
|
77 | * @param {string} text 本节要分词的文本
|
78 | * @param {number} total_count
|
79 | * @returns {Segment.IWord[][]}
|
80 | */
|
81 | getChunks(wordpos: {
|
82 | [index: number]: IWord[];
|
83 | }, pos: number, text?: string, total_count?: number, MAX_CHUNK_COUNT?: number): IWord[][];
|
84 | }
|
85 | export declare namespace DictTokenizer {
|
86 | /**
|
87 | * 使用类似于MMSG的分词算法
|
88 | * 找出所有分词可能,主要根据一下几项来评价:
|
89 | *
|
90 | * x、词数量最少;
|
91 | * a、词平均频率最大;
|
92 | * b、每个词长度标准差最小;
|
93 | * c、未识别词最少;
|
94 | * d、符合语法结构项:如两个连续的动词减分,数词后面跟量词加分;
|
95 | *
|
96 | * 取以上几项综合排名最最好的
|
97 | */
|
98 | type IAssessRow = {
|
99 | /**
|
100 | * 词数量,越小越好
|
101 | */
|
102 | x: number;
|
103 | /**
|
104 | * 词总频率,越大越好
|
105 | */
|
106 | a: number;
|
107 | /**
|
108 | * 词标准差,越小越好
|
109 | * 每个词长度标准差最小
|
110 | */
|
111 | b: number;
|
112 | /**
|
113 | * 未识别词,越小越好
|
114 | */
|
115 | c: number;
|
116 | /**
|
117 | * 符合语法结构程度,越大越好
|
118 | * 符合语法结构项:如两个连续的动词减分,数词后面跟量词加分
|
119 | */
|
120 | d: number;
|
121 | /**
|
122 | * 結算評分(自動計算)
|
123 | */
|
124 | score?: number;
|
125 | readonly index?: number;
|
126 | };
|
127 | }
|
128 | export import IAssessRow = DictTokenizer.IAssessRow;
|
129 | export declare const init: ISubTokenizerCreate<DictTokenizer, SubSModuleTokenizer>;
|
130 | export default DictTokenizer;
|