1、 基于训练语料,训练一个基于字的Bigram语言模型。当用户输入某个字序列,程序可以自动推荐该序列的后一个字(依次列出概率最大的5个可能字选项),根据提示用户选择某个字后,程序可以继续推荐下一个字的列表。例如:输入“长江大”,程序猜测下一个可能的字为“桥”、“河”、“学”、“道”等。
要求:(1)要求至少使用一种平滑方法。(2)提交电子文档一份(word),内含两部分内容:程序源码文本,程序运行结果截图(至少包含三个测试语句运行结果);(3)同时提交源程序文件(可采用任意语言开发)。
在这里我使用的是美团评论的数据集,具体地址找不到了。主要是为我们国创项目来学一些比较新的东西,然后基于老师的作业来做的一些东西。希望大家只是借鉴,要有自己的灵感,也欢迎交流!后续会周更
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1.#构建数据库,并将最终数据库保存为一个npy文件!
2.doubleWords = {}  
3.def train02(filename):  
4.    doubleWords_pre={}  
5.    f=open(filename,encoding='utf-8')  
6.    #一共有多少个句子  
7.    num=0  
8.    for line in f.readlines():  
9.        # 匹配所有中文形成一个list包,按符号分割出所有的字符  
10.        line1 = re.findall('[\u4e00-\u9fa5]+', line)  
11.        for words in line1:  
12.            #存前一个字符  
13.            words1='B'+words+'E'  
14.            pre=' '  
15.            #计算一个字的频数和两个字连续出现的频数  
16.            for word in words1:  
17.                if pre != ' ':  
18.                    if pre in doubleWords_pre:  
19.                        if word in doubleWords_pre[pre]:  
20.                            doubleWords_pre[pre][word]+=1  
21.                        else:  
22.                            doubleWords_pre[pre][word]=1  
23.                    else:  
24.                        doubleWords_pre[pre]={}  
25.                pre=word  
26.            num+=1  
27.    f.close()  
28.    # 保存初始概率文件  
29.    np.save("data/doubleWords_pre", doubleWords_pre)  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1.#采用平滑处理方法+二元文法  
2.def fun1(worda ,wordb):  
3.    if worda in doubleWords:  
4.        if wordb in doubleWords[worda]:  
5.            sum=0  
6.        else:  
7.            doubleWords[worda][wordb]=0  
8.    else:  
9.        doubleWords[worda]={}  
10.        doubleWords[worda][wordb]=0  
11.    fenzi=doubleWords[worda][wordb]+1  
12.    fenmu=0  
13.    for key in doubleWords[worda]:  
14.        fenmu=fenmu+doubleWords[worda][key]+1  
15.    doubleWords[worda][wordb]+=1  
16.    return (fenzi/fenmu)  
17.  
18.#采用二元文法计算概率,需要自己加'B'和'E':  
19.def fun(word):  
20.    sum=1.0  
21.    for i in range(len(word)-1) :  
22.        sum=sum*fun1(word[i],word[i+1])  
23.    return sum  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1.#预测结果  
2.def predict(word):  
3.    preRes={}  
4.    str=word[len(word)-1]  
5.    s = sum(doubleWords[str].values())  
6.    for key in doubleWords[str]:  
7.        if key=='E':continue  
8.        str1=str+key+'E'  
9.        preRes[key]=fun(str1)  
10.    return preRes  
11.  
12.#将预测结果排序,选取前五个  
13.def Paixu(word):  
14.    Result=[]  
15.    preRes=predict(word)  
16.    preRes = sorted(preRes.items(), key=lambda x: x[1], reverse=True)  
#这考虑了语料库不足的情况!
17.    for i in range(min(5,len(preRes)):  
18.        Result.append(preRes[i][0])  
19.    return Result