N-Gram语言模型

article/2025/9/26 19:41:59

一、n-gram是什么

wikipedia上有关n-gram的定义:
n-gram是一种统计语言模型,用来根据前(n-1)个item来预测第n个item。在应用层面,这些item可以是音素(语音识别应用)、字符(输入法应用)、词(分词应用)或碱基对(基因信息)。一般来讲,可以从大规模文本或音频语料库生成n-gram模型。
习惯上,1-gram叫unigram,2-gram称为bigram,3-gram是trigram。还有four-gram、five-gram等,不过大于n>5的应用很少见。

二、n-gram的理论依据

n-gram语言模型的思想,可以追溯到信息论大师香农的研究工作,他提出一个问题:给定一串字母,如”for ex”,下一个最大可能性出现的字母是什么。从训练语料数据中,我们可以通过极大似然估计的方法,得到N个概率分布:是a的概率是0.4,是b的概率是0.0001,是c的概率是…,当然,别忘记约束条件:所有的N个概率分布的总和为1.
n-gram模型概率公式推导。根据条件概率和乘法公式:
这里写图片描述
得到
这里写图片描述
拿一个应用来讲,假设T是由词序列A1,A2,A3,…An组成的,那么P(T)=P(A1A2A3…An)=P(A1)P(A2|A1)P(A3|A1A2)…P(An|A1A2…An-1)
如果直接这么计算,是有很大困难的,需要引入马尔科夫假设,即:一个item的出现概率,只与其前m个items有关,当m=0时,就是unigram,m=1时,是bigram模型。
因此,P(T)可以求得,例如,当利用bigram模型时,P(T)=P(A1)P(A2|A1)P(A3|A2)…P(An|An-1)
而P(An|An-1)条件概率可以通过极大似然估计求得,等于Count(An-1,An)/Count(An-1)。

三、n-gram的数据长什么样

其实,说n-gram长什么样,是不严谨的。它只是一个语言模型,只要把需要的信息存储下来,至于什么格式都是依据应用来定。如,著名的google books Ngram Viewer,它的n-gram数据格式是这样的:

circumvallate   1978   335    91
circumvallate   1979   261    91

代表了一个1-gram的数据片段,第一行的意思是,“circumvallate”这个单词在1978年出现335次,存在91本书中。这些元数据,除了频率335次是必须的,其他的元数据(例如,还有词性等)可以根据应用需求来定。下面是一个5-gram数据片段:

analysis is often described as  1991  1   1   1

当然,也可以是其他形式,例如,HanLP的n-gram模型是bigram:

@北冰洋   2@卢森堡   1@周日    1@因特网   1@地 1@地域    1@塔斯社   9@尚义    12@巴 1@巴勒斯坦  1@拉法耶特  3@拍卖    1@昆明    1

每一行代表,两个相邻单词共同出现时的频率(相对于背后的语料库)。

四、n-gram有什么用

4.1 文化研究

n-gram模型看起来比较枯燥和冰冷,但实际上,google books ngram项目,催生了一门新学科(Culturomics)的成立,通过数字化的文本,来研究人类行为和文化趋势。可查看知乎上的详细介绍,。《可视化未来》这本书也有详细介绍。
这里写图片描述
还有TED上的视频《what_we_learned_from_5_million_books》,十分精彩。
这里写图片描述

4.2 分词算法

4.3 语音识别

4.4 输入法

大家每天都在使用的东西,请看:输入“tashiyanjiushengwude”,可能的输出有:

它实验救生无得
他实验就生物的
他是研究圣物的
他是研究生物的

究竟哪个是输入者最想表达的意思,这背后的技术就要用到n-gram语言模型了。item就是每一个拼音对应的可能的字。还记得智能ABC吗?据说是运用n-gram的鼻祖了。
这里写图片描述

不过搜狗输入法后来居上,它采用更先进的云计算技术(n-gram模型的数据量可是相当之大,后面会说到)
这里写图片描述

4.5 机器翻译

五、n-gram的更多认识

做概率统计的都知道,语料库的规模越大,做出的n-gram对统计语言模型才更有用,例如,google books ngram项目,单独对中文的n-gram,从1551年到2009年,总体规模如下:

....
1999    1046431040  8988394 9256
2000    1105382616  10068214    10504
2001    1017707579  8508116 9426
2002    1053775627  9676792 11116
2003    1003400478  9095202 10624
2004    1082612881  9079834 11200
2005    1326794771  10754207    13749
2006    1175160606  9381530 12030
2007    826433846   6121305 7291
2008    752279725   5463702 6436
2009    442976761   2460245 2557
year    n-gram count    book page count book volumecount 26859461025 252919372   302652

总共才扫描了30万卷书,生成的n-gram(从unigram到5-gram)的个数就达到了268亿多个。英文的n-gram在4684多亿多:

....
1999    9997156197  48914071    91983
2000    11190986329 54799233    103405
2001    11349375656 55886251    104147
2002    12519922882 62335467    117207
2003    13632028136 68561620    127066
2004    14705541576 73346714    139616
2005    14425183957 72756812    138132
2006    15310495914 77883896    148342
2007    16206118071 82969746    155472
2008    19482936409 108811006   206272
year    n-gram count    book page count book volumecount 468491999592    2441898561  4541627

这个数量级的n-gram,无论是存储还是检索,对技术都是极大的挑战。
以上是google books n-gram的相关数据,在前些年,google还提供了基于web的1个T的n-gram,规模如下:

Number of tokens:    1,024,908,267,229
Number of sentences:    95,119,665,584
Number of unigrams:         13,588,391
Number of bigrams:         314,843,401
Number of trigrams:        977,069,902
Number of fourgrams:     1,313,818,354
Number of fivegrams:     1,176,470,663

共950亿个句子,10000亿个token,还只是2006年一年的数据。
除了google,微软通过它的BING搜索,也开放了PB级别(1PB = 1PeraByte = 1024 TB = 1024 * 1024 * 1024 MB)的n-gram,这种数量级别的,只能放云存储上了。

参考资料:
斯坦福大学自然语言处理公开课


http://chatgpt.dhexx.cn/article/Vx2vHET0.shtml

相关文章

MATLAB 离散傅里叶变换(DFT)、逆离散傅里叶变换(IDFT)、快速傅里叶变换(FFT)的实现

离散傅里叶变换(DFT)、逆离散傅里叶变换(IDFT)的实现 代码如下,其中xn为时序序列 clc;clear; xn[7,6,5,4,3,2]; Xkdft(xn,6); xidft(Xk,6);subplot(2,2,1);stem(0:5,abs(Xk),filled); axis([0,5,0,1.1*max(abs(Xk))]…

图像处理基础(三)DFT与IDFT变换

傅里叶变换(DFT) 首先来看看傅里叶(DFT)变换的公式 (1) FP\frac {1}{N}\sum_{x0}^{N-1}\sum_{y0}^{N-1}P_{x,y}\exp(-j(\frac{2 \pi}{N})(uxvy)) 幅度 (2) w\sqrt{u^2v^2} 其中 u,v代表空间频率,即灰度梯度,梯度由坐标与灰度值求导的向量 w代表 振幅…

第4章 Python 数字图像处理(DIP) - 频率域滤波7 - 二维DFT和IDFT的一些性质 - 傅里叶频谱和相角

目录 二维DFT和IDFT的一些性质傅里叶频谱和相角 二维DFT和IDFT的一些性质 傅里叶频谱和相角 F ( u , v ) R ( u , v ) j I ( u , v ) ∣ F ( u , v ) ∣ e j ϕ ( u , v ) (4.86) F(u, v) R(u, v) jI(u, v) |F(u, v)|e^{j\phi(u,v)} \tag{4.86} F(u,v)R(u,v)jI(u,v)∣F(…

实数序列频谱的共轭对称性(DFT与IDFT仿真实现)

一、基础知识 1、傅里叶变换:通俗来讲,是以时间为自变量的信号与以频率为自变量的“频谱函数”之间的某种转换关系。 DFT:即离散傅里叶变换,对离散序列进行傅里叶变换。设x(n)为长度为M的有限长序列,其N点DFT定义(公…

第4章 Python 数字图像处理(DIP) - 频率域滤波8 - 二维DFT和IDFT的一些性质 - 二维离散卷积定理

目录 二维DFT和IDFT的一些性质二维离散卷积定理二维离散傅里叶变换性质的小结 二维DFT和IDFT的一些性质 二维离散卷积定理 二维循环卷积表达式: ( f ⋆ h ) ( x , y ) ∑ m 0 M − 1 ∑ n 0 N − 1 f ( m , n ) h ( x − m , y − n ) (4.94) (f \star h)(x, …

FFT学习笔记(DFT,IDFT)

昨天参悟了一天FFT,总算是理解了,今天的莫比乌斯反演也不太懂,干脆弃疗,决定来认真水一发博客。 什么是FFT? FFT(Fast Fourier Transformation),即为快速傅氏变换,是离散傅氏变换&…

【OpenCV4】图像的傅里叶变换 cv::dft() 和逆变换 cv::idft() 解析(c++)

图像傅里叶变换的作用: 频谱分析,获取图像中高频低频的分布情况快速卷积,两个矩阵的傅里叶变换结果相乘 案例代码: cv::Mat TestOpencvDft() {cv::Mat lena cv::imread("lena.jpg", 0);cv::resize(lena, lena, cv::…

Matlab如何进行利用离散傅里叶逆变换iDFT 从频谱恢复时域信号

文章目录 1. 定义2. 变换和处理3. 函数4. 实例演示例1:单频正弦信号(整数周期采样)例2:含有直流分量的单频正弦信号例3:正弦复合信号例4:含有随机干扰的正弦信号例5:实际案例 5. 联系作者 1. 定…

离散傅里叶变换(DFT/IDFT、FFT/IFFT)运算量的讨论

前言:关于为什么要写这个博客 最近在重新看《合成孔径雷达成像 算法与实现》这本书,看到“离散傅里叶变换记其逆变换的运算量级为”这句话,就想起当初在学《数字信号处理》中FFT那章节时,书中有对比DFT和FFT的运算量的一些文字&am…

OpenCV-离散傅里叶变换cv::dftcv::idft

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 函数原型 void dft(InputArray src, OutputArray dst, int flags 0, int nonzeroRows 0); void idft(InputArray src, Output…

12点的idft c语言,【整理】用IDFT实现UF-OFDM和OFDM的模拟调制

cooperate with Liu Lei 用IDFT实现OFDM的代码如下: N32; xrandint(1,N,[0 3]); x1qammod(x,4); f1:N; t0:0.001:1-0.001; w2*pi*f.*t; % w12*pi*(f0.2).*t; y1x1*exp(j*w);%子载波调制 x2ifft(x1,N); %ifft figure(1); plot(t,abs(y1)); hold on; stem(0:1/N:1-1/N…

离散傅立叶变换推导(DF、IDFT)

mazonex离散傅立叶变换视频笔记 需要先了解傅里叶变换推导(FT、IFT) 本文仅作为笔记,推导思想和图片来自视频 周期为 2 π 2\pi 2π的函数的复数形式展开(傅里叶级数) 在上一篇文章中part4中提到周期 T 2 L T2L T2L函数的复数形式展开为: f ( t ) ∑…

浅谈傅里叶——8. 一维iDFT的实现

这是本系列的最后一章,原先计划是把这部分内容一并挪到上一章里的,不过喜欢凑一个整数,而且想骗一点流量,所以把它们拆成了两部分。我们在前面的内容中,通过使用不同的频率信号对原始信号进行采样,从而分析…

idft重建图像 matlab_1周学FFT——第2天 DFT和IDFT的MATLAB实现

根据定义式,可写出DFT的MATLAB代码如下[从玉良,2009,p72]: function [f, Xk] mydft(xn, fs, N) % DFT n [0:1:N-1]; k n; WN exp(-j*2*pi/N); nk n * k; % N^2 times multiply Xk xn(1:N) * WN.^nk; % N^3 times multiply f …

FT,DTFT,DFT,IDFT,FFT含义

1.傅立叶变换FT(Fourier Transform) 性质:时域连续,频域连续 周期信号只有傅立叶级数,严格意义上讲,没有傅立叶变换;但可以令周期信号的周期趋于无穷大,这样,将周期信号变为非周期信号&#x…

DFT与IDFT

DFT与IDFT 一.方法简介 序列x(n)(n0,1,…N-1)的DFT定义为 X ( k ) ∑ n 0 N − 1 x ( n ) e − j 2 π n k N X(k)\sum_{n0}^{N-1}x(n)e^{-j\frac{2\pi nk}{N}} X(k)n0∑N−1​x(n)e−jN2πnk​ 设 x …

IDFT的python实现

IDFT IDFT(Inverse Discrete Fourier Transform), 傅里叶逆变换,可以将频域信号转换到时域中, 它的公式非常简单: x [ n ] 1 N ∑ k 0 N − 1 X [ k ] e j 2 π k n / N x[n] \frac{1}{N} \sum_{k0}^{N-1} X[k] e^{j2\pi kn/N} x[n]N1​k0∑N−1​X…

一文搞懂:FT、DTFT、DFT、IDFT

一文搞懂:FT、DTFT、DFT、IDFT 写在前面一切为了计算机的处理推导步骤 总结 写在前面 近期重温了一下可爱的数字信号处理,又回想起当初被 FT、DTFT、DFT、IDFT 这几兄弟折腾的傻傻分不清的日子,今天特地在此对它们进行一个梳理。 珠玉在前&a…

LDUOJ spj 修改

特判使用教程 感谢涛巨 记录一下,省的以后忘记了。 /* Utility functions for writing output validators for the Kattis* problem format.** The primary functions and variables available are the following.* In many cases, the only functions needed are …

noip 2022 第二题 喵了个喵 meow 在 Lemon LemonLime 中 SPJ Special Judge 测评 配置 设置

noip 2022 第二题 喵了个喵 meow 在 Lemon LemonLime 中 SPJ Special Judge 测评配置设置 比赛目录如下&#xff1a; 用户程序(meow.cpp)如下&#xff1a; #include <bits/stdc.h> using namespace std;template<typename T> inline void read(T &x) {x 0; …