1、 基于训练语料,训练一个基于字的Bigram语言模型。当用户输入某个字序列,程序可以自动推荐该序列的后一个字(依次列出概率最大的5个可能字选项),根据提示用户选择某个字后,程序可以继续推荐下一个字的列表。例如:输入“长江大”,程序猜测下一个可能的字为“桥”、“河”、“学”、“道”等。
要求:(1)要求至少使用一种平滑方法。(2)提交电子文档一份(word),内含两部分内容:程序源码文本,程序运行结果截图(至少包含三个测试语句运行结果);(3)同时提交源程序文件(可采用任意语言开发)。
在这里我使用的是美团评论的数据集,具体地址找不到了。主要是为我们国创项目来学一些比较新的东西,然后基于老师的作业来做的一些东西。希望大家只是借鉴,要有自己的灵感,也欢迎交流!后续会周更
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.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.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