n-gram语言模型——文本生成源码

news2025/3/15 18:36:10

n-gram语言模型——文本生成源码

  • n-gram模型的基本原理
  • 文本生成的步骤
    • 1. 准备和分词
    • 2. 构建n-gram模型
    • 3. 平滑技术的应用
    • 4. 生成文本
  • 源码

请添加图片描述

  在自然语言处理的领域中,n-gram语言模型是一种基础而强大的工具。它通过考虑词汇的序列来预测文本内容,从而有效地用于文本生成任务。这篇博客中将探讨如何利用n-gram模型,特别是在处理中文文本时,使用jieba进行分词和nltk库进行模型构建。

  我在上一篇博客里讲解了n-gram的原理,参考:n-gram语言模型——句子概率分布计算与平滑。

n-gram模型的基本原理

  n-gram模型基于一个简单的假设:一个词的出现只与它前面的有限个词相关。这种模型可以分为不同的类型,如bigrams(二元模型)和trigrams(三元模型),取决于我们考虑前面多少个词。

  以bigram为例,可以近似认为一个词的出现概率仅依赖于它前面的一个词:

  为了让 p ( w i ∣ w i − 1 ) p(w_i | w_{i-1}) p(wiwi1)在i为1时有意义,我们通常会在句子开头添加一个开始标记(BOS),并在句子结尾添加一个结束标记(EOS),以此包含在概率计算中。例如,要计算Mark wrote a book的概率,我们会这样计算:

p ( Mark wrote a book ) = p ( Mark ∣ BOS ) ⋅ p ( wrote ∣ Mark ) ⋅ p ( a ∣ wrote ) ⋅ p ( book ∣ a ) ⋅ p ( EOS ∣ book ) p(\text{Mark wrote a book}) = p(\text{Mark} | \text{BOS}) \cdot p(\text{wrote} | \text{Mark}) \cdot p(\text{a} | \text{wrote}) \cdot p(\text{book} | \text{a}) \cdot p(\text{EOS} | \text{book}) p(Mark wrote a book)=p(MarkBOS)p(wroteMark)p(awrote)p(booka)p(EOSbook)

  为了估计 p ( w i ∣ w i − 1 ) p(w_i | w_{i-1}) p(wiwi1),可以简单地计算在某一文本中单词w的频率,然后对其进行归一化。若用c表示在给定文本中的出现次数,我们可以使用如下公式:

p ( w i ∣ w i − 1 ) = c ( w i − 1 , w i ) ∑ w c ( w i − 1 , w ) ​ p(w_i | w_{i-1}) = \frac{c(w_{i-1}, w_i)}{\sum_{w} c(w_{i-1}, w)}​ p(wiwi1)=wc(wi1,w)c(wi1,wi)

  上述公式即为最大似然估计(Maximum Likelihood Estimation, MLE)。对于更高阶的n-gram模型,这一公式同样适用。

文本生成的步骤

1. 准备和分词

  使用jieba对中文文本进行分词,这是处理中文n-gram模型的第一步。分词后的结果用来构建n-gram模型。

2. 构建n-gram模型

  利用nltk的ngrams函数,从分词结果中创建bigrams序列。然后使用这些bigrams来构建一个条件频率分布对象,用于后续的文本生成。

3. 平滑技术的应用

  在n-gram模型中,为了处理那些在训练数据中未出现的词组合,需要采用平滑技术。Lidstone平滑和Laplace平滑是两种常见的方法。这些方法通过添加一个小的非零值到词组合的计数中,避免了零概率问题,使模型更加健壮。

Lidstone平滑和Laplace平滑参考之前的博客 n-gram语言模型——句子概率分布计算与平滑

4. 生成文本

  文本生成的过程是从一个初始词开始,根据条件频率分布连续生成下一个词。这个过程重复进行,直到达到所需的词数或遇到停止条件。

源码

  下面是使用Laplace平滑的n-gram模型来成文本的示例:

import nltk
from nltk.probability import LidstoneProbDist, LaplaceProbDist
from nltk.corpus import brown
from nltk import FreqDist, ConditionalFreqDist
import random
import jieba

# 示例文本 读取ylk.txt
text = open("ylk.txt", encoding="utf-8").read()
# jieba分词
tokens = jieba.cut(text)
# 生成bigrams
bi_grams = list(nltk.ngrams(tokens, 2))
# 创建条件频率分布对象
cfd = ConditionalFreqDist(bi_grams)

# # 使用Lidstone平滑
# # gamma值小于1的Lidstone平滑
lidstone_cfd = {condition: LidstoneProbDist(cfd[condition], gamma=0.1) for condition in cfd.conditions()}

# 使用Laplace平滑
# Laplace平滑是gamma=1的特殊情况
laplace_cfd = {condition: LaplaceProbDist(cfd[condition]) for condition in cfd.conditions()}

def generate_text(initial_word, cfd, num_words=50):
    current_word = initial_word
    generated_text = [current_word]

    for _ in range(num_words - 1):
        if current_word not in cfd:
            break
        next_word = random.choices(
            population=list(cfd[current_word].samples()),
            weights=[cfd[current_word].prob(w) for w in cfd[current_word].samples()]
        )[0]
        generated_text.append(next_word)
        current_word = next_word

    return ''.join(generated_text)

# 示例:从"哈哈"开始生成文本
print(generate_text("方锐", laplace_cfd, 100))
print(generate_text("方锐", lidstone_cfd, 100))

  代码里我下了4M多的网络小说作为语料库。然后根据主角的名字开始生成,结果如下:

在这里插入图片描述

  感觉lidstone效果更好一点。

  通过使用n-gram模型结合平滑技术,能够有效地生成符合语言规律的文本。这种方法虽然简单,但在许多应用场景下仍然非常有效,特别是在资源有限的情况下。

  随着深度学习技术的发展,出现了更复杂的语言模型,n-gram模型感觉在文本生成领域已经不行了~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1197119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里大佬:DDD中Interface层、Application层的设计规范

说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 谈谈你的DDD落地经验? 谈谈你对DDD的理解&#xff1f…

redis主从复制+哨兵

1.主从复制 redis配置文件redis.conf master机器:IP 192.168.1.5 ,端口 6379 设置配置参数 daemonize yes #bind 127.0.0.1 -::1 protected-mode no port 6379 dbfilename "dump.rdb" dir "/root/redis/my_redis_conf/dumpdir" l…

深度学习工具的安装 CUDA Anaconda

深度学习工具安装 CUDA与CUDNN的安装 查看计算机是否支持CUDA 主要参考: 一看就懂的 CUDA安装教程及Pytorch GPU版本安装教程 次要参考: cuda安装 (windows版) cuDNN的验证 Anaconda的包装 anaconda下载安装包国内镜像源

李峋同款的C语言动态爱心代码来了,彩色闪动,附源码

1.前言 最近一部电视剧《点燃我,温暖你》可火啦,大家纷纷在搞男主阿瑟的同款爱心代码,但是虽然网上有它的源码,但都不是 C 语言的,看不懂。我看了一下这个视频,大致分析了一下它的运行过程。用语言描述一下…

【读点论文】结构化剪枝

结构化剪枝 在一个神经网络模型中,通常包含卷积层、汇合层、全连接层、非线形层等基本结构,通过这些基本结构的堆叠,最终形成我们所常用的深度神经网络。 早在 1998 年,LeCun 等人使用少数几个基本结构组成 5 层的 LeNet-5 网络&…

Install Docker in Linux

Docker官网链接: https://docs.docker.com/ 1.确定Linux版本 新版本的Docker对Linux系统版本有一定的要求。如果Linux的发行版系统是centOS,安装最新版的docker需要centOS 7以上的系统。 在Docker安装帮助页面查看支持的系统版本。 Docker帮助页面:https://docs…

C语言--青蛙跳台阶【内容超级详细】

今天与大家分享一下递归的经典题目--青蛙跳台阶问题。 一.引子 电影《少年班》🍗中的老师在全国各地寻找天才少年时,就问了一个这样的问题,有20阶台阶,每次只能上一阶或两阶,总共有多少种上法?这个少年王…

web3 React Dapp书写订单 买入/取消操作

好 上文web3 前端dapp从redux过滤出 (我创建与别人创建)正在执行的订单 并展示在Table上中 我们过滤出了 我创建的 与 别人创建的 且 未完成 未取消的订单数据 这边 我们起一下 ganache 环境 ganache -d然后 我们项目 发布一下智能合约 truffle migrate --reset然…

数据的属性与数据集,相似度,数据的质量,OLAP

数据的属性与数据集: 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sq…

[LeetCode] 5.最长回文子串

一、题目描述 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba&…

【api_fox】ApiFox简单操作

1、get和post请求的区别?2、接口定义时的传参格式?3、保存接口文档 apifox当中接口文档的设计和接口用例的执行是分开的。 1、get和post请求的区别? 2、接口定义时的传参格式? 3、保存接口文档 就生成如下的接口文档。

木板上的蚂蚁(c++题解)

题目描述 有一块木板,长度为 n 个 单位 。一些蚂蚁在木板上移动,每只蚂蚁都以 每秒一个单位 的速度移动。其中,一部分蚂蚁向 左 移动,其他蚂蚁向 右 移动。 当两只向 不同 方向移动的蚂蚁在某个点相遇时,它们会同时改…

移植LVGL到单片机的一个demo简单介绍

简介 背景: 本文使用的是主控IC为stm32f103zet6, 显示IC为ST7735s,它是128*160的像素,色深为RGB565颜色。 官方虽然说LVGL移植平台只需 64kB 闪存和 8kB RAM 就足以满足简单的用户界面。但我移植到stm32f103c8t6,不管怎么修改配…

Kubernetes基础(七)-Pod资源Limits与Requests

在k8s的集群环境中,资源的合理分配和使用非常重要。毕竟容器化要解决的问题之一就是资源的充分利用。在集群中分配资源的时候就不得不提到Limits和Requests。 1 Namespace配额 Kubernetes 是允许管理员在命名空间中指定资源 Requests 和 Limits 的,这一…

半小时拥有自己的ChatGPT4,高效低成本,无脑跟即可

文章目录 一、获取Key二、获取服务器三、设置端口三、安装Docker环境 一、获取Key 最简单的获取方法,去某宝搜 “open账号ai” 购入一个key,几块钱,有3.5、4.0,买3.5就行了,4.0太贵了。注意是购入key,不是…

ArcGIS10.8 连接 PostgreSQL 及遇到的两个问题

前提 以前同事用过我的电脑连PostgreSQL,失败了。当时不知道原因,只能使用GeoServer来发布数据了。现在终于搞明白了,原因是ArcGIS10.2版本太老,无法连接PostgreSQL9.4。参考这里 为了适应时代的发展,那我就用新的Ar…

测量直线模组时如何降低误差?

直线模组属于高精度传动零部件,是机械行业中不可或缺的零部件之一,其具有高精度、速度快、使用寿命长等特点;如果直线模组的精度受损,则不能达到预期的使用效果,那么我们测量时应该如何减少误差,确保直线模…

ENVI IDL:如何解析XML文件(以Landsat9-MTL.xml文件为例)

01 前言 我们原本是打算对Landsat9文件进行辐射定标,但是辐射定标的参数在MTL文件中,从文件中查看参数直接复制到IDL中固然可行,但是当我们对Landsat9文件进行批量辐射定标时,这种方法就将失效了。因此我们需要自动从MTL文件中读…

SSM框架Demo: 简朴博客系统

文章目录 1. 前端页面效果2. 项目创建3. 前期配置3.1. 创建数据库数据表3.2. 配置文件 4. 创建实体类5. 统一处理5.1. 统一返回格式处理5.2. 统一异常处理 6. 全局变量7. Session工具类8. 登录拦截器9. 密码加盐加密10. 线程池组件11. dao层11.1. UserMapper11.2. ArticleMappe…

jenkins分步式构建环境(agent)

rootjenkins:~# netstat -antp|grep 50000 tcp6 0 0 :::50000 ::😗 LISTEN 5139/java 1.52 安装Jenkins rootubuntu20:~# dpkg -i jenkins_2.414.3_all.deb 配置各种类型的Agent的关键之处在于启动Agent的方式 ◼ JNLP Agent对应着“通过Java Web启动代理”这种方…