Python-可视化单词统计词频统计中文分词

news2024/11/24 6:51:47

可视化单词统计词频统计中文分词

  • 项目架构
  • 新建文件
  • 单词计数
  • 全文单词索引
  • 中文分词统计词频
  • 源代码

项目架构

新建一个文件,输入文件的内容,查询此文件中关键字的出现的次数,关键字出现的位置,将所有的文本按照中文分词的词库进行切割划分,返回JSON字符串,返回中文切分的单词和出现的频次,最后关闭程序

在这里插入图片描述

新建文件

新建指定文本文件,输入一个文件名,以及里面的文件内容建立一个文本文件。通过GUIEntry控件实现一个文本框text1,作用是用来接收用户输入的文件名。

content1用来存储文件名,如果输入的文件名为空就弹出窗体显示“文件名不为空!”的提示,content2用来存储文件内容文件名有效则通过open()函数以读文件的方式打开文件。

然后使用write()将输入的文件内容写入新建好的文件中,点击新建文件按钮,弹出提示框“文件建立成功”,完成后close关闭文件。

在这里插入图片描述

输入文件名,输入一段内容,点击新建文件,成功建立文件

在这里插入图片描述

单词计数

给定单词计数,输入一个不含空格的单词,统计输出该单词在文本中的出现次数。通过GUIEntry控件实现一个文本框text1,作用是用来接收用户输入的文件名。content1用来存储文件名,如果输入的文件名为空就弹出窗体显示“文件名不为空!”的提示。

文件名有效则通过open()函数以读文件的方式打开文件。Entry控件实现一个文本框text3,作用是用来接收用户输入要查询的目标单词,count = 0 将计数器初始化为0

利用了模式匹配算法:循环读入文件,每次读入一行,逐行扫描文本文件,利用strip()去掉每行头尾空白字符,一行调用count(keyword)函数匹配到目标单词返回目标单词出现的次数count函数封装了字符串匹配,目标串P的长度为m,主串T的长度是n,枚举主串T中每一个位置i, 然后检查T[i,i+m-1]是否与目标串P完全相同,相同的就将count加一,i加一,继续往后匹配子串。

如果不同,就只将i加一,继续往后匹配子串。直到整行结束。存储下当前行目标单词出现的次数,再遍历下一行。直到整个文件扫描结束;然后输出文件中单词出现的总次数。并且关闭文件。

在这里插入图片描述

全文单词索引

查找给定单词在文件中的位置。定义content1接收text1的值,content3接收text3的值,content1用来接收用户输入的文件名,如果输入文件名为空就弹出窗体显示“文件名不能为空!”的提示。

文件名有效则通过open()函数以读文件的方式打开文件,content3用来接收用户所输入需查询的单词;使用for循环逐行进行检索,先判断输入文件名是否为空,为空则弹出错误对话框,并提示“文件名不能为空!”。

不为空则使用open()打开文件,row初始化为1,再判断文件内容是否为空,为空则row+1且跳出此层循环,不为空则使用for循环检索出用户指定单词的位置与出现次数并输出第xn次。

在这里插入图片描述

中文分词统计词频

导入jieba第三方中文分词函数库,lcut(text),精确模式,返回text分词后的列表变量使用函数lcut()进行文本处理时,英文文本的分词只需要通过空格就可以分割。而中文的文本是需要一个“词典”来实现分词jieba第三方库实现了“词典” 采取了精确模式,试图将句子最精确地切开。

words = jieba.lcut(text)将文本的分词实现切分后,返回一个分词的列表words定义counts 的空字典循环遍历分词列表,分词的长度为1 就继续遍历,否则就进行统计分词出现的次数。每一个分词作为字典中的键,出现的次数作为字典中的值counts[word] = counts.get(word, 0) + 1键值的添加,获得文件中相同字符出现的次数有word这个分词时,时返回其值,默认是0+1能够累计次数;没有word时则返回0

counts.items()字典键值对,list()转化为列表赋值给items,列表items进行按照键从小到大的顺序进行排序,在dict转化为字典输出,输出后关闭文件。

在这里插入图片描述
最后将查询的所有结果都追加到输出文件中

在这里插入图片描述

源代码

import tkinter as tk
from tkinter import messagebox, END, RIDGE
import jieba

root = tk.Tk()
root.title("单词检索统计系统")
root.resizable(False, False)
root.geometry('450x400')
root.configure(bg='white')


# 新建文件
def fun1():
    content1 = text1.get()
    content2 = text2.get('1.0', END)
    if content1 == '':
        messagebox.showerror(title='Error', message='文件名不为空!')
    else:
        file = open(r'D:\图库\183\pythonProject\com\mao\\' + content1 + '.txt', 'w', encoding='GBK')
        file.writelines(content2)
        file.write('\n')
        messagebox.showinfo(title='Success', message='新建成功!')
        file.close()


# 单词的统计
def fun2():
    content1 = text1.get()
    content3 = text3.get()
    if content1 == '':
        messagebox.showerror(title='Error', message='文件名不为空!')
    else:
        try:
            file = open(r'D:\图库\183\pythonProject\com\mao\\' + content1 + '.txt', 'r')
            if content3 != '':
                count = 0
                # 计数器初始化为0
                for line in file.readlines():
                    line = line.strip()
                    # 依次读取每行,  去掉每行头尾空白
                    count += line.count(content3)
                    # 逐行累加计数
                if count == 0:
                    messagebox.showerror(title='Error', message='没有此单词!')
                else:
                    text4.insert(tk.END, '共有 ' + str(count) + ' 个 ' + content3 + '\n')
                    with open(r"D:\图库\183\pythonProject\com\mao\text.txt", "a") as output:
                        output.write('共有 ' + str(count) + ' 个 ' + content3 + '\n')
                file.close()
            else:
                messagebox.showerror(title='Error', message='查询目标单词不为空!')
        except Exception as e:
            messagebox.showerror(title='Error', message=e)


# 单词的定位
def fun3():
    content1 = text1.get()
    content3 = text3.get()
    if content1 == '':
        messagebox.showerror(title='Error', message='文件名不为空!')
    else:
        try:
            file = open(r'D:\图库\183\pythonProject\com\mao\\' + content1 + '.txt', 'r')
            row = 1
            # 行初始化为1
            for line in file.readlines():
                # 检索每一行
                if content3 == '':
                    messagebox.showerror(title='Error', message='查询目标单词不为空!')
                    break
                else:
                    if line.count(content3):
                        # 每一行目标单词出现的次数
                        text4.insert(tk.END, '\n第' + str(row) + '行,' + str(line.count(content3)) + '次')
                        with open(r"D:\图库\183\pythonProject\com\mao\text.txt", "a") as output:
                            output.write('\n第' + str(row) + '行,' + str(line.count(content3)) + '次')
                        index_list = []
                        # 建立索引列表
                        index = line.find(content3)
                        # 找到单词所在的位置:索引号
                        while index != -1:
                            # 判断索引是否结束,并将查找到的索引号添加到索引列表中
                            index_list.append(index)
                            index = line.find(content3, index + 1)
                            # 下标下一位开始,找到word之后添加到列表中
                        text4.insert(tk.END, '\n相应位置在:')
                        for index in index_list:
                            # 遍历索引列表并输出
                            text4.insert(tk.END, str(index + 1) + ' ')
                        text4.insert(tk.END, '\n')
                        row += 1
                    else:
                        # 无法查询到单词,没有目标单词的行输出此行没有找到,进入下一行继续查找
                        row += 1
                        continue
                fun2()
        except Exception as e:
            messagebox.showerror(title='Error', message=e)


# 分词统计
def sign4():
    content1 = text1.get()

    def read(path):
        if path == '':
            messagebox.showerror(title='Error', message='文件名不为空!')
        else:
            try:
                text = open(r'D:\图库\183\pythonProject\com\mao\\' + path + '.txt', 'r')
                content = text.read()
                words = jieba.lcut(content)
                counts = {}
                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)
                counts = dict(items)
                text4.insert(tk.END, counts)
                with open(r"D:\图库\183\pythonProject\com\mao\text.txt", "a") as output:
                    output.write(str(counts))
                text.close()
            except Exception as e:
                messagebox.showerror(title='Error', message=e)

    read(content1)


# 页面布局
button1 = tk.Button(root, text='新建文件', bg='pink', font=('微软雅黑', 15), relief=RIDGE, command=fun1)
button1.place(x=0, y=0, width=100, height=80)
label1 = tk.Label(root, text='文件名:', font=('微软雅黑', 15), )
label1.grid(padx=100)
text1 = tk.Entry(root, font=('MingLiU', 13))
text1.place(x=200, width=200, height=40)

label2 = tk.Label(root, text='文件内容:', font=('微软雅黑', 15))
label2.grid(pady=25)
text2 = tk.Text(root)
text2.place(x=200, y=45, width=200, height=40)

button2 = tk.Button(root, text='单词计数', bg='pink', font=('微软雅黑', 15), relief=RIDGE, command=fun2)
button2.place(x=0, y=80, width=100, height=80)

button3 = tk.Button(root, text='单词定位', bg='pink', font=('微软雅黑', 15), relief=RIDGE, command=fun3)
button3.place(x=0, y=160, width=100, height=80)

button4 = tk.Button(root, text='分词统计', bg='pink', font=('微软雅黑', 15), relief=RIDGE, command=sign4)
button4.place(x=0, y=240, width=100, height=80)

label3 = tk.Label(root, text='查询目标:', font=('微软雅黑', 15))
label3.grid(padx=100)
text3 = tk.Entry(root, font=('MingLiU', 13))
text3.place(x=200, y=90, width=200, height=58)

label4 = tk.Label(root, text='查询结果:', font=('微软雅黑', 15))
label4.grid(pady=75)
text4 = tk.Text(root, font=('楷体', 13))
text4.place(x=200, y=160, width=200, height=200)

button5 = tk.Button(root, text='退出程序', bg='pink', font=('微软雅黑', 15), relief=RIDGE, command=root.destroy)
button5.place(x=0, y=320, width=100, height=80)
root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/47465.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运筹说 第76期 | 最短路问题

通过前面的学习,我们已经学会了图与网络问题中图的基本概念和最小树问题,本期小编带大家学习最短路问题。 一 最短路问题 最短路问题是网络理论中应用最广泛的问题之一。许多优化问题可以使用这个模型,如设备更新、管道敷设、线路安排、厂区…

tensorboard attempted to bind to port 6006,but it was already in use

我尝试运行tensorboard是遇到错误 这篇博客给了两个解决方案:

弹出 think-cell 许可证密钥窗口丨使用教程

think-cell需要使用有效的许可证密钥才能运行。每次启动 Microsoft PowerPoint 或 Microsoft Excel 时,都会检查许可证密钥。若您的系统上找不到任何有效的许可证信息,或许可证密钥即将到期,则会显示 think-cell 许可证密钥对话窗口。 thin…

UDP-糖,UDP-GlcNAc 5′-二磷酸尿嘧啶核苷-N-乙酰半乳糖胺二钠盐 UDP-N-acetylglucosamine

产品名称: UDP-GlcNAc 5′-二磷酸尿嘧啶核苷-N-乙酰半乳糖胺二钠盐 UDP-N-acetylglucosamine 产地:西安 规格:1mg 5mg 10mg 纯度:99% 用途:仅用于科研 温馨提示:仅用于科研,不能用于人体…

R语言法国足球联赛球员多重对应分析(MCA)

数据集 fooball球员在场上的位置 数据来自国际足联的视频游戏FIFA 。游戏的特点是在游戏的各个方面评价每个球员的能力。等级是量化变量(介于0和100之间),但我们将它们转换为分类变量。所有能力都被编码在4个等级:1.低/ 2.平均/ …

Spring、SpringMVC和SpringBoot

常用的java框架有: SSH组合 SpringMVCSpringHibernate SSM组合 SpringMVCSpringMybatis(流行组合) SpringBoot springCloud 权限管控框架 Shiro、SpringSecurity 一. 概念 1. Spring Spring是一个开源容器框架,可以接管web层&#xf…

显卡---显卡驱动---CUDA---Cudnn

1. 背景 最近在follow百度的CAE这篇论文时,源码需要的环境为: python 3.7 cuda: 11.0 cudnn: 8.0.4 gcc 8.2 该版本要求与我目前使用的服务器上的CUDA版本不相符合。因此搜索了一篇国外小哥的文章,讲述了如何在一台服务器上安装多个CUDA和Cud…

【MySQL】数据库机房架构与跨城容灾详解(实战篇)(MySQL专栏启动)

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

平衡搜索树——红黑树小记

文章目录红黑树定义规则操作规则平衡调整规则规则代码插入平衡调整代码左旋、右旋红黑树 定义 红黑树是一种 “平衡” 二叉 搜索树 “平衡”: 相比较于AVL树来说&#xff0c;是一种弱平衡 在红黑树中&#xff0c;任意从根到叶子的路径中&#xff0c;LEN(最长的路径)< 2*LE…

Keras深度学习实战(39)——音乐音频分类

Keras深度学习实战&#xff08;39&#xff09;——音乐音频分类0. 前言1. 数据集与模型分析1.1 数据集分析1.2 模型分析2. 歌曲流派分类模型2.1 数据加载与预处理2.2 模型构建与训练3. 聚类分析小结系列链接0. 前言 音乐音频分类技术能够基于音乐内容为音乐添加类别标签,在音乐…

爬虫基本原理

爬虫基本原理 网络爬虫的本质 爬虫是模仿用户在浏览器或者某个应用上的操作&#xff0c;把操作的过程实现自动化的程序 数据的传输是由客户端和服务器来进行交互的&#xff0c; 他们进行交互的层是传输层&#xff0c;遵守TIP/IP协议 我们在查询一个网址之后发生了四个步骤 …

spring复习05,spring整合mybatis,声明式事务

spring复习05,spring整合mybatis,声明式事务spring整合mybatis1. 在pom.xml中导入依赖2. 创建实体类3. 创建Mapper接口4. 配置mybatis核心配置文件5. 编写映射文件Mapper.xml6. 编写数据源配置7. sqlSessionFactory8. sqlSessionTemplate9. 需要给接口加实现类10. 将实现类注入…

JavaScript获取DOM元素相关信息和属性

getBoundingClientRect 获取到元素盒模型的一些信息,得到的结果是没有单位的,不包含滚动条的距离,不包含margin&#xff0c;包含border和padding width 宽度&#xff08;包含边框&#xff09; height 高度&#xff08;包含边框&#xff09; left 从元素最左边到可视区最左边距…

Ansible 企业级自动化运维实战

一、Ansible 简介 如果Ansible不采用0mq(ZeroMQ),在操作1000个以下的节点性能还可以,如果操作1000个以上的节点,性能就很差。 目前来说Ansible支持local,ssh,0mq,Ansible用ssh来管理被管理主机是最常见的方法。 saltstack简称salt,默认采用0mq(ZeroMQ),支持数万…

[附源码]Python计算机毕业设计Django大学生心理健康测评系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【Java】并发模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pt4IAyjj-1669730661631)(https://gitee.com/github-25970295/blogpictureV2/raw/master/java-concurrent-overview-1.png)] 1. 并发问题的根源 可见性&#xff1a;一个线程对共享变量的修改&#xf…

GIT error: Committing is not possible because you have unmerged files.

翻译&#xff1a;错误:无法提交&#xff0c;因为您有未合并的文件。 git 上传文件报错原因&#xff1a; 远程仓库的文件与在本地被删除了&#xff0c;本地删除文件后重新创建一个相同文件名的文件 远程仓库&#xff1a; 解决方法&#xff1a; 代码重新提交&#xff0c;重新合…

xv6---Lab2: system calls

目录 参考资料&#xff1a; 2.1 抽象物理资源 2.2 特权模式与系统调用 2.3 内核的组织 2.5 进程概览 2.6 Code: 启动xv6&#xff0c;第一个进程和系统调用 4.2 Trap from user space System call tracing 关于syscall函数的代码 每个syscall是由usys.pl自动生成为us…

SAP 异常现象之同一个IDoc可以被POST两次触发2张不同的物料凭证

SAP 异常现象之同一个IDoc可以被POST两次触发2张不同的物料凭证 玩过SAP IDoc的童鞋都知道&#xff0c;一个IDoc正常情况下是只能被POST一次的&#xff0c;不可以POST两次的。 比如如下的IDoc 0000000205423126已经被POST了&#xff0c;其状态为53&#xff0c; Material Docume…

2-FreeRTOS编码标准、风格指南

1- 编码标准 FreeRTOS源文件(对所有端口通用&#xff0c;但对端口层不通用)符合MISRA编码标准指南。使用pc-lint和链接lint配置文件检查遵从性。由于标准有很多页长&#xff0c;并且可以从MISRA处以非常低的费用购买&#xff0c;所以我们在这里没有复制所有的规则。 就是下面这…