在JavaScript中,一般的情况,我们会使用split函数对字符串进行切割。

1
2
'Hello! How are you?'.split(/[.!?]/);
// ['Hello', ' How are you', '']

使用split函数来切割的话,不仅依赖硬编码的分隔符,还会丢失分隔符。不同语言的分隔符还不一样,还要去了解这门语言。

常见的字符串方法无法很好地根据语义分隔文本,但是Intl 这个JavaScript API会有令人惊讶的文本分隔能力。

基本用法

Intl.Segmenter 对象支持语言敏感的文本分割,帮助你将一个字符串分割成有意义的片段(字、词、句)。

Intl.Segmenter构造函数第1个参数为语言,zh-Hans-CN为简体中文,第2个参数options,可以配置切割粒度granularity,取值有graphemewordsentence,分别是字、词、句。

1
2
3
4
5
6
const segmenterCN = new Intl.Segmenter('zh-Hans-CN', { 
granularity: 'word'
});
const segmentsCN = segmenterCN.segment('邀请朋友一起体验Intl.Segmenter');
console.log(Array.from(segmentsCN).map(item => item.segment));
// ['邀请', '朋友', '一起', '体验', 'Intl', '.', 'Segmenter']

如果granularity改成grapheme,结果为[‘邀’, ‘请’, ‘朋’, ‘友’, ‘一’, ‘起’, ‘体’, ‘验’, ‘I’, ‘n’, ‘t’, ‘l’, ‘.’, ‘S’, ‘e’, ‘g’, ‘m’, ‘e’, ‘n’, ‘t’, ‘e’, ‘r’]

isWordLike属性

使用Intl.Segmenter来分词时,每项分隔结果会有一个isWordLike属性,如果你不想要结果中出现类似., 。,或 ?等,可以根据isWordLike的值做过滤。

运行时兼容性