js实现ngram
实现 N-gram 的 JavaScript 方法
方法一:基于字符串分割的 N-gram 生成
function generateNGrams(text, n) {
const tokens = text.split(/\s+/);
const ngrams = [];
for (let i = 0; i <= tokens.length - n; i++) {
ngrams.push(tokens.slice(i, i + n).join(' '));
}
return ngrams;
}
方法二:字符级别的 N-gram 生成
function generateCharNGrams(text, n) {
const ngrams = [];
for (let i = 0; i <= text.length - n; i++) {
ngrams.push(text.substring(i, i + n));
}
return ngrams;
}
方法三:支持多种粒度(词/字符)的通用实现

function generateNGrams(text, n, type = 'word') {
const input = type === 'word' ? text.split(/\s+/) : text;
const ngrams = [];
const max = type === 'word' ? input.length - n + 1 : input.length - n + 1;
for (let i = 0; i < max; i++) {
const slice = input.slice(i, i + n);
ngrams.push(type === 'word' ? slice.join(' ') : slice);
}
return ngrams;
}
使用示例
const sampleText = "自然语言处理很有趣";
// 词级别的 2-gram
console.log(generateNGrams(sampleText, 2));
// 输出: ["自然 语言", "语言 处理", "处理 很", "很 有趣"]
// 字符级别的 3-gram
console.log(generateCharNGrams(sampleText, 3));
// 输出: ["自然语", "然语言", "语言处", "言处理", "处理很", "理很有", "很有趣"]
性能优化建议
- 对于大文本处理,可以考虑使用生成器函数避免内存问题:
function* nGramGenerator(text, n) {
const tokens = text.split(/\s+/);
for (let i = 0; i <= tokens.length - n; i++) {
yield tokens.slice(i, i + n).join(' ');
}
}
- 预处理文本时去除标点符号和特殊字符:
function cleanText(text) {
return text.replace(/[^\w\s]|_/g, '').replace(/\s+/g, ' ');
}






