segment
Version:
Chinese word segmentation 中文分词模块
111 lines (101 loc) • 2.77 kB
JavaScript
;
/**
* 外文字符、数字识别模块
*
* @author 老雷<leizongmin@gmail.com>
*/
var debug = console.log;
/** 模块类型 */
exports.type = 'tokenizer';
/**
* 模块初始化
*
* @param {Segment} segment 分词接口
*/
exports.init = function (segment) {
exports.segment = segment;
};
/**
* 对未识别的单词进行分词
*
* @param {array} words 单词数组
* @return {array}
*/
exports.split = function (words) {
var POSTAG = exports.segment.POSTAG;
var ret = [];
for (var i = 0, word; word = words[i]; i++) {
if (word.p) {
ret.push(word);
} else {
// 仅对未识别的词进行匹配
ret = ret.concat(splitForeign(word.w));
}
}
return ret;
};
// =================================================================
/**
* 匹配包含的英文字符和数字,并分割
*
* @param {string} text 文本
* @param {int} cur 开始位置
* @return {array} 返回格式 {w: '单词', c: 开始位置}
*/
var splitForeign = function (text, cur) {
var POSTAG = exports.segment.POSTAG;
if (isNaN(cur)) cur = 0;
var ret = [];
// 取第一个字符的ASCII码
var lastcur = 0;
var lasttype = 0;
var c = text.charCodeAt(0);
// 全角数字或字母
if (c >= 65296 && c <= 65370) c -= 65248;
// 数字 lasttype = POSTAG.A_M
if (c >= 48 && c <= 57) lasttype = POSTAG.A_M;
// 字母 lasttype = POSTAG.A_NX
else if ((c >= 65 && c <= 90) || (c >= 97 && c <= 122)) lasttype = POSTAG.A_NX;
else lasttype = POSTAG.UNK;
for (var i = 1; i < text.length; i++) {
var c = text.charCodeAt(i);
// 全角数字或字母
if (c >= 65296 && c <= 65370) c -= 65248;
// 数字 lasttype = POSTAG.A_M
if (c >= 48 && c <= 57) {
if (lasttype !== POSTAG.A_M) {
var nw = {w: text.substr(lastcur, i - lastcur)};
if (lasttype !== POSTAG.UNK) nw.p = lasttype;
ret.push(nw);
lastcur = i;
}
lasttype = POSTAG.A_M;
} else if ((c >= 65 && c <= 90) || (c >= 97 && c <= 122)) {
// 字母 lasttype = POSTAG.A_NX
if (lasttype !== POSTAG.A_NX) {
var nw = {w: text.substr(lastcur, i - lastcur)};
if (lasttype !== POSTAG.UNK) nw.p = lasttype;
ret.push(nw);
lastcur = i;
}
lasttype = POSTAG.A_NX;
} else {
// 其他
if (lasttype !== POSTAG.UNK) {
ret.push({
w: text.substr(lastcur, i - lastcur),
p: [lasttype]
});
lastcur = i;
}
lasttype = POSTAG.UNK;
}
}
// 剩余部分
var nw = {w: text.substr(lastcur, i - lastcur)};
if (lasttype !== POSTAG.UNK) nw.p = lasttype;
ret.push(nw);
// debug(ret);
return ret;
};
//debug(splitForeign('ad222经济核算123非'));