当前位置:   article > 正文

文本数据挖掘与Python应用例子4.3代码 p91(朴素贝叶斯文本分类)

文本数据挖掘与python应用
  1. from numpy import *
  2. #朴素贝叶斯算法
  3. """
  4. 函数1:创建实验样本
  5. 功能说明:将文本切分成词条
  6. 返回值说明:trainData是词条,labels则是词条对应的分类标签
  7. """
  8. def loadDataSet():
  9. trainData=[['我的','狗','有','跳蚤','问题','帮助','请'],
  10. ['可能', '不会', '使得', '它的', '到', '狗', '公园', '愚蠢'],
  11. ['我的', '斑点狗', '是', '也', '机灵', '我', '喜欢', '它'],
  12. ['停止', '张贴', '愚蠢', '毫无价值', '垃圾'],
  13. ['先生', '舔', '吃', '我的', '牛排', '怎么做', '到', '停下', '它'],
  14. ['退出', '购买', '毫无价值', '狗', '食物', '愚蠢']]
  15. labels=[0,1,0,1,0,1] #1表示侮辱性言论,0表示正常言论
  16. return trainData,labels
  17. #生成词汇表
  18. '''
  19. 函数2:制作词汇表
  20. 函数说明:将切分的实验样本词条整理成不重复的词条列表,也就是词汇表
  21. 参数说明:dataSet是上面的trainData,也就是重复的词条样本集,而vocalList则是无重复的词汇表
  22. '''
  23. def createVocabList(trainData):
  24. VocabList=set([])
  25. for item in trainData:
  26. VocabList=VocabList|set(item)
  27. return sorted(list(VocabList))
  28. '''
  29. 函数3:词汇向量化
  30. 函数说明:根据vocabList词汇表(也就是上面函数制作的词汇表),将trainData(输入的词汇)向量化,响亮的每个元素为1或0,如果词汇表中有这个单词则置1,没有则置0
  31. 参数说明:最后返沪的是文档向量
  32. 功能:对训练数据集生成只包含0和1的向量集
  33. '''
  34. def createWordSet(VocabList,trainData):
  35. VocabList_len=len(VocabList)#词汇及的长度
  36. trainData_len=len(trainData)#训练数据的长度
  37. WordSet=zeros((trainData_len,VocabList_len))#生成行长度为训练数据的长度,列长度为词汇集的长度的列表
  38. for index in range(0,trainData_len):
  39. for word in trainData[index]:
  40. if word in VocabList:#训练数据包含的单词对应的位置为1,其他为0
  41. WordSet[index][VocabList.index(word)]=1
  42. return WordSet
  43. '''
  44. 函数4:朴素贝叶斯分类器训练函数
  45. 函数说明:利用朴素贝叶斯求出分类概率,也可以说是求出先验概率
  46. 参数说明:输入参数WordSet是所有样本数据矩阵,每行是一个样本,一列代表一个词条
  47. 输入参数labels是所有样本对应的分类标签,是一个向量,维数等于矩阵的行数
  48. 输出参数p0是一个向量,维数与上面相同,每个元素表示对应样本的概率
  49. 输出参数p1是一个向量,和上面那个向量互补(因为是二分类问题),每个元素对应样本的概率
  50. '''
  51. def opreationProbability(WordSet,labels):
  52. WordSet_col=len(WordSet[0])
  53. #每套样本中的词条数量
  54. labels_len=len(labels)
  55. #训练集中样本数量
  56. WordSet_labels_0=zeros(WordSet_col)
  57. WordSet_labels_1=zeros(WordSet_col)
  58. num_labels_0=0
  59. num_labels_1=0
  60. for index in range(0,labels_len):
  61. if labels[index]==0:
  62. WordSet_labels_0+=WordSet[index]
  63. num_labels_0+=1
  64. #统计正常言论的条件概率所需的数据,即P(w0|0),P(w1|0),P(w2|0),...
  65. else:
  66. WordSet_labels_1+=WordSet[index]
  67. num_labels_1+=1
  68. #统计侮辱性言论的条件概率所需的数据,即P(w0|1),P(w1|1),P(w2|1),...
  69. p0=WordSet_labels_0*num_labels_0/labels_len
  70. p1=WordSet_labels_1*num_labels_1/labels_len
  71. return p0,p1
  72. #返回侮辱性言论的条件概率数组,正常言论的条件概率数组
  73. '''
  74. 主程序
  75. '''
  76. trainData,labels=loadDataSet()
  77. VocabList=createVocabList(trainData)
  78. train_WordSet=createWordSet(VocabList,trainData)
  79. p0,p1=opreationProbability(train_WordSet,labels)
  80. #到此算是训练完成
  81. #开始测试
  82. print()
  83. testData1=[['喜欢','我的','斑点狗']]#测试样本1
  84. #原书上这里是单括号,但是要正常运行需要输入一个二维数组
  85. print("测试样本1['喜欢','我的','斑点狗']",end="")
  86. test_WordSet=createWordSet(VocabList,testData1)#测试数据的向量集
  87. res_test_0=sum(p0*test_WordSet)
  88. res_test_1=sum(p1*test_WordSet)
  89. if res_test_0>res_test_1:
  90. print("属于0类别,即为正常言论")
  91. else:
  92. print("属于1类别,即为侮辱性言论")
  93. testData2=[['愚蠢','垃圾']]
  94. #同样这里书上也是单括号,需要改为二维数组
  95. print("测试样本2['愚蠢','垃圾']:",end="")
  96. test_WordSet=createWordSet(VocabList,testData2)#测试数据的向量集
  97. res_test_0=sum(p0*test_WordSet)
  98. res_test_1=sum(p1*test_WordSet)
  99. if res_test_0>res_test_1:
  100. print("属于0类别,即为正常言论")
  101. else:
  102. print("属于1类别,即为侮辱性言论")

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/713390
推荐阅读
相关标签
  

闽ICP备14008679号