码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • N-Gram模型介绍


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

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

    该模型基于马尔可夫假设,每一个单词的出现都取决于它前面有限个单词。对于有限个单词数量n的不同定义,组成了不同的gram模型,

    当n=1时,就是uni-gram, p(w_1,w_2,...,w_m) = \prod_{i=1}^{m}p(w_i)

    当n=2时,就是bi-gram, p(w_1,w_2,...,w_m)=\prod_{i=1}^{m}p(w_i|w_{i-1})

    当n=3时,就是tri-gram, P(w_1,w_2,...,w_m)=\prod_{i=1}^{m}p(w_i|w_{i-2}w_{i-1})

    在给定的训练语料中,利用贝叶斯定理,将上述的条件概率值都统计计算出来即可,以bigram为例,公示推导如下:

    P(w_i|w_{i-1})=\frac{P(w_i,w_{i-1})}{P(w_{i-1})}=\frac{count(w_i,w_{i-1})}{count(ALLword)} \cdot \frac{count(ALLword)}{count(w_{i-1})}=\frac{count(w_i,w_{i-1})}{count(w_{i-1})}

    同理,可以得到trigram的条件概率公式:P(w_i|w_{i-2},w_{i-1})=\frac{Count(w_{i-2},w_{i-1},w_i)}{Count(w_{i-2},w_{i-1})}

    n-gram条件概率公式为:P(w_n|w_{n-1}...w_2,w_1)=\frac{Count(w_1,w_2,...w_n)}{Count(w_1,w_2,...,w_{n-1})}

    注意:如果N过大会导致对于当前单词的约束过强,则容易导致过拟合。简单理解就是特征太多训练集上是准确率高了,但是容易过拟合。

    以Bi-gram为例,假设有三句话组成的语料库为:

    则能计算出的概率为:

    I出现3次,I do出现1次,则P(do|I)=1/3=0.33

    do出现1次,do not出现1次,则P(not|do) =1/1=1

    代码实现N-gram:

    1. #coding:utf-8
    2. def creat_ngram_list(input_list, ngram_num):
    3. ngram_list = []
    4. if len(input_list) <= ngram_num:
    5. ngram_list.append(input_list)
    6. else:
    7. for temp in zip(*[input_list[i:] for i in range(ngram_num)]):
    8. temp = "".join(temp)
    9. ngram_list.append(temp)
    10. return ngram_list
    11. if __name__ == "__main__":
    12. text = input("输入:")
    13. ngram_num = int(input("切分长度:"))
    14. print("\n 列表输出:{0}".format(creat_ngram_list(text,ngram_num)))

    结果为:

    总结,N-gram模型的优点是基于有限的历史所以效率高,缺点是无法体现文本相似度,无法关联更早的信息。

  • 相关阅读:
    爬虫(1) - 爬虫基础入门理论篇
    springboot高校二手服饰交易系统服装商城idea mysql
    C# 根据MySQL数据库中数据,批量删除OSS上的垃圾文件
    GuavaCache学习三种过期策略的学习
    这4款浏览器必装插件,让浏览器使用体验上升100%
    多路转接之Poll&Epoll
    提升APP的用户体验的方法
    设计模式之组合模式
    Redis实战之缓存:查询、添加缓存、更新缓存、缓存预热、缓存穿透、缓存雪崩、缓存击穿 解决方案及实例代码
    揭秘AI 原生应用技术栈
  • 原文地址:https://blog.csdn.net/Vicky_xiduoduo/article/details/128105478
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号