《信息检索导论》部分实验python实现汇总请进入此博客查看。
1.实验目的
通过实验,使学生掌握多项式NB文本分类方法。
2.实验任务与要求
文本分类是信息检索系统的关键技术,多项式NB文本分类算法是有监督的基于概率的学习方法,优势是速度快,精确率很高。本实验需要编程实现这个训练和应用NB分类器的算法。
3.实验说明书
⑴功能描述
用户输入训练集中的属于类的文档和不属于类的文档,以及文档的内容;测试文档的内容。系统计算并输出测试文档的属于类和不属于类的结果。
⑵概要设计
通过概率计算模块实现NB算法的训练及分类过程。
⑶详细设计
- 总体流程图
- 概率计算模块
⑷代码实现
- 示例输入
d:document
c:class
请输入文档:Chinese Beijing Chinese
属于China类输入1,不属于输入0:1
要继续输入吗?[y|n]:y
请输入文档:Chinese Chinese Shanghai
属于China类输入1,不属于输入0:1
要继续输入吗?[y|n]:y
请输入文档:Chinese Macao
属于China类输入1,不属于输入0:1
要继续输入吗?[y|n]:y
请输入文档:Tokyo Japan Chinese
属于China类输入1,不属于输入0:0
要继续输入吗?[y|n]:n
请输入测试文档:Chinese Chinese Chinese Tokyo Japan
- 主程序
程序中while下语句用于获取用户输入的训练文档,cn用于记录属于C类的训练文档个数,lcn记录训练文档总个数。testd 所在语句获取用户输入的测试文档。
for引导的循环用于计算概率,其中PctestdPc为属于C类的概率,FPctestdFPc为不属于C类的概率,Pc为总文档中属于C类文档的概率,FPc为不属于C类文档的概率。
cn, lcn, df = 0, 0, {1: [], 0: []}
while(1):
d = input('请输入训练文档:').split(' ')
c = eval(input('属于China类输入1,不属于输入0:'))
if c == 1:
cn += 1
lcn += 1
df[c] = df[c] + d
flag = input('要继续输入吗?[y|n]:')
if flag == 'n':
break
testd = input('请输入测试文档:').split()
#df = {1: ['Chinese', 'Beijing', 'Chinese', 'Chinese', 'Chinese', 'Shanghai', 'Chinese', 'Macao'], 0: ['Tokyo', 'Japan', 'Chinese']}
#testd = ['Chinese', 'Chinese', 'Chinese', 'Tokyo', 'Japan']
testdin = set(testd)
Pc = cn/lcn
FPc = 1 - Pc
Pctestd, FPctestd = 1, 1
lc, Flc, l = len(df[1]), len(df[0]), len(set(df[1] + df[0]))
tt, Ftt = '', ''
for i in testdin:
mi = testd.count(i)
Pctestd *= ((df[1].count(i) + 1)/(lc + l))**mi
FPctestd *= ((df[0].count(i) + 1)/(Flc + l))**mi
Pctestd = round(Pctestd*Pc, 4)
FPctestd = round(FPctestd*FPc, 4)
flag = 'China' if Pctestd > FPctestd else '非China'
print('\n计算属于China的概率为{},不属于China类的概率为{},\n所以分类器将测试文档分到{}类。'.format(Pctestd, FPctestd, flag))
4.实验成果
运行程序,根据提示进行输入,得到结果如下图。
5.程序调试过程
在程序调试过程中,预设训练文档与测试文档,得到结果如下图。