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
JavaScript
;
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;