实验一:训练Bigram模型并预测句子概率|自然语言

Posted 桃陉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验一:训练Bigram模型并预测句子概率|自然语言相关的知识,希望对你有一定的参考价值。


1.实验内容

∙ \\bullet 基于人民日报标注语料(见附件),训练一个Bigram语言模型,并预测任意给定语句语言概率。(中文分词可以采用Jieba, SnowNLP, PkuSeg, IK Analyzer, HanLP等)


2.思路

∙ \\bullet 由于词已经分好,那么训练模型只需要计算每个词的概率以及两个词组的共同概率,这里我使用正则表达式来提取每个词,然后使用字典存储它们的频数。

∙ \\bullet 训练好模型以后,需要对新输入的句子进行分词,这里我调用jieba进行分词。

∙ \\bullet 计算句子概率是可能出现概率为0的情况,在这里我使用加1法来解决这种问题。


3.python代码

import jieba
import re


#Bigram模型
#计算分词概率函数
def cal_word_prob(file_path):
    '''
    input:
        param file_path(str):存放分词文件的地址
    output:
        return single_word_prob(dict):记录单个词语出现的频数
        return single_word_prob(dict):记录两个词语出现的频数
    '''
    #打开txt文件,按行读取全部内容
    f = open(file_path,"r", encoding='utf-8', errors='ignore')
    lines = f.readlines()
    
    single_word_prob = {}  #记录单词词语出现的频数
    double_word_prob = {}  #记录两个词语出现的频数
    
    #按行进行计算
    for line in lines:
        #使用正则表达式提取目标内容
        temp =re.findall('\\d*[\\u4e00-\\u9fa5]+',line)
        #在句首和句尾添加特定标识符
        temp.insert(0,"<BOS>")
        temp.append('<EOS>')
        #计算两个词的概率并填入
        for i in range(1,len(temp)):
            #两个词的组合
            item = temp[i-1]+temp[i]
            if item in double_word_prob:
                double_word_prob[item]+=1
            else:
                double_word_prob[item]=1
        #计算单个词的概率并填入
        for s in temp:
            if s in single_word_prob:
                single_word_prob[s]+=1
            else:
                single_word_prob[s]=1
    return single_word_prob,double_word_prob


#将测试语句分词
def participle(single_word_prob,double_word_prob,sentence):
    '''
    input:
        param single_word_prob(dict):记录单个词的概率
        param double_word_prob(dict):记录两个连续词的概率
        param sentence(string):传入要测试的句子
    output:
        NULL   
    '''
    ans = jieba.lcut(sentence)
    ans.insert(0,'<BOS>')
    ans.append('<EOS>')
    cal_sen_prob(single_word_prob,double_word_prob,sentence,ans)

        
#计算语句的概率
def cal_sen_prob(single_word_prob,double_word_prob,sentence,ans):
    '''
    input:
        param single_word_prob(dict):记录单个词的概率
        param double_word_prob(dict):记录两个连续词的概率
        param sentence(list):原句
        param ans(list):分好词待测试的列表
    output:
        NULL
    '''
    #存放句子的概率
    res = 1
    for i in range(1,len(ans)):
        item = ans[i-1]+ans[i]
        if item in double_word_prob:
            temp=double_word_prob[item]/single_word_prob[sentence[i]]
        elif sentence[i] in single_word_prob:
            temp=1/single_word_prob[sentence[i]]
        else:
            temp=1/len(single_word_prob)
        res*=temp
    print('(',sentence,')的句子概率为:',res)
    
    
#主函数
if __name__ == '__main__':
    #分好词的语料库文件路径以及训练语料函数
    file_path = "E://大三上//自然语言//训练语料//训练语料1.txt"
    single_word_prob,double_word_prob=cal_word_prob(file_path)
    #输入n条句子
    n = input('输入你想要测试的句子个数:')
    for i in range(int(n)):
        sentence = input("请输入句子:")
        participle(single_word_prob,double_word_prob,sentence)
    

4.结果

以上是关于实验一:训练Bigram模型并预测句子概率|自然语言的主要内容,如果未能解决你的问题,请参考以下文章

n-gram语言模型

6.4 ALBERT全面理解

自然语言处理(NLP)知识整理及概述(一)

统计语言模型Python实现

预测句子中的缺失词 - 自然语言处理模型 [关闭]

实验二:基于HMM的拼音转汉字程序|自然语言