js实现ngram
N-gram 实现方法
N-gram 是一种文本分析方法,将文本分割为连续的 N 个字符或单词。以下是 JavaScript 中实现 N-gram 的几种方法。
字符级 N-gram
字符级 N-gram 将字符串分割为连续的 N 个字符。
function generateNGrams(text, n) {
const ngrams = [];
for (let i = 0; i <= text.length - n; i++) {
ngrams.push(text.substring(i, i + n));
}
return ngrams;
}
// 示例
const text = "hello";
const bigrams = generateNGrams(text, 2); // ["he", "el", "ll", "lo"]
单词级 N-gram
单词级 N-gram 将文本按单词分割为连续的 N 个单词。
function generateWordNGrams(text, n) {
const words = text.split(/\s+/);
const ngrams = [];
for (let i = 0; i <= words.length - n; i++) {
ngrams.push(words.slice(i, i + n).join(' '));
}
return ngrams;
}
// 示例
const sentence = "this is a sample sentence";
const trigrams = generateWordNGrams(sentence, 3); // ["this is a", "is a sample", "a sample sentence"]
滑动窗口优化
对于大文本,滑动窗口方法可以减少内存占用。
function* slidingWindowNGrams(text, n) {
for (let i = 0; i <= text.length - n; i++) {
yield text.substring(i, i + n);
}
}
// 示例
const text = "example";
const generator = slidingWindowNGrams(text, 3);
for (const ngram of generator) {
console.log(ngram); // "exa", "xam", "amp", "mpl", "ple"
}
处理标点符号和大小写
在实际应用中,通常需要预处理文本,去除标点符号并统一大小写。
function cleanText(text) {
return text.toLowerCase().replace(/[^\w\s]/g, '');
}
function generateCleanNGrams(text, n) {
const cleaned = cleanText(text);
return generateNGrams(cleaned, n);
}
// 示例
const dirtyText = "Hello, World!";
const cleanTrigrams = generateCleanNGrams(dirtyText, 3); // ["hel", "ell", "llo", "low", "owo", "wor", "orl", "rld"]
应用场景
N-gram 常用于自然语言处理任务,如拼写检查、文本分类和信息检索。字符级 N-gram 适用于短文本分析,单词级 N-gram 更适合句子或段落分析。







