网站建设中的智能元素,有没有做招聘网站的,沾化网站建设,基层科普网站建设的现状之前写Python Web小书第三小节本来用的垃圾邮件的案例三郎#xff1a;Python贝叶斯推理垃圾邮件分类zhuanlan.zhihu.com后来发现里面的东西#xff0c;涉及到概率#xff0c;程序太复杂了。。。哈哈哈所以就想着#xff0c;哪天重写一下#xff0c;选来选去#xff0c;…之前写Python Web小书第三小节本来用的垃圾邮件的案例三郎Python贝叶斯推理垃圾邮件分类zhuanlan.zhihu.com后来发现里面的东西涉及到概率程序太复杂了。。。哈哈哈所以就想着哪天重写一下选来选去觉得垃圾邮件分类里面的单词统计可以深入给大家好好讲讲这个小案例。这里选用的是一部英文哈利波特小说第一部3496行443725个字符下面我们开始捋思路我们拿到的是一部有很多单词和符号的小说我们要做的事就是要对所有的单词出现的次数进行统计。第一步先读出整部小说的内容第二步对小说的内容进行清洗只保留所有的单词第三步构建字典遍历所有单词进行次数统计是不是感觉好简单那我们上路吧首先我们先读取小说的全部内容fp open(HarryPotter1.txt,r)#文件名r为读模式print(fp.read())打印输出如下我们要把上图里面的这些符号干掉有没有什么好办法呢当然有啦这就要用到我们的正则表达式代码如下import refp open(HarryPotter1.txt,r)content re.sub(\W, ,fp.read())#第一个参数\W和第二个参数空格的意思是替换所有非字符为空格print(content)同时我们发现一个单词如果在句首字母会大写比如The和the如果不处理会被理解为两个词汇。于是我们继续更新代码import refp open(HarryPotter1.txt,r)content re.sub(\W, ,fp.read())content content.lower()print(content)到现在为止我们对初始文本做了过滤标点符号和统一大小写的预处理下面就是把这个文本分割为一个个单词代码如下import refp open(HarryPotter1.txt,r)content re.sub(\W, ,fp.read())content content.lower()content content.split()print(content)现在我们得到一个包含所有单词的列表下面就可以进行单词统计了首先生成空字典word_counter然后循环遍历整个单词列表进行词数统计import refp open(HarryPotter1.txt,r)content re.sub(\W, ,fp.read())content content.lower()content content.split()word_counter {}for word in content:if word in word_counter:word_counter[word]1else:word_counter[word]1print(word_counter)因为上面看起来很别扭我想按照顺序一行行打印于是我试着做如下操作import refp open(HarryPotter1.txt,r)content re.sub(\W, ,fp.read())content content.lower()content content.split()word_counter {}for word in content:if word in word_counter:word_counter[word]1else:word_counter[word]1for (key,value) in word_counter:print(key,value)结果报错因为Dict不能同时对key和value同时遍历所以有三种方式#1.遍历键然后索引到值for key in word_counter:print(key:word_counter[key])for key in word_counter.keys():print(key:word_counter[key])#2.遍历值for value in word_counter.values():print(value)#3.遍历字典项for kv in word_counter.items():print(kv)for key,value in word_counter.items():print(key:value)于是需要将字典转化为列表也就有了如下代码import refp open(HarryPotter1.txt,r)content re.sub(\W, ,fp.read())content content.lower()content content.split()word_counter {}for word in content:if word in word_counter:word_counter[word]1else:word_counter[word]1for (key,value) in word_counter.items(): print(key,value)因为控制台太短无法全部显示所以我们保存到文件处理而且我们关注的字数统计更核心的是哪些词出现的更多于是有了如下代码import refp open(HarryPotter1.txt,r)content re.sub(\W, ,fp.read())content content.lower()content content.split()word_counter {}for word in content:if word in word_counter:word_counter[word]1else:word_counter[word]1sort_items sorted(word_counter.items(),keylambda d:d[1],reverseTrue)fpopen(result.txt,w)for (key,value) in sort_items: fp.write(key str(value)\n)然后我们要注意文件操作打开一定要关闭这里用到自动关闭的with语句于是最终的代码加了注释后如下import re#正则表达式#open函数打开文件会得到一个文件对象fpr读文件with open(HarryPotter1.txt,r) as fp:#用正则表达式对文件内容里的标点符号全部清理掉content re.sub(\W, ,fp.read())#将所有单词的大写转化为小写方便我们统一处理content content.lower()#split分割所有的单词默认是用空格做分割点#得到了一个单词列表content content.split()#我们定义一个空字典来保存我们的单词和统计次数word_counter {}#对单词列表做遍历循环每个单词for word in content:#如果字典里出现了这个单词那就次数加1if word in word_counter:word_counter[word]1#如果没出现过那就次数赋值初始化为1else:word_counter[word]1#依据每个单词出现的次数我们来对整个单词表做排序sort_items sorted(word_counter.items(),keylambda d:d[1],reverseTrue)print(sort_items)#我们为了方便后面查阅要把排序好的结果保存的文件里#新建一个文件以w写文件的模式打开这个文件with open(result.txt,w) as fp:#循环遍历我们已经排序好的单词统计次数的列表for (key,value) in sort_items:#每个单词和统计次数按照行写入到我们的文件里fp.write(key str(value)\n)旅程结束希望能够帮到你