统计语言模型Python实现

统计建模——模型——python为例 创建节点并定义它们之间的条件关系。 阅读详情

原理简述

统计语言模型(Statistical Language Model),可用于计算一个句子的合理程度。
S S S 表示句子,由有序的 n n n 个词 w 1 , w 2 , w 3 , . . w n w_1,w_2,w_3,..w_n w1​,w2​,w3​,..wn​ 组成,句子概率 P ( S ) P(S) P(S) 的计算公式如下:

N-gram

P ( S ) = P ( w 1 , w 2 , . . . w n ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 1 , w 2 ) . . . P ( w n ∣ w 1 , w 2 , . . . w n − 1 ) P(S) =P(w_1,w_2,...w_n) =P(w_1)P(w_2|w_1)P(w_3|w_1,w_2)...P(w_n|w_1,w_2,...w_{n-1}) P(S)=P(w1​,w2​,...wn​)=P(w1​)P(w2​∣w1​)P(w3​∣w1​,w2​)...P(wn​∣w1​,w2​,...wn−1​)

unigram

P ( S ) = P ( w 1 ) P ( w 2 ) . . . P ( w n ) = ∏ i = 1 n P ( w i ) P(S)=P(w_1)P(w_2)...P(w_n)=\prod^n_{i=1}P(w_i) P(S)=P(w1​)P(w2​)...P(wn​)=i=1∏n​P(wi​)
log ⁡ P ( S ) = ∑ i = 1 n log ⁡ P ( w i ) \log P(S) = \sum^n_{i=1} \log P(w_i) logP(S)=i=1∑n​logP(wi​)

bigram

P ( S ) = P ( w 1 ) P ( w 2 ∣ w 1 ) P ( w 3 ∣ w 2 ) . . . P ( w n ∣ w n − 1 ) = P ( w 1 ) ∏ i = 2 n P ( w i ∣ w i − 1 ) P(S) =P(w_1)P(w_2|w_1)P(w_3|w_2)...P(w_n|w_{n-1}) =P(w_1)\prod^n_{i=2}P(w_i|w_{i-1}) P(S)=P(w1​)P(w2​∣w1​)P(w3​∣w2​)...P(wn​∣wn−1​)=P(w1​)i=2∏n​P(wi​∣wi−1​)
log ⁡ P ( S ) = log ⁡ P ( w 1 ) + ∑ i = 2 n log ⁡ P ( w i ∣ w i − 1 ) \log P(S) = \log P(w_1) + \sum^n_{i=2} \log P(w_i|w_{i-1}) logP(S)=logP(w1​)+i=2∑n​logP(wi​∣wi−1​)

Add-k Smoothing

k=1;bigram;C表示count
P A d d − 1 ( w i ∣ w i − 1 ) = C ( w i − 1 , w i ) + 1 C ( w i − 1 ) + V P_{Add-1}(w_i|w_{i-1})=\frac{C(w_{i-1},w_i)+1}{C(w_{i-1})+V} PAdd−1​(wi​∣wi−1​)=C(wi−1​)+VC(wi−1​,wi​)+1​
e.g.

我很帅
她很美
P ( 帅 ∣ 很 ) = 1 + 1 2 + 5 = 2 7 P(帅|很)=\frac{1+1}{2+5}=\frac{2}{7} P(帅∣很)=2+51+1​=72​
P ( 美 ∣ 很 ) = 1 + 1 2 + 5 = 2 7 P(美|很)=\frac{1+1}{2+5}=\frac{2}{7} P(美∣很)=2+51+1​=72​
P ( 我 ∣ 很 ) = 0 + 1 2 + 5 = 1 7 P(我|很)=\frac{0+1}{2+5}=\frac{1}{7} P(我∣很)=2+50+1​=71​
P ( 她 ∣ 很 ) = 0 + 1 2 + 5 = 1 7 P(她|很)=\frac{0+1}{2+5}=\frac{1}{7} P(她∣很)=2+50+1​=71​
P ( 很 ∣ 很 ) = 0 + 1 2 + 5 = 1 7 P(很|很)=\frac{0+1}{2+5}=\frac{1}{7} P(很∣很)=2+50+1​=71​
P 总 = 1 P_总=1 P总​=1

代码&步骤

from collections import Counter
import numpy as np


"""语料"""
corpus = '''她的菜很好 她的菜很香 她的他很好 他的菜很香 他的她很好
很香的菜 很好的她 很菜的他 她的好 菜的香 他的菜 她很好 他很菜 菜很好'''.split()


"""语料预处理"""
counter = Counter()  # 词频统计
for sentence in corpus:
    for word in sentence:
        counter[word] += 1
counter = counter.most_common()
lec = len(counter)
word2id = {counter[i][0]: i for i in range(lec)}
id2word = {i: w for w, i in word2id.items()}


"""N-gram建模训练"""
unigram = np.array([i[1] for i in counter]) / sum(i[1] for i in counter)

bigram = np.zeros((lec, lec)) + 1e-8
for sentence in corpus:
    sentence = [word2id[w] for w in sentence]
    for i in range(1, len(sentence)):
        bigram[[sentence[i - 1]], [sentence[i]]] += 1
for i in range(lec):
    bigram[i] /= bigram[i].sum()


"""句子概率"""
def prob(sentence):
    s = [word2id[w] for w in sentence]
    les = len(s)
    if les < 1:
        return 0
    p = unigram[s[0]]
    if les < 2:
        return p
    for i in range(1, les):
        p *= bigram[s[i - 1], s[i]]
    return p

print('很好的菜', prob('很好的菜'))
print('菜很好的', prob('菜很好的'))
print('菜好的很', prob('菜好的很'))


"""排列组合"""
def permutation_and_combination(ls_ori, ls_all=None):
    ls_all = ls_all or [[]]
    le = len(ls_ori)
    if le == 1:
        ls_all[-1].append(ls_ori[0])
        ls_all.append(ls_all[-1][: -2])
        return ls_all
    for i in range(le):
        ls, lsi = ls_ori[:i] + ls_ori[i + 1:], ls_ori[i]
        ls_all[-1].append(lsi)
        ls_all = permutation_and_combination(ls, ls_all)
    if ls_all[-1]:
        ls_all[-1].pop()
    else:
        ls_all.pop()
    return ls_all

print('123排列组合', permutation_and_combination([1, 2, 3]))


"""给定词组,返回最大概率组合的句子"""
def max_prob(words):
    pc = permutation_and_combination(words)  # 生成排列组合
    p, w = max((prob(s), s) for s in pc)
    return p, ''.join(w)

print(*max_prob(list('香很的菜')))
print(*max_prob(list('好很的他菜')))
print(*max_prob(list('好很的的她菜')))

1、工具导入

from collections import Counter
import numpy as np, pandas as pd
pdf = lambda data, index=None, columns=None: pd.DataFrame(data, index, columns)

pandas用于可视化(Jupyter下),亦可用matplotlib、seaborn等工具

2、语料预处理

corpus = '她很香 她很菜 她很好 他很菜 他很好 菜很好'.split()

counter = Counter()  # 词频统计
for sentence in corpus:
    for word in sentence:
        counter[word] += 1
counter = counter.most_common()
words = [wc[0] for wc in counter]  # 词库(用于可视化)
lec = len(counter)
word2id = {counter[i][0]: i for i in range(lec)}
id2word = {i: w for w, i in word2id.items()}

pdf(counter, None, ['word', 'freq'])

3、unigram

unigram = np.array([i[1] for i in counter]) / sum(i[1] for i in counter)
pdf(unigram.reshape(1, lec), ['概率'], words)

4、bigram

bigram = np.zeros((lec, lec)) + 1e-8  # 平滑

for sentence in corpus:
    sentence = [word2id[w] for w in sentence]
    for i in range(1, len(sentence)):
        bigram[[sentence[i - 1]], [sentence[i]]] += 1

# 频数
pd.DataFrame(bigram, words, words, int)

# 频数 --> 概率
for i in range(lec):
    bigram[i] /= bigram[i].sum()
pdf(bigram, words, words)

5、概率计算

def prob(sentence):
    s = [word2id[w] for w in sentence]
    les = len(s)
    if les < 1:
        return 0
    p = unigram[s[0]]
    if les < 2:
        return p
    for i in range(1, les):
        p *= bigram[s[i - 1], s[i]]
    return p

print(prob('菜很香'), 1 / 6 / 6)

p ( 菜 很 香 ) = P ( 菜 ) P ( 很 ∣ 菜 ) P ( 香 ∣ 很 ) = 3 18 ∗ 1 ∗ 1 6 p(菜很香)=P(菜)P(很|菜)P(香|很)= \frac{3}{18} * 1 * \frac{1}{6} p(菜很香)=P(菜)P(很∣菜)P(香∣很)=183​∗1∗61​

基于Bigram的文本生成

https://github.com/AryeYellow/NLP/blob/master/TextGeneration/tg_trigram_and_cnn.ipynb

from collections import Counter
from random import choice
from jieba import lcut

# 语料读取、分词
with open('corpus.txt', encoding='utf-8') as f:
    corpus = [lcut(line) for line in f.read().strip().split()]

# 词频统计
counter = Counter(word for words in corpus for word in words)

# N-gram建模训练
bigram = {w: Counter() for w in counter.keys()}
for words in corpus:
    for i in range(1, len(words)):
        bigram[words[i - 1]][words[i]] += 1
for k, v in bigram.items():
    total2 = sum(v.values())
    v = {w: c / total2 for w, c in v.items()}
    bigram[k] = v

# 文本生成
n = 5  # 开放度
while True:
    first = input('首字:').strip()
    if first not in counter:
        first = choice(list(counter))
    next_words = sorted(bigram[first], key=lambda w: bigram[first][w])[:n]
    next_word = choice(next_words) if next_words else ''
    sentence = first + next_word
    while bigram[next_word]:
        next_word = choice(sorted(bigram[next_word], key=lambda w: bigram[next_word][w])[:n])
        sentence += next_word
    print(sentence)

附录

encn
grammar语法
unique唯一的
binary二元的
permutation排列
combination组合

统计语言模型应用于词性标注,Python算法实现

深度解析模型推理性能:如何准确统计 TTFT 与每秒 Token 数(附完整代码) 本文介绍了如何从零实现一个大语言模型(LLM)性能监控工具,使用Python+OpenAI接口调用本地部署的模型(如Qwen3),通过流式输出统计关键指标:首次响应时间(TTFT)、总token数和每秒token数(TPS)。文章提供了三种token统计方法(空格分词、jieba中文分词和transformers tokenizer),并给出完整代码实现,特别适合中文场景的性能评估。三种方法各有特点:空格分词快速但精度低,jieba适合中文项目,transformers tokenizer最准确。该工具可帮 阅读详情

相关推荐

语言模型的训练过程的批评和争议

1. 背景介绍 1.1 语言模型的重要性 在自然语言处理(NLP)领域,语言模型是一种基本的建模方法,用于表示和生成自然语言文本。语言模型在许多NLP任务中都有广泛的应用,如机器翻译、语音识别、文本生成、情感分析等。随着深度学习技术的发展,神经网络语言模型已经成为了当前研究的热点。

AI天才研究院 1051

笔记(总结)-统计语言模型

在自然语言处理的相关问题中,如何表示句子是建模分析的关键。与传统的图像、音频等天然可转化为计算机编码的元素不同,自然语言需要经过复杂编码才能被计算机识别。并且,这种编码是机械式的简单排列,设计初衷是为了解决自然语言的存储问题,编码本身不带有任何语言层面的信息。因此,直接使用自然语言的编码对文字进行转换而后建模是不可靠的,过程中丢失了太多的信息。语言模型正是解决了这样的问题。 语言模型有很多种...

ZSY的大后台 841

对话系统的语言模型:从统计学到深度学习

1.背景介绍 对话系统的语言模型是自然语言处理领域的一个重要研究方向,它涉及到自然语言理解和生成的技术。在过去的几年里,随着深度学习技术的发展,语言模型的研究也从传统的统计学方法逐渐转向深度学习方法。在本文中,我们将从以下几个方面进行详细讨论: 背景介绍 核心概念与联系 核心算法原理和具体操

AI天才研究院 198

统计语言模型

1. 统计语言模型 句子 W=wT1=(w1,w2,⋯,wT),wT1\boldsymbol{W} = w^T_1 = (w_1,w_2,\cdots ,w_T),w_1^T表示句子的第一个词语到第T个词语。 P(W)=P(wT1)=P(w1,w2,⋯,wT)=P(w1)×P(w2|w1)×P(w3|w21)×⋯×P(wT|wT1)P(\boldsymbol{W}) = P(w^T_1) =

Oliver的博客 539

Python ngram语言模型算法详解及源码

unigram模型仅考虑单个词的出现概率,bigram模型考虑相邻两个词的概率,trigram模型考虑相邻三个词的概率。unigram模型仅考虑单个词的出现概率,bigram模型考虑相邻两个词的概率,trigram模型考虑相邻三个词的概率。unigram模型仅考虑单个词的出现概率,bigram模型考虑相邻两个词的概率,trigram模型考虑相邻三个词的概率。unigram模型仅考虑单个词的出现概率,bigram模型考虑相邻两个词的概率,trigram模型考虑相邻三个词的概率。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 637

实现N-gram语言模型算法

你可以根据需要调整N-gram的大小,并使用更大的语料库来提高预测的准确性。N-gram语言模型基于统计方法,它假设当前词的出现仅与前面的N-1个词相关。具体来说,给定一个文本语料库,我们将统计每个N-gram序列的出现频率,并根据这些频率来预测下一个词或字符。以上代码示例使用了双词(2-gram)序列来生成N-gram模型和预测下一个词。我们定义一个函数来接受一个N-gram序列和一个待预测的上下文,并返回预测的下一个词。上述代码遍历了所有的N-gram序列,并找到与给定上下文匹配的N-1个词。

CodeHeroicX的博客 504

平滑方法

在自然语言处理中,经常会遇到要计算单词或者句子在词典或文档中出现的频次,但是会存在某个单词在词典中没有出现的情况,计算时概率为0,为了改善这种情况,人们提出的平滑方法。 1、Add-one Smoothing(Laplace Smoothing) 2、Add-k Smoothing 3、Interpolation 4、Good-Turning Smoothing 以Bigram为例。 ...

mu66mu的博客 1415

AI自然语言处理NLP原理与Python实战:语言模型技术发展历程

1.背景介绍 自然语言处理(Natural Language Processing,NLP)是人工智能(Artificial Intelligence,AI)领域的一个重要分支,它旨在让计算机理解、生成和处理人类语言。自然语言处理的一个重要组成部分是语言模型(Language Model,LM),它可以预测下一个词或短语在给定上下文中的概率。

AI天才研究院 102

N-gram语言模型简单介绍

N-gram语言模型 考虑一个语音识别系统,假设用户说了这么一句话:“I have a gun”,因为发音的相似,该语音识别系统发现如下几句话都是可能的候选:1、I have a gun. 2、I have a gull. 3、I have a gub. 那么问题来了,到底哪一个是正确答案呢? 一般的解决方法是采用统计的方法。即比较上面的1、2和3这三句话哪一句在英语中出现的概率最高,哪句概率...

weixin_30793643的博客 658

N32在Keil中J-Link识别失败的排查与修复指南

本文详细解析了在Keil开发环境中,J-Link调试器无法识别N32系列MCU的常见问题。通过分步指导,从检查修改Keil工程配置文件、更新J-Link驱动,到手动添加N32专用设备支持包,系统性地提供了排查与修复方案,帮助开发者快速恢复调试连接,确保开发流程顺畅。

306

GBT 27930-2015/2023国标充电协议A类CAN报文ID说明

国标充电CAN的ID,仅供学习参考。

qqq080的博客 7820

【语音识别学习】未分词的2-gram语言模型统计Python实现(含源码)

概述 &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;对于语音识别来说,大体上就分为三个方面,一个是声学模型(acoustical model)的训练,一个是语言模型(language model)的训练,最后就是对给定一段语音的解码了,当然,咱们今天讨论的是第二部分,其他的就先丢到一边吧!(在这给大家打一打气,其实语言模型是这三个方面里最复

Johnson的博客 5859

10X Genomics单细胞数据分析实战:从FASTQ到UMAP可视化的完整流程

本文详细介绍了10X Genomics单细胞数据分析的完整流程,从FASTQ原始数据处理到UMAP可视化。通过Seurat工具包实现数据质量控制、标准化、降维聚类和细胞注释,特别适合生物信息学新手学习。文章包含可复现的代码示例和常见问题解决方案,帮助研究者快速掌握单细胞测序数据分析的核心技术。

weixin_30952535的博客 538

【NLP基础知识】3.统计语言模型简介与案例实现

一、统计语言模型简介 1.语言模型任务 2.语言模型实例 3.语言模型任务 3.1贝叶斯公式 3.2概率基础知识 3.3语言模型定义

尊新必威的博客 1066

告别CNN局限:用Transformer+迁移学习搞定高光谱图像分类(附Pytorch代码)

本文探讨了如何利用Transformer的自注意力机制和迁移学习策略解决高光谱图像分类中的挑战。通过结合CNN的局部特征提取和Transformer的全局建模能力,提出的DenseTransformer架构在多个数据集上实现了显著的性能提升。文章还提供了详细的PyTorch实现代码和工程优化技巧,帮助开发者快速应用这一技术。

weixin_32771907的博客 613

I-Cache 和 D-Cache

I-Cache 和 D-Cache

liuyuanbin9001 7023

shell 统计一个词出现的概率_干货满满 | 基于统计的分词算法

✖ 导语 ✖本篇主要对分词技术中基于统计的分词方法进行深入的探究,先是介绍了统计方法分词是什么以及一般步骤,随后介绍了语言模型,最后介绍了常见的统计算法(维特比算法),并实现了统计算法的分词。以下为文章结构,本篇内容干货满满:(阅读全文大概需要20分钟)✖ 统计分词 ✖01统计的分词方法基于统计的分词算法的主要核心是词是稳定的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。...

weixin_32019373的博客 682

《FPGA DDR3权威实战:从基础到高速故障录波系统》专栏导览:从不知所措到心中有数

本文是一份DDR3实战指南,作者从自身学习经历出发,分享了一套循序渐进的DDR3应用路线图。专栏包含12篇文章,从基础配置(MIG IP核、AXI总线)、仿真测试到实际项目应用(功能测试、性能测试),最后深入原生MIG接口实战,通过一个高速故障录播系统案例完整展示DDR3开发流程。文章特别强调实践性,旨在帮助读者系统掌握DDR3开发技能,避免作者当年踩过的坑。每篇都配有优快云链接,适合FPGA开发者按顺序学习参考。

FPGA_小田老师的博客 332

【Python自然语言处理】中文分词技术——统计分词

中文分词方法 本文参考自书籍《Python自然语言处理实战:核心技术与算法》 用做个人的学习笔记和分享 1. 规则分词 规则分词的详细笔记 2. 统计分词 3. 混合分词 ...

XD的学习笔记 3295

Transformer时间序列预测-多变量输入-单变量输出+多变量输出,完整代码数据,可直接运行

Transformer时间序列预测-多变量输入-单变量输出+多变量输出,完整代码数据,可直接运行

9794

【ComfyUI】QwenImageEdit OOTD角色与姿态匹配换装

本文介绍了一个基于Qwen Edit OOTD 2.0的ComfyUI工作流,能够实现角色与姿态匹配的智能穿搭生成。该工作流通过整合模型推理、姿态识别、图像拼接和渲染等节点,完成从角色图、姿态图到成品穿搭图的完整生成流程。核心采用Qwen Image系列模型进行图像理解和编辑,配合ControlNet进行姿态引导。用户只需提供角色图和姿态参考图,系统即可自动完成姿态解析、语义编码、采样生成等步骤,输出与输入姿态一致的穿搭图像。该方案适用于虚拟角色展示、电商试穿等场景,能保持角色特征一致的同时灵活变换姿态,显

Mr数据杨 1595

自然语言处理中的语言模型技术的应用

1.背景介绍 1. 背景介绍 自然语言处理(NLP)是计算机科学的一个分支,旨在让计算机理解、生成和处理人类语言。语言模型是NLP中的一个重要技术,它用于预测给定上下文中下一个词的概率。语言模型在许多NLP任务中发挥着重要作用,例如语言翻译、文本摘要、文本生成、语音识别等。 2. 核心概念与联系 在自然语言处理中,语言模型是一种统计模型,它可以根据训练数据中的词汇和上下文来估计一个词的概率...

AI天才研究院 806

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

从N-gram到语言模型:用Python实现Bigram并理解核心原理

语言模型的核心是预测词序列的概率分布,即根据上下文猜测下一个词。N-gram模型基于马尔可夫假设,通过统计相邻词对频率来估计条件概率,实现简单且直观。用Python实现Bigram语言模型,只需几十行代码即可完成从计数到概率计算再到文本生成的完整流程。这种基于统计的方法虽然存在数据稀疏和上下文有限的局限,但为理解词向量、神经网络语言模型乃至大语言模型奠定了坚实基础。通过动手实践Bigram,可以深入掌握语言模型的基本原理,并为后续学习更复杂的模型铺平道路。

weixin_29061425的博客 324

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

N-Gram 语言模型实战:从 Bigram 到 4-Gram 的 Python 实现与平滑策略对比

本文详细介绍了N-Gram语言模型的Python实现,从Bigram到4-Gram的构建与平滑策略对比。通过实战代码展示和中文语料评估,分析了加一平滑、Good-Turing平滑等技术的效果差异,帮助开发者掌握自然语言处理中的基础语言模型技术。

weixin_31715171的博客 327

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

深入理解大语言模型:从核心技术到极简实现

本文将带你深入了解LLM的核心技术原理,并通过一个简洁的Python实现来帮助你快速理解和入门。我们不会陷入复杂的数学推导,而是专注于核心概念的理解和实际代码的实现。

jiaquan3011的博客 1355

自然语言处理基础:语言模型与词嵌入

1.背景介绍 自然语言处理(NLP)是计算机科学和人工智能领域的一个重要分支,旨在让计算机理解和处理人类语言。在NLP中,语言模型和词嵌入是两个非常重要的概念,它们在许多NLP任务中发挥着关键作用。本文将深入探讨这两个概念的定义、原理、应用和实践,并为读者提供一个详细的技术入门。 1. 背景介绍 自然语言处理(NLP)是一门研究如何让计算机理解和生成人类语言的科学。NLP的应用范围广泛,包括...

AI天才研究院 1213
上一篇: Python词性标注HMM+viterbi实现
下一篇: TensorFlow【极简】入门代码
小基基o_O
博客等级 码龄9年 4414粉丝 467原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值