UNPKG

kusamoji

Version:

Japanese morphological analyzer for Node.js — Viterbi tokenizer with mmap dict loading and pluggable POS-source strategy

94 lines (82 loc) 2.72 kB
"use strict"; let ByteBuffer = require("../util/ByteBuffer"); let CharacterClass = require("./CharacterClass"); /** * InvokeDefinitionMap represents invoke definition a part of char.def * @constructor */ function InvokeDefinitionMap() { this.map = []; this.lookup_table = {}; // Just for building dictionary } /** * Load InvokeDefinitionMap from buffer * @param {Uint8Array} invoke_def_buffer * @returns {InvokeDefinitionMap} */ InvokeDefinitionMap.load = function (invoke_def_buffer) { let invoke_def = new InvokeDefinitionMap(); let character_category_definition = []; let buffer = new ByteBuffer(invoke_def_buffer); while (buffer.position + 1 < buffer.size()) { let class_id = character_category_definition.length; let is_always_invoke = buffer.get(); let is_grouping = buffer.get(); let max_length = buffer.getInt(); let class_name = buffer.getString(); character_category_definition.push(new CharacterClass(class_id, class_name, is_always_invoke, is_grouping, max_length)); } invoke_def.init(character_category_definition); return invoke_def; }; /** * Initializing method * @param {Array.<CharacterClass>} character_category_definition Array of CharacterClass */ InvokeDefinitionMap.prototype.init = function (character_category_definition) { if (character_category_definition == null) { return; } for (let i = 0; i < character_category_definition.length; i++) { let character_class = character_category_definition[i]; this.map[i] = character_class; this.lookup_table[character_class.class_name] = i; } }; /** * Get class information by class ID * @param {number} class_id * @returns {CharacterClass} */ InvokeDefinitionMap.prototype.getCharacterClass = function (class_id) { return this.map[class_id]; }; /** * For building character definition dictionary * @param {string} class_name character * @returns {number} class_id */ InvokeDefinitionMap.prototype.lookup = function (class_name) { let class_id = this.lookup_table[class_name]; if (class_id == null) { return null; } return class_id; }; /** * Transform from map to binary buffer * @returns {Uint8Array} */ InvokeDefinitionMap.prototype.toBuffer = function () { let buffer = new ByteBuffer(); for (let i = 0; i < this.map.length; i++) { let char_class = this.map[i]; buffer.put(char_class.is_always_invoke); buffer.put(char_class.is_grouping); buffer.putInt(char_class.max_length); buffer.putString(char_class.class_name); } buffer.shrink(); return buffer.buffer; }; module.exports = InvokeDefinitionMap;