基于B-gram句子概率计算实现

这篇博客介绍了如何基于B-gram算法计算句子出现概率。提供了预训练模型及语料库下载,支持批量处理语料。训练后模型自动保存为'model.txt',并支持设置平滑处理参数。通过probability方法计算句子概率,可选择计算间隔进行平均。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于B-gram句子概率计算实现

概述

该“句子出现概率计算”基于B-gram算法,若不了解请自行百度。

如果急于使用,请下载笔者已经训练好的模型文件(model.txt,置于项目根目录);如果想自行训练,可以使用语料库(千万级巨型汉语词库);下面是下载地址:

项目链接:ProbabilityOfSentence

语料链接:https://pan.baidu.com/s/1c3WWoxi 密码:uypd

由于笔者所使用的语料库是基于词语的,所以对于词语的计算效果更佳,但是常规句子的计算可能并不理想,建议自行寻找语料库进行训练。

说明

输入为文本文件(一句一行或者一段一行),支持批量语料输入,可以多次或者单次调用addCorpus方法进行设置。

训练好之后会自行保存模型文件(命名为“model.txt”)到项目根目录。如果不配置输入语料且根目录保存有模型文件,则会直接导入模型文件。

B-gram采用的平滑处理手段是“add one smoothing”,但是并非真的加一,可以加一个大于0小于1的数,该参数使用setAddOne方法进行设置。

最后使用goIntoEffect方法让所有设置生效。

使用probability方法计算句子的概率,该方法可选

首先,我们需要对给定的语料进行处理,将其转换成N-gram模型的形式。在本题中,N=2,即二元语言模型。具体地,我们将每个句子拆成一个个的二元组,每个二元组包含当前单词和下一个单词。例如,对于句子“我 爱 你”,我们可以将其转换为[('<s>', '我'), ('我', '爱'), ('爱', '你'), ('你', '</s>')],其中<s>表示句子的开始,</s>表示句子的结束。 接下来,我们需要计算每个二元组的概率,并将它们相乘得到整个句子概率。具体地,我们可以使用以下公式计算一个二元组的概率: P(w2|w1) = count(w1w2) / count(w1) 其中,count(w1w2)表示在语料库中出现w1w2这个二元组的次数,count(w1)表示在语料库中出现w1这个单词的次数。 在计算整个句子概率时,我们需要将所有二元组的概率相乘起来,即: P(sentence) = P('<s>') * P(w2|w1) * P(w3|w2) * ... * P('</s>'|wn) 其中,<s>表示句子的开始,</s>表示句子的结束。 下面是Python代码实现: ```python import re from collections import defaultdict # 读取语料库 with open('corpus.txt', 'r', encoding='utf-8') as f: corpus = f.read() # 将语料库转换为N-gram模型的形式 n = 2 words = re.findall(r'\b\w+\b', corpus.lower()) ngrams = [(words[i:i+n], words[i+n]) for i in range(len(words)-n)] # 统计每个二元组和单词的出现次数 ngram_counts = defaultdict(int) word_counts = defaultdict(int) for ng, w in ngrams: ngram_counts[(ng[0], ng[1])] += 1 word_counts[ng[0]] += 1 # 计算句子概率 sentence = '我 爱 你' tokens = sentence.lower().split() p = 1 for i in range(len(tokens)-1): count_ngram = ngram_counts.get((tokens[i], tokens[i+1]), 0) count_word = word_counts.get(tokens[i], 0) p *= count_ngram / count_word p *= word_counts.get(tokens[-1], 0) / len(words) # 最后一个单词的概率需要特殊处理 print('句子概率为:', p) ``` 其中,corpus.txt是给定的语料库文件,我们首先将其读入内存中。接着,我们使用正则表达式将语料库中的单词提取出来,并将其转换为N-gram模型的形式。我们使用defaultdict来统计每个二元组和单词的出现次数。 计算句子概率时,我们首先将句子拆分为单词,然后逐个计算每个二元组的概率,并将它们相乘起来。最后一个单词的概率需要特殊处理,我们将其出现次数除以整个语料库中单词的总数。最终的结果就是整个句子概率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值