N-gram
将文本分割为 N 个连续字符或单词子序列的方法,用于搜索和文本相似度计算。
N-gram 是将文本分割为 N 个连续字符或单词子序列的方法。N=1 称为一元组 (unigram),N=2 称为二元组 (bigram),N=3 称为三元组 (trigram)。例如,将"你好世界"按字符二元组分割,可以得到"你好""好世""世界"三个子序列。除了字符级别的 N-gram,还有单词级别的 N-gram,例如"I love Tokyo"的单词二元组为"I love"和"love Tokyo"。这是自然语言处理和信息检索领域中历史悠久的基础技术,至今仍在众多系统中发挥核心作用。
N-gram 最大的优势在于不需要形态素分析或词典。即使是日语和中文这样词边界不明确的语言,也可以通过机械地滑动窗口来生成词元。Elasticsearch 和 Apache Solr 等全文搜索引擎标准提供了 N-gram 分词器,可用于构建与语言无关的搜索索引。搜索飞机杯 (Amazon)系统地介绍了 N-gram 索引的原理。
N-gram 也广泛用于文本相似度计算。通过使用 Jaccard 系数或余弦相似度等指标比较两段文本生成的 N-gram 集合的重叠程度,可以将文档间的相似性量化。这种方法被应用于拼写检查、模糊搜索、抄袭检测、推荐引擎等多种场景。Google 的搜索建议功能也是利用基于 N-gram 的预测对输入中的查询进行补全的典型例子。
N-gram 作为语言模型的基础技术也发挥了重要作用。在 N-gram 语言模型中,根据前 N-1 个单词来估计下一个单词的出现概率。在深度学习成为主流之前,这是机器翻译和语音识别的核心技术。即使在今天,由于其计算成本低且易于解释的优点,仍被用于轻量级文本分类和过滤等用途。
另一方面,N-gram 也有一些需要注意的问题。随着 N 值增大,索引大小会急剧膨胀,存储和计算成本随之增加。此外还存在误匹配问题,例如搜索"京都"时可能会匹配到"东京都"中语义无关的子串。为了缓解这一问题,不少系统采用了将 N-gram 与形态素分析相结合的混合方式。探索校园泳装 (Amazon)深入介绍了 N-gram 的理论与实现。
从字符计数的角度来看,N-gram 的分割结果直接取决于文本长度。长度为 L 的文本可以生成 L-N+1 个字符 N-gram,文本越短,生成的 N-gram 数量也越少。使用字符计数工具预先了解文本长度,有助于估算 N-gram 分析的粒度和精度。