Permalink
Browse files

doSegment(text, {stripStopword: true})

  • Loading branch information...
1 parent fd6bcb0 commit da0b8c7ad94cb126b0bccd7abc8103ea96e81b84 @leizongmin committed Oct 29, 2015
Showing with 86 additions and 5 deletions.
  1. +46 −2 README.md
  2. +0 −1 dicts/stopword.txt
  3. +40 −2 lib/Segment.js
View
@@ -67,7 +67,7 @@ console.log(result);
[ '这是', '一个', '基于', 'Node.js', '', '中文', '分词', '模块', '' ]
```
-### 去掉标点符号
+### 去除标点符号
```javascript
var text = '这是一个基于Node.js的中文分词模块。';
@@ -102,9 +102,10 @@ segment.loadSynonymDict('synonym.txt');
```
什么时候,何时
+入睡,入眠
```
-在分词时设置`convertSynonym=true`则结果中的`"什么时候"`将被转换为`"何时"`
+在分词时设置`convertSynonym=true`则结果中的`"什么时候"`将被转换为`"何时"``"入睡"`将被转换为`"入眠"`
```javascript
var text = '什么时候我也开始夜夜无法入睡';
@@ -126,6 +127,47 @@ console.log(result);
{ w: '入眠', p: 4096 } ]
```
+### 去除停止符
+
+载入词典:
+
+```javascript
+segment.loadStopwordDict('stopword.txt');
+```
+
+词典格式:
+
+```
+之所以
+因为
+```
+
+在分词时设置`stripStopword=true`则结果中的`"之所以"``"因为"``"入睡"`将被去除:
+
+```javascript
+var text = '之所以要编写一个纯JS的分词器是因为当时没有一个简单易用的Node.js模块';
+var result = segment.doSegment(text, {
+ stripStopword: true
+});
+console.log(result);
+```
+
+结果:
+
+```javascript
+[ { w: '编写', p: 4096 },
+ { w: '', p: 1073741824 },
+ { w: 'JS', p: [ 16 ] },
+ { w: '分词', p: 4096 },
+ { w: '' },
+ { w: '当时', p: 16384 },
+ { w: '没有', p: 4096 },
+ { w: '简单', p: 1073741824 },
+ { w: '易用' },
+ { w: 'Node.js', p: 8 },
+ { w: '模块', p: 1048576 } ]
+```
+
## 2、词典格式
@@ -178,6 +220,8 @@ segment
.loadDict('dict2.txt') // 扩展词典(用于调整原盘古词典)
.loadDict('names.txt') // 常见名词、人名
.loadDict('wildcard.txt', 'WILDCARD', true) // 通配符
+ .loadSynonymDict('synonym.txt') // 同义词
+ .loadStopwordDict('stopword.txt') // 停止符
```
自定义分词器:
View
@@ -12,7 +12,6 @@
:
?
<
->
[
]
{
View
@@ -150,6 +150,31 @@ Segment.prototype.loadSynonymDict = function (name) {
};
/**
+ * 载入停止符词典
+ *
+ * @param {String} name 字典文件名
+ */
+Segment.prototype.loadStopwordDict = function (name) {
+ var filename = this._resolveDictFilename(name);
+ var type = 'STOPWORD';
+
+ // 初始化词典
+ if (!this.DICT[type]) this.DICT[type] = {};
+ var TABLE = this.DICT[type]; // 词典表 '同义词' => '标准词'
+ // 导入数据
+ var data = fs.readFileSync(filename, 'utf8');
+
+ data.split(/\r?\n/).forEach(function (line) {
+ line = line.trim();
+ if (line) {
+ TABLE[line] = true;
+ }
+ });
+
+ return this;
+};
+
+/**
* 使用默认的识别模块和字典文件
*
* @return {Segment}
@@ -178,7 +203,8 @@ Segment.prototype.useDefault = function () {
.loadDict('dict3.txt') // 扩展词典(用于调整原盘古词典)
.loadDict('names.txt') // 常见名词、人名
.loadDict('wildcard.txt', 'WILDCARD', true) // 通配符
- .loadSynonymDict('synonym.txt'); // 同义词
+ .loadSynonymDict('synonym.txt') // 同义词
+ .loadStopwordDict('stopword.txt') // 停止符
;
return this;
};
@@ -189,8 +215,9 @@ Segment.prototype.useDefault = function () {
* @param {String} text 文本
* @param {Object} options 选项
* - {Boolean} simple 是否仅返回单词内容
- * - {Boolean} stripPunctuation 去掉标点符号
+ * - {Boolean} stripPunctuation 去除标点符号
* - {Boolean} convertSynonym 转换同义词
+ * - {Boolean} stripStopword 去除停止符
* @return {Array}
*/
Segment.prototype.doSegment = function (text, options) {
@@ -214,12 +241,14 @@ Segment.prototype.doSegment = function (text, options) {
if (sret.length > 0) ret = ret.concat(sret);
});
+ // 去除标点符号
if (options.stripPunctuation) {
ret = ret.filter(function (item) {
return item.p !== POSTAG.D_W;
});
}
+ // 转换同义词
function convertSynonym (list) {
var count = 0;
var TABLE = me.getDict('SYNONYM');
@@ -240,6 +269,15 @@ Segment.prototype.doSegment = function (text, options) {
} while (result.count < 1);
}
+ // 去除停止符
+ if (options.stripStopword) {
+ var STOPWORD = me.getDict('STOPWORD');
+ ret = ret.filter(function (item) {
+ return !(item.w in STOPWORD);
+ });
+ }
+
+ // 仅返回单词内容
if (options.simple) {
ret = ret.map(function (item) {
return item.w;

0 comments on commit da0b8c7

Please sign in to comment.