探索NLP中的N-grams:理解,应用与优化

简介

n-gram[1] 是文本文档中 n 个连续项目的集合,其中可能包括单词、数字、符号和标点符号。 N-gram 模型在许多与单词序列相关的文本分析应用中非常有用,例如情感分析、文本分类和文本生成。 N-gram 建模是用于将文本从非结构化格式转换为结构化格式的众多技术之一。 n-gram 的替代方法是词嵌入技术,例如 word2vec。N-grams 广泛用于文本挖掘和自然语言处理任务。

示例

通过计算每个唯一的 n 元语法在文档中出现的次数,可以创建包含 n 元语法的语言模型。这称为 bag-of-n-grams 模型。

例如[2],对于"The cow jumps over the moon"这句话。如果 N=2(称为二元模型),那么 ngram 将为:

  • the cow
  • cow jumps
  • jumps over
  • over the
  • the moon

所以在这种情况下你有 5 个 n 元语法。请注意,我们从 the->cow 转移到 cow->jumps 到 Jumps->over 等,本质上是向前移动一个单词以生成下一个二元组。

如果 N=3,则 n 元语法将为:

  • the cow jumps
  • cow jumps over
  • jumps over the
  • over the moon

所以在这种情况下你有 4 个 n 元语法。当 N=1 时,这被称为一元语法,本质上是句子中的各个单词。当 N=2 时,称为二元组;当 N=3 时,称为三元组。当N>3时,这通常被称为多元组等等。

  • 一个句子中有多少个 N-gram?

如果 X=给定句子 K 中的单词数量,则句子 K 的 n-gram 数量为:

N-gram 有什么用?

N-gram 用于各种不同的任务。例如,在开发语言模型时,n-gram 不仅用于开发一元模型,还用于开发二元模型和三元模型。谷歌和微软开发了网络规模的 n-gram 模型,可用于各种任务,例如拼写纠正、断词和文本摘要。以下是 Microsoft 公开提供的网络规模 n-gram 模型:http://research.microsoft.com/en-us/collaboration/focus/cs/web-ngram.aspx。这是一篇使用 Web N-gram 模型进行文本摘要的论文:Micropinion Generation: An Unsupervised Approach to Generating Ultra-Concise Summaries of Opinions

n-gram 的另一个用途是为有监督的机器学习模型(例如 SVM、MaxEnt 模型、朴素贝叶斯等)开发特征。其想法是在特征空间中使用二元语法等标记,而不仅仅是一元语法。但请注意,根据我的个人经验和我审阅的各种研究论文,在特征空间中使用二元组和三元组不一定会产生任何显着的改进。

Code

在 python 中生成 n-gram。

复制代码
import re

def generate_ngrams(text,n):

    # split sentences into tokens
    tokens=re.split("\\s+",text)
    ngrams=[]

    # collect the n-grams
    for i in range(len(tokens)-n+1):
       temp=[tokens[j] for j in range(i,i+n)]
       ngrams.append(" ".join(temp))

    return ngrams

如果您使用的是 Python,还有另一种使用 NLTK 的方法:

复制代码
from nltk import ngrams

sentence = '_start_ this is ngram _generation_'
my_ngrams = ngrams(sentence.split(), 3)

Reference [1]

N-gram: https://www.mathworks.com/discovery/ngram.html

2

What: https://kavita-ganesan.com/what-are-n-grams/

本文由mdnice多平台发布

相关推荐
小哈里7 小时前
「小哈里」的个人 IP 设定文档 —— 在无常中生成流动的秩序
程序人生·新媒体运营·ip·内容运营·内容ip
焦糖玛奇朵婷2 天前
终于搞清楚了,扭蛋机小程序这么厉害❗
java·服务器·前端·程序人生·小程序
郝学胜-神的一滴2 天前
高并发秒杀系统设计全解:从需求拆解到Redis库存实战
java·数据库·redis·python·程序人生·缓存·php
1104.北光c°3 天前
Leetcode215 三种写法完成数组中的第K个最大元素 【hot100算法个人笔记】【java写法】
java·笔记·程序人生·算法·leetcode·排序算法·快速选择
流年似水~4 天前
Copilot已死,Agent当立:2026年,程序员从“码字工“到“AI指挥官“的生存指南
人工智能·程序人生·语言模型·ai编程
96705 天前
2025年年度总结之24.教育之学习方法
程序人生
1104.北光c°5 天前
【AI核心概念讲解】一口气搞懂 Agent:干翻传统后端!自主循环决策的秘密,ReAct 与 Plan-and-Execute 范式
java·人工智能·程序人生·ai·agent·react·智能体
郝学胜-神的一滴5 天前
深入理解回归损失函数:MSE、L1 与 Smooth L1 的设计哲学
人工智能·python·程序人生·算法·机器学习·数据挖掘·回归
流年似水~6 天前
脚本策划:拍之前先想清楚要剪什么
人工智能·程序人生·语言模型·ai编程
郝学胜-神的一滴6 天前
跨平台动态库与头文件:从原理到命名的深度解析
linux·c++·程序人生·unix·cmake