nodejs 中文分词模块 node-segment
Posted nodejs学习社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs 中文分词模块 node-segment相关的知识,希望对你有一定的参考价值。
模块以盘古分词组件中的词库为基础, 算法设计也部分参考了盘古分词组件中的算法。
github:https://github.com/leizongmin/node-segment
本分词模块具有以下特点:
纯javascript编写,可以在任何支持ECMAScript5的引擎上执行(需要稍微修改部分代码)
基于词性进行联想识别
可使用JavaScript编写自定义的分词模块
1、使用方法
安装:
$ npm install segment --save
使用:
// 载入模块
var Segment = require('segment');
// 创建实例
var segment = new Segment();
// 使用默认的识别模块及字典,载入字典文件需要1秒,仅初始化时执行一次即可
segment.useDefault();
// 开始分词
console.log(segment.doSegment('这是一个基于Node.js的中文分词模块。'));
返回结果格式:
[ { w: '这是', p: 0 },
{ w: '一个', p: 2097152 },
{ w: '基于', p: 262144 },
{ w: 'Node.js', p: 8 },
{ w: '的', p: 8192 },
{ w: '中文', p: 1048576 },
{ w: '分词', p: 4096 },
{ w: '模块', p: 1048576 },
{ w: '。', p: 2048 } ]
其中 w
表示词的内容,p
表示词性(具体参考 https://github.com/leizongmin/node-segment/blob/master/lib/POSTAG.js 中的定义)
2、词典格式
词典文件为纯文本文件,每行定义一个词,格式为: 词|词性|词权值
,如:工信处|0x0020|100
词性 的定义可参考文件 https://github.com/leizongmin/node-segment/blob/master/lib/POSTAG.js
词权值 越大表示词出现的频率越高
词典文件可参考:https://github.com/leizongmin/node-segment/tree/master/dicts
2、自定义识别模块
// 载入模块
var Segment = require('segment');
// 创建实例
var segment = new Segment();
// 配置,可根据实际情况增删,详见segment.useDefault()方法
segment.use('URLTokenizer'); // 载入识别模块,详见lib/module目录,或者是自定义模块的绝对路径
segment.loadDict('dict.txt'); // 载入字典,详见dicts目录,或者是自定义字典文件的绝对路径
// 开始分词
console.log(segment.doSegment('这是一个基于Node.js的中文分词模块。'));
一般可通过 segment.useDefault()
来载入默认的配置,若要自定义加载,可参考 useDefault()
的代码:
segment
// 分词模块
// 强制分割类单词识别
.use('URLTokenizer') // URL识别
.use('WildcardTokenizer') // 通配符,必须在标点符号识别之前
.use('PunctuationTokenizer') // 标点符号识别
.use('ForeignTokenizer') // 外文字符、数字识别,必须在标点符号识别之后
// 中文单词识别
.use('DictTokenizer') // 词典识别
.use('ChsNameTokenizer') // 人名识别,建议在词典识别之后
// 优化模块
.use('ChsNameOptimizer') // 人名识别优化
.use('DictOptimizer') // 词典识别优化
.use('DatetimeOptimizer') // 日期时间识别优化
// 字典文件
.loadDict('dict.txt') // 盘古词典
.loadDict('dict2.txt') // 扩展词典(用于调整原盘古词典)
.loadDict('names.txt') // 常见名词、人名
.loadDict('wildcard.txt', 'WILDCARD', true) // 通配符
自定义分词器:
segment.use({
// 类型
type: 'tokenizer',
// segment.use() 载入模块,初始化时执行
init: function (segment) {
// segment 为当前的Segment实例
},
// 分词
split: function (words) {
// words 为单词数组,如:['中文', '分词']
// 返回一个新的数组用来替换旧的数组
return words;
}
});
自定义优化器:
segment.use({
// 类型
type: 'optimizer',
// segment.use() 载入模块,初始化时执行
init: function (segment) {
// segment 为当前的Segment实例
},
// 优化
doOptimize: function (words) {
// words 为分词结果的单词数组,如:[{w: '中文', p: 1048576}, {w: '分词', p: 4096}]
// 返回一个新的数组用来替换旧的数组
return words;
}
})
分词器和优化器可参考默认模块:https://github.com/leizongmin/node-segment/tree/master/lib/module
其中 *Tokenizer
表示分词器, *Optimizer
表示优化器。
注意
请勿用此模块来对较长且无任何标点符号的文本进行分词,否则会导致分词时间成倍增加。
以上是关于nodejs 中文分词模块 node-segment的主要内容,如果未能解决你的问题,请参考以下文章
python︱四款中文分词模块尝试:jiebaTHULACSnowNLPpynlpir