nodejs 中文分词模块 node-segment

Posted nodejs学习社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs 中文分词模块 node-segment相关的知识,希望对你有一定的参考价值。

模块以盘古分词组件中的词库为基础, 算法设计也部分参考了盘古分词组件中的算法。

github:https://github.com/leizongmin/node-segment

本分词模块具有以下特点:

  • javascript编写,可以在任何支持ECMAScript5的引擎上执行(需要稍微修改部分代码)

  • 基于词性进行联想识别

  • 可使用JavaScript编写自定义的分词模块

1、使用方法

安装:

 
   
   
 
  1. $ npm install segment --save

使用:

 
   
   
 
  1. // 载入模块

  2. var Segment = require('segment');

  3. // 创建实例

  4. var segment = new Segment();

  5. // 使用默认的识别模块及字典,载入字典文件需要1秒,仅初始化时执行一次即可

  6. segment.useDefault();

  7. // 开始分词

  8. console.log(segment.doSegment('这是一个基于Node.js的中文分词模块。'));

返回结果格式:

 
   
   
 
  1. [ { w: '这是', p: 0 },

  2. { w: '一个', p: 2097152 },

  3. { w: '基于', p: 262144 },

  4. { w: 'Node.js', p: 8 },

  5. { w: '的', p: 8192 },

  6. { w: '中文', p: 1048576 },

  7. { w: '分词', p: 4096 },

  8. { w: '模块', p: 1048576 },

  9. { 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、自定义识别模块

 
   
   
 
  1. // 载入模块

  2. var Segment = require('segment');

  3. // 创建实例

  4. var segment = new Segment();

  5. // 配置,可根据实际情况增删,详见segment.useDefault()方法

  6. segment.use('URLTokenizer'); // 载入识别模块,详见lib/module目录,或者是自定义模块的绝对路径

  7. segment.loadDict('dict.txt'); // 载入字典,详见dicts目录,或者是自定义字典文件的绝对路径

  8. // 开始分词

  9. console.log(segment.doSegment('这是一个基于Node.js的中文分词模块。'));

一般可通过 segment.useDefault() 来载入默认的配置,若要自定义加载,可参考 useDefault() 的代码:

 
   
   
 
  1. segment

  2. // 分词模块

  3. // 强制分割类单词识别

  4. .use('URLTokenizer') // URL识别

  5. .use('WildcardTokenizer') // 通配符,必须在标点符号识别之前

  6. .use('PunctuationTokenizer') // 标点符号识别

  7. .use('ForeignTokenizer') // 外文字符、数字识别,必须在标点符号识别之后

  8. // 中文单词识别

  9. .use('DictTokenizer') // 词典识别

  10. .use('ChsNameTokenizer') // 人名识别,建议在词典识别之后

  11. // 优化模块

  12. .use('ChsNameOptimizer') // 人名识别优化

  13. .use('DictOptimizer') // 词典识别优化

  14. .use('DatetimeOptimizer') // 日期时间识别优化

  15. // 字典文件

  16. .loadDict('dict.txt') // 盘古词典

  17. .loadDict('dict2.txt') // 扩展词典(用于调整原盘古词典)

  18. .loadDict('names.txt') // 常见名词、人名

  19. .loadDict('wildcard.txt', 'WILDCARD', true) // 通配符

自定义分词器:

 
   
   
 
  1. segment.use({

  2. // 类型

  3. type: 'tokenizer',

  4. // segment.use() 载入模块,初始化时执行

  5. init: function (segment) {

  6. // segment 为当前的Segment实例

  7. },

  8. // 分词

  9. split: function (words) {

  10. // words 为单词数组,如:['中文', '分词']

  11. // 返回一个新的数组用来替换旧的数组

  12. return words;

  13. }

  14. });

自定义优化器:

 
   
   
 
  1. segment.use({

  2. // 类型

  3. type: 'optimizer',

  4. // segment.use() 载入模块,初始化时执行

  5. init: function (segment) {

  6. // segment 为当前的Segment实例

  7. },

  8. // 优化

  9. doOptimize: function (words) {

  10. // words 为分词结果的单词数组,如:[{w: '中文', p: 1048576}, {w: '分词', p: 4096}]

  11. // 返回一个新的数组用来替换旧的数组

  12. return words;

  13. }

  14. })

分词器和优化器可参考默认模块:https://github.com/leizongmin/node-segment/tree/master/lib/module

其中 *Tokenizer 表示分词器, *Optimizer 表示优化器。

注意

请勿用此模块来对较长且无任何标点符号的文本进行分词,否则会导致分词时间成倍增加。


以上是关于nodejs 中文分词模块 node-segment的主要内容,如果未能解决你的问题,请参考以下文章

python︱四款中文分词模块尝试:jiebaTHULACSnowNLPpynlpir

python基础===jieba模块,Python 中文分词组件

有哪些比较好的中文分词方案?

python有一个中文分词工具叫Jieba

中文分词做不好,人机自然语言交互当然难以取得突破

中文分词原理