自然语言处理之ngram模型

背景介绍

N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。

每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。

该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。

公式计算

Bigram

对于bigram模型,单词出现的概率只与前一个词有关,即 P ( w i ∣ w i − 1 ) P(w_i |w_{i-1}) P(wiwi1),整个句子的联合概率为: P ( S ) = ∏ i = 1 m P ( w i ∣ w i − 1 ) P\left ( S \right )=\prod_{i=1}^{m} P \left ( w_i | w_{i-1} \right ) P(S)=i=1mP(wiwi1)
对于每个词出现的概率 P ( w i ∣ w i − 1 ) P(w_i |w_{i-1}) P(wiwi1)可以用最大似然估计法:
P ( w i ∣ w i − 1 ) = C ( w i − 1 , w i ) C ( w i − 1 ) P\left ( w_i |w_{i-1} \right )=\frac{C \left ( w_{i-1} , w_i \right )}{C \left ( w_{i-1} \right )} P(wiwi1)=C(wi1)C(wi1,wi)
其中 C ( w i − 1 , w i ) C \left ( w_{i-1} , w_i \right ) C(wi1,wi)为词 w i − 1 w i w_{i-1}w_i wi1wi 在语料中共同出现的次数。

Ngram

同理,推广到ngram的情况,单词出现的概率只与前 n − 1 n-1 n1个词有关,即 P ( w i ∣ w i − n + 1 , . . . , w i − 1 ) P(w_i |w_{i-n+1},...,w_{i-1}) P(wiwin+1,...,wi1),整个句子的联合概率为: P ( S ) = ∏ i = 1 m P ( w i ∣ w i − n + 1 , . . . , w i − 1 ) P ( w i ∣ w i − n + 1 , . . . , w i − 1 ) = C ( w i − n + 1 , . . . , w i ) C ( w i − n + 1 , . . . , w i − 1 ) P\left ( S \right )=\prod_{i=1}^{m} P \left ( w_i | w_{i-n+1},...,w_{i-1}\right ) \\ P\left ( w_i | w_{i-n+1},...,w_{i-1} \right )=\frac{C \left ( w_{i-n+1} ,..., w_i \right )}{C \left ( w_{i-n+1},...,w_{i-1} \right )} P(S)=i=1mP(wiwin+1,...,wi1)P(wiwin+1,...,wi1)=C(win+1,...,wi1)C(win+1,...,wi)

在实际应用时,通常会对上面的联合概率取对数,将连乘转化为累加的形式方便计算:
l o g P ( S ) = ∑ i = 1 m l o g P ( w i ∣ w i − n + 1 , . . . , w i − 1 ) logP\left ( S \right )=\sum_{i=1}^{m} logP \left (w_i | w_{i-n+1},...,w_{i-1}\right ) logP(S)=i=1mlogP(wiwin+1,...,wi1)
而且实际情况中单词出现的概率 P ( w i ∣ w i − 1 ) P(w_i |w_{i-1}) P(wiwi1)通常是很小的小数,取对数可以将数值放大。
在实际的处理中,我们通常会给每一个句子加上开始标记和结束标记,例如<s></s><s>是为了让第一个词语有上下文,</s>是为了制造一个更加真实的概率分布。

困惑度(perplexity, PPL)

语言模型中经常使用困惑度来作为语言模型的评价,PPL越小句子完整性越好。
对于一段句子 S = w 1 w 2 ⋅ ⋅ ⋅ w m S=w_1w_2 \cdot\cdot\cdot w_m S=w1w2wm
P P L ( S ) = P ( w 1 w 2 ⋅ ⋅ ⋅ w m ) − 1 m PPL \left ( S \right )=P \left ( w_1w_2 \cdot\cdot\cdot w_m \right )^{-\frac{1}{m}} PPL(S)=P(w1w2wm)m1
两边取对数:
l o g P P L ( S ) = − 1 m l o g P ( w 1 w 2 ⋅ ⋅ ⋅ w m ) logPPL \left ( S \right )=-\frac{1}{m} logP \left ( w_1w_2 \cdot\cdot\cdot w_m \right ) logPPL(S)=m1logP(w1w2wm)
对于bigram:
l o g P P L ( S ) = − 1 m l o g P ( S ) = − 1 m ∑ i = 1 m l o g P ( w i ∣ w i − 1 ) logPPL \left ( S \right )=-\frac{1}{m} logP\left ( S \right )=-\frac{1}{m} \sum_{i=1}^{m} logP \left (w_i | w_{i-1}\right ) logPPL(S)=m1logP(S)=m1i=1mlogP(wiwi1)

参考:
https://blog.csdn.net/stupid_3/article/details/83184555
https://blog.csdn.net/sdu_hao/article/details/86893580
https://blog.csdn.net/ding_programmer/article/details/90141428

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用中提到了一些关于自然语言处理中特征提取的问题,其中包括如何构建一个系统来从非结构化文本中提取结构化数据,如何识别文本描述中的实体和关系,以及如何使用语料库来训练和评估模型。对于Python自然语言处理中的特征提取,可以采用以下方法和步骤: 1. 词袋模型(Bag of Words):将文本中的每个单词作为一个特征,并统计其出现的频次。可以使用Python中的CountVectorizer或TfidfVectorizer来实现。 2. n-gram模型:将连续的n个单词作为一个特征,可以捕捉到更多的上下文信息。可以使用Python中的CountVectorizer或TfidfVectorizer中设置ngram_range参数来实现。 3. 词嵌入(Word Embedding):将每个单词映射到一个低维向量空间中,可以捕捉到单词之间的语义关系。可以使用Python中的Word2Vec、GloVe或FastText等库来进行词嵌入。 4. 句法分析特征:通过分析句子的句法结构,提取特定的句法规则或模式作为特征。可以使用Python中的NLTK或Spacy等库来进行句法分析。 5. 实体识别特征:识别文本中的人名、地名、组织机构等实体,并将其作为特征。可以使用Python中的NLTK或Spacy等库来进行实体识别。 6. 主题模型特征:通过对文本进行主题建模,提取文本的主题分布作为特征。可以使用Python中的LDA或LSA等库来进行主题建模。 以上是一些常用的Python自然语言处理中特征提取的方法和步骤,根据具体的任务和数据集的特点,可以选择合适的方法来提取特征,并进行相应的处理和分析。<span class="em">1</span><span class="em">2</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值