技术标签: 计算机等级二级Python python 人工智能 大数据 开发语言
目录
词频统计是自然语言处理的基本任务,针对一段句子、一篇文章或一组文章,统计文章中每个单词出现的次数,在此基础上发现文章的主题词、热词。
思路:首先定义一个空字典my_dict
,然后遍历文章(或句子),针对每个单词判断是否在字典my_dict
的key
中,不存在就将该单词当作my_dict
的key
,并设置对应的value
值为1;若已存在,则将对应的value
值+1。
#统计单句中每个单词出现的次数
news = "Xi, also general secretary of the Communist Party of China (CPC) Central Committee and chairman of the Central Military Commission, made the remarks while attending a voluntary tree-planting activity in the Chinese capital's southern district of Daxing."
def couWord(news_list):
##定义计数函数 输入:句子的单词列表 输出:单词-次数 的字典
my_dict = {} #空字典 来保存单词出现的次数
for v in news_list:
if my_dict.get(v):
my_dict[v] += 1
else:
my_dict[v] = 1
return my_dict
print(couWord(news.split ()))
输出
{‘Xi,’: 1, ‘also’: 1, ‘general’: 1, ‘secretary’: 1, ‘of’: 4, ‘the’: 4, ‘Communist’: 1, ‘Party’: 1, ‘China’: 1, ‘(CPC)’: 1, ‘Central’: 2, ‘Committee’: 1, ‘and’: 1, ‘chairman’: 1, ‘Military’: 1, ‘Commission,’: 1, ‘made’: 1, ‘remarks’: 1, ‘while’: 1, ‘attending’: 1, ‘a’: 1, ‘voluntary’: 1, ‘tree-planting’: 1, ‘activity’: 1, ‘in’: 1, ‘Chinese’: 1, “capital’s”: 1, ‘southern’: 1, ‘district’: 1, ‘Daxing.’: 1}
以上通过couWord方法实现了词频的统计,但是存在以下两个问题。
(1)未去除stopword
输出结果中保护’also’、‘and’、'in’等stopword(停止词),停止词语与文章主题关系不大,需要在词频统计等各类处理中将其过滤掉。
(2)未根据出现次数进行排序
根据每个单词出现次数进行排序后,可以直观而有效的发现文章主题词或热词。
改进后的couWord函数如下:
def couWord(news_list,word_list,N):
#输入 文章单词的列表 停止词列表 输出:Top N的单词
my_dict = {} #空字典 来保存单词出现的次数
for v in news_list:
if (v not in word_list): # 判断是否在停止词列表中
if my_dict.get(v):
my_dict[v] += 1
else:
my_dict[v] = 1
topWord = sorted(zip(my_dict.values(),my_dict.keys()),reverse=True)[:N]
return topWord
加载英文停止词列表:
stopPath = r'Data/stopword.txt'
with open(stopPath,encoding = 'utf-8') as file:
word_list = file.read().split() #通过read()返回一个字符串函数,再将其转换成列表
print(couWord(news.split(),word_list,5))
输出
[(2, ‘Central’), (1, ‘voluntary’), (1, ‘tree-planting’), (1, ‘southern’), (1, ‘secretary’)]
(1)单篇文章词频统计
通过定义读取文章的函数,对其进行大小写转换等处理,形成输入文章的单词列表。
https://python123.io/resources/pye/hamlet.txt
以上为hamlet英文版文本的获取路径,下载完成后保存到工程路径下。
使用open()函数打开hamlet.txt文件,并使用read()方法读取文件内容,将文本保存在txt变量中。
def readFile(filePath):
#输入: 文件路径 输出:字符串列表
with open(filePath,encoding = 'utf-8') as file:
txt = file.read().lower() #返回一个字符串,都是小写
words = txt.split() #转换成列表
return words
filePath = r'Data/news/hamlet.txt'
new_list = readFile(filePath) #读取文件
print(couWord(new_list,word_list,5))
接下来,我们需要对文本进行预处理,去除标点符号、分割成单词等。我们可以使用正则表达式来实现这一步骤。
import re
# 去除标点符号
text = re.sub(r'[^\w\s]', '', text)
# 分割成单词
words = text.split()
我们使用re.sub()函数和正则表达式[^\w\s]来去除标点符号,然后使用split()方法将文本分割成单词,并将结果保存在words列表中。
或者:
我们的文本中含有标点和字符的噪声数据,所以要进行数据的清洗,将文档全部处理为只有我们需要的字母类型(为方便操作,用空格替换噪声数据,将文档全部转化为小写字母)
打开文件,进行读取,清洗数据,数据归档。
def getText():
txt = open("Hmlet.txt","r").read()
txt = txt.lower()
for ch in '!@#$%^&*()_/*-~':
txt = txt.replace(ch," ")
return txt
hamlet = getText()
words = hamlet.split()
counts = {}
for word in words:
counts[word] = counts.get(word,0) + 1
items = list(counts.items())
items.sort(key= lambda x:x[1],reverse=True)
for i in range(10):
word, count = items[i]
print("{0:<10}{1:>5}".format(word,count))
现在,我们已经得到了分割后的单词列表words,接下来我们需要统计每个单词出现的次数。我们可以使用Python的字典数据结构来实现词频统计。
word_counts = {}
for word in words:
if word in word_counts:
word_counts[word] += 1
else:
word_counts[word] = 1
这段代码中,我们首先创建一个空字典word_counts,然后遍历words列表中的每个单词。对于每个单词,如果它已经在word_counts字典中存在,则将对应的计数值加1;否则,在字典中新增一个键值对,键为单词,值为1。
在统计完词频后,我们需要按照词频降序排序,以便后续输出结果。我们可以使用Python的内置函数sorted()来实现排序。
sorted_word_counts = sorted(word_counts.items(), key=lambda x: x[1], reverse=True)
我们使用word_counts.items()方法获取word_counts字典中的所有键值对,并使用key=lambda x: x[1]指定按照键值对中的值进行排序,reverse=True表示降序排列。排序结果将保存在sorted_word_counts列表中。
最后,我们将词频统计结果输出到控制台或文件中。
for word, count in sorted_word_counts:
print(f'{word}: {count}')
这段代码中,我们使用for循环遍历sorted_word_counts列表中的每个元素(每个元素是一个键值对),并使用print()函数输出单词和对应的词频。
(2)多篇文章词频统计
需要使用os.listdir
方法读取文件夹下的文件列表,然后对文件逐一进行处理。
import os
folderPath = r'Data/news' #文件夹路径
tmpFile = os.listdir(folderPath)
allNews = []
for file in tmpFile: #读取文件
newsfile = folderPath + '//' + file #拼接完整的文件路径 \\ 转义字符
allNews += readFile(newsfile) #把所有的字符串列表拼接到allText中
print(couWord(allNews,word_list,5))
输出
[(465, ‘china’), (323, ‘chinese’), (227, ‘xi’), (196, “china’s”), (134, ‘global’)]
(3)中文文章的处理
对于中文文章的词频统计,首先要使用jieba
等分词器对文章进行分词,并且加载中文的停止词列表,再进行词频统计。
利用jieba库,进行中文分词,将其存入列表words中,遍历,将词组和词频作为键值对存入列表counts中,利用列表的有序性,进行排序,然后输出
https://python123.io/resources/pye/threekingdoms.txt
以上为三国演义中文版文本获取链接,下载后保存到工程路径下
import jieba
txt = open("threekingdoms.txt","r",encoding="utf-8").read()
counts = {}
words = jieba.lcut(txt)
for word in words:
if len(word) == 1:
continue
else:
counts[word] = counts.get(word,0) + 1
items = list(counts.items())
items.sort(key = lambda x:x[1] , reverse=True)
for i in range(15):
word , count = items[i]
print("{0:<10}{1:>5}".format(word,count))
该方法比英文哈姆雷特词频简单,不用去处理字符类噪声数据,这也得益于jieba库的简易操作。
但随之带来的是词频的模糊,因为jieba库的特性,导致不是人名的词组也被统计了进来。
如结果中的“二人”、”孔明曰“,这些都是冗余和词组问题的错误。
所以我们应该还需要进行进一步的处理,让词频统计人物的名字次数
经过前几步的操作,我们输出了出现频率最高的15给词组,可我们如果想要人物的出场频率呢? 这就需要对原文件进行过滤,把我们不需要的输出删除。
因为之前的输出可以简单的获取到出现频率高但不是人名的词组,所以我们这里把它们储存到一个集合中,遍历并删除原文件中存在的这些词组。
excludes = {"将军","却说","二人","不可","荆州","不能","如此","商议","如何","主公","军士","左右","军马"}
for i in excludes:
del counts[i]
冗余处理:把出现频率高的相同人物别名进行统一
elif word == "诸葛亮" or word == "孔明曰":
rword = "孔明"
elif word == "关公" or word == "云长":
rword = "关羽"
elif word == "玄德" or word == "玄德曰":
rword = "刘备"
elif word == "孟德" or word == "丞相":
rword = "曹操"
反复的经过这些处理,我们可以得到我们想要的输出
import jieba
txt = open("threekingdoms.txt","r",encoding="utf-8").read()
counts = {}
excludes = {"将军","却说","二人","不可","荆州","不能","如此","商议","如何","主公","军士","左右","军马"}
words = jieba.lcut(txt)
for word in words:
if len(word) == 1:
continue
elif word == "诸葛亮" or word == "孔明曰":
rword = "孔明"
elif word == "关公" or word == "云长":
rword = "关羽"
elif word == "玄德" or word == "玄德曰":
rword = "刘备"
elif word == "孟德" or word == "丞相":
rword = "曹操"
else:
rword = word
counts[rword] = counts.get(rword,0) + 1
for i in excludes:
del counts[i]
items = list(counts.items())
items.sort(key = lambda x:x[1] , reverse=True)
for i in range(7):
word,count = items[i]
print("{0:<10}{1:>5}".format(word,count))
1 2 3 4 5 6 7 8 9 |
|
说明:运用集合对文本字符串列表去重,这样统计词汇不会重复,运用列表的counts方法统计频数,将每个词汇和其出现的次数打包成一个列表加入到word_list中,运用列表的sort方法排序,大功告成。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 |
|
文章浏览阅读8.2k次,点赞6次,收藏4次。刚开始按报错的提示安装pillow==4.0.0版本的,就报上面的错误,上网上找解决方法,都未能解决,然后试着安装更高版本的pillow==10.0.0版本的,结果就成功了,我用的python版本是3.8的,估计是和python的版本与pillow版本里引用的库的兼容有关系,升级到相对应的版本就可以解决以上问题。以上供大家参考,讨论。_error: could not build wheels for pillow, which is required to install pypro
文章浏览阅读5.8w次,点赞2次,收藏7次。今天装完常用软件后,准备一键备份一下系统,就从一键GOST官网下载安装了一键GHOST,安装完成之后提示不支持UEFI+GPT格式系统,但仍可以使用,就没在意,也没卸载,接着就重启电脑试一试,结果就出现了无法进入系统引导的情况。 折腾一番BIOS之后,发现只需要按F7(我的笔记本主板选择启动方式或者说选择启动盘的快捷键是F7键,具体哪个按键根据自己电脑主板选择),选择windows_一键ghost不支持uefi+gpt
文章浏览阅读339次。—Xss:规定了每个线程虚拟机栈的大小,会影响此进程中并发的线程数。—Xms:堆得初始值。—Xmx:堆能达到的最大值。一般Xms与Xmx的值设置的一样大小,当堆不够用进行扩容时会发生内存抖动,影响程序运行的稳定性。..._jvm三大性能调优参数
文章浏览阅读884次。写一个按钮,点击事件,然后:1.调用代码: openCamera(this);2.粘贴以下代码实现拍照 public void openCamera(Activity activity) { //獲取系統版本 int currentapiVersion = android.os.Build.VERSION.SDK_INT; // 激活相机 Intent intent = new Intent(MediaStore.ACT.._android studio如何调用摄像头
文章浏览阅读321次。DragonBones发布后的动画,加载到Egret中场景中,原点的位置在哪呢?DragonBones中的图片位置导出加载到Egret中。可见DragonBones中的图片位置原点左下方(0,0)对应着Egret中的左上角(0,0)将DragonBones中的图片位置调整到左上导出发布到Egret中,圆球..._龙骨动画里如何更改中心点
文章浏览阅读1.6k次。Cow ContestTime Limit: 1000MSMemory Limit: 65536KTotal Submissions: 8986Accepted: 5045DescriptionN (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are partici_poj 3660 并查集
文章浏览阅读132次。安装准备环境需求:安装vcenter需要域环境,因此要先安装域控(有些功能比如horizon view需要用到域环境),学习环境可以用一台虚拟机做域控。建议将域控和vcenter服务器分别装在不同的服务器上,生产环境应该尽量在物理服务器上安装vcenter服务器,这里学习环境我们就在虚拟机上安装vcenter管理程序。安装vcenter需要最低2核CPU,8G内存本例中采用一..._使用命令行从vcenter 6.0或更高版本的服务器设备或外部平台服务控制器中收集支持
文章浏览阅读1.9k次。5.1 存储器基本概念存储器的分类按存取方式分:随机、顺序、直接、相联按存储介质分:半导体、磁表面、激光盘按信息可更改性:可读可写、只读按断电后可否保存:易失、非易失按功能/容量/速度分:寄存器、Cache、主存(内存)、辅存(外存)解决内存访问速度慢的措施:1、提高主存芯片本身的速度2、在主存和CPU之间加入Cach..._内存储器是按字长编址
文章浏览阅读1.2k次,点赞27次,收藏29次。错误。看了网上的一些博客,并follow了解决方案,结果导致误删文件。误删该文件以后,因为很多功能不可用,所以又脑残的把系统重启了,然后,,,,,,,就进不了系统了。文件误删并重启后,在进入系统的过程中出现一个白色光标在屏幕左上角闪动,然后就一直闪动而无法进入系统,(在出现白色光标之前,可以打开BIOS)。_linux libstdc++.so.文件
文章浏览阅读487次。allegro等长走线_等长线路径上有元器件
文章浏览阅读410次。目录 Typora官方Markdown教程翻译 概述 块级元素 段落和换行符 标题 引文区块 列表 任务列表 (隔绝的)代码区块 数学区块 表格 脚注 ..._typora翻译
文章浏览阅读214次。23-295、STM32单片机直流电压检测报警系统设计-分压-LCD1602-声光BELL-WiFi本系统由STM32单片机核心板、电压采集、LCD1602液晶、蜂鸣器、LED灯、WiFi模块组成。1、通过单片机检测电压(15V内)并在1602液晶上显示。2、电压显示最小单位0.01V。3、将液晶显示的数据通过WiFi模块实时上传到手机WiFi串口助手APP。4、当检测电压超过电压阈值则声光报警。5、通过手机APP发送直流可以设置阈值。wifi命令:*SV1234# //设置为12.34