nodejieba
nodejieba copied to clipboard
期望更细致的切分结果
对于拼音来说,细致的切分出所有成语、词语,比切分出短语更合适。例如 README 中的示例:
nodejieba.cut("南京市长江大桥");
// 目前:["南京市","长江大桥"]
// 期望:["南京", "市","长江", "大桥"]
// 亦可:["南京市","长江", "大桥"]
nodejieba.cut("南京长江大桥");
// 目前:["南京长江大桥"]
// 期望:["南京","长江", "大桥"]
如果是目前的结果,则拼音的词语库中需要保留各种短语(例如 九江长江大桥、武汉长江大桥 等)。
如果是期望的结果,则只需要保留成语、词语的拼音库即可(更进一步,只需要保留有多音字的成语、词语拼音库)。
我能理解你的需求。
不过有一个切词模式(搜索引擎模式:QUERY)和你的需求相近,
nodejieba.cut("南京市长江大桥", "QUERY");
原理是当词的长度大于一个阈值的时候,会对它进行细的切分。
比如当阈值设置为3(现在本项目的默认阈值是4)的时候,
"南京市长江大桥" 会被切分成 ["南京市","长江","长江大桥","大桥"]
不知道这种分词模式是否符合你的需求。
PS: 之后关于各种切词模式的文档会跟上。
- 结果中有重复出现词语,这个不是期望的,也不好处理。
- 期望的结果是以成语、词语、短语这个顺序为优先级进行切分。
- 是成语的以整个成语为一个词(成语一般 4 个字);
- 是词语的以整个词语为一个词(词语一般 2 个字);
- 是短语的以整个短语为一个词(短语一般是地名、人名、物名等,但是最好是可以选择长模式还是短模式,对于拼音来说,应该期望是短模式)。
就类似下边的demo,使用搜索分词,NLPIR能够把香港特别行政区精确切分为3个词
如何能达成这个效果?

@Honghe 这个小粒度分词功能正在开发中。其实从这个issue被贴上 enhancement 标签的时候就打算加上这个功能了。只是最近工作比较忙还没弄完。
Nice. 是要用什么算法实现?
@Honghe 没准备用什么高深的算法,主要先在工程上做一些词长限制。
一个经典的测试语句...

@yanyiwu 这个功能现在怎么样了?
@hotoo 基本完成这个功能的,我找个时间完善一下然后在README里面写明一下。
GOOD,希望 pinyin 3.0 可以用上这个特性 :)
最新版本 npm install [email protected]
使用:
var nodejieba = require("nodejieba");
console.log(nodejieba.cut("南京市长江大桥", "MP", 3));
输出:
[ '南京市', '长江', '大桥' ]
尝试了下。应该说,还是不太符合期望。古代成语也会被强拆:
[ '破', '釜', '沉舟' ]
[ '叶公', '好', '龙' ]
粒度换成 4 基本满足需求了,不错。
[ '南京市', '长江大桥' ]
[ '南京', '长江大桥' ]
[ '九江', '长江大桥' ]
[ '武汉', '长江大桥' ]
[ '破釜沉舟' ]
[ '叶公好龙' ]
[ '香港', '特别', '行政区' ]
跟NLPIR还是有不一样,不知其怎么实现的
mark
console.log({
cut: nodejieba.cut(str, 'MP', 3),
tag: nodejieba.tag(str),
extract: nodejieba.extract(str, 5)
});
参数数字从1-5都试过,但str输入为开灯的时候,结果都是一样的:
{ cut: [ '开灯' ],
tag: [ { word: '开灯', tag: 'v' } ],
extract: [ { word: '开灯', weight: 10.0294766411 } ] }
而开卧室灯,分词的结果是:
{ cut: [ '开', '卧室', '灯' ],
tag:
[ { word: '开', tag: 'v' },
{ word: '卧室', tag: 'n' },
{ word: '灯', tag: 'n' } ],
extract: [ { word: '卧室', weight: 8.20023407859 } ] }
如何能返回 开、灯 两个结果? 不仅是cut,tag和extract也需要同样的结果。
nodejieba.cut(str, 'MP', 3),
这个用法在 version 2.0 以后就被废弃了。
推荐用什么?
@hotoo 推荐这么写: https://github.com/hotoo/pinyin/pull/101
This issue has not been updated for over 5 years and will be marked as stale. If the issue still exists, please comment or update the issue, otherwise it will be closed after 7 days.