用python简单集成一个分词工具

本部分记录如何利用Python进行分词工具集成,集成工具可以实现运行无环境要求,同时也更方便。
该文章主要是记录,知识点不是特别多,欢迎访问个人博客:https://blog.jiumoz.top/archives/fen-ci-gong-ju-ji-cheng

成品展示

软件链接:https://cloud.189.cn/web/share?code=BN3yYvIJfUfq(访问码:vvw4)

大家要是想体验的话,就下载了试试吧,有点大,主要是pyqt5太大了,好几百兆…

用的是天翼云,百度云盘有众所周知的原因,阿里云盘不能分享压缩包…

  • 软件包含分词词性标注自定义停用词表文件导出等功能,但是也依旧不够智能,比如不能自己设置很多参数、文件保存的格式…

image-20220501105723685

工具介绍

都是python工具包,pip安装就行。

  • GUI界面主要构成是PyQt5
  • 核心功能是分词是jieba
  • 打包有很多方式,这里使用两种方式,一种是利用cx_Freeze;另一种是pyinstaller

开始简单的试验

首先实现简单的手工输入语句并完成分词与输出

主要的代码编写

  • 借Python实现简单GUI程序中相关的内容,我们直接修改相关内容确定最后的窗体页面:
image-20220501141311160
  • 关键代码,借jieba分词中的内容,我们导入jieba包后直接集成,主要函数代码如下:
def cut(self):self.equal.clear()print(self.first.toPlainText())text = self.first.toPlainText()words = jieba.lcut(text)print(words)word = ""for i in words:word = word+" "+iself.equal.append(word)
  • 测试效果:
image-20220501141824470
  • 完整代码:
# -*- coding: utf-8 -*-
# @Time : 2022/5/1 11:52
# @Author : MinChess
# @File : test2.py
# @Software: PyCharm
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import jiebaclass test(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle("test")self.show()self.resize(1200,900)self.setMinimumSize(1200,900)alllayout = QVBoxLayout()vlayout = QHBoxLayout()vlayout2 = QHBoxLayout()self.addbtn = QPushButton("开始处理")self.addbtn.setFixedHeight(66)self.addbtn.clicked.connect(self.cut)self.addbtn.setStyleSheet("font-size:36px;")self.first = QTextEdit()self.equal = QTextEdit()self.equal.setReadOnly(True)vlayout.addWidget(self.addbtn)vlayout2.addWidget(self.first)vlayout2.addWidget(self.equal)alllayout.addLayout(vlayout)alllayout.addLayout(vlayout2)self.setLayout(alllayout)def cut(self):self.equal.clear()print(self.first.toPlainText())text = self.first.toPlainText()words = jieba.lcut(text)print(words)word = ""for i in words:word = word+" "+iself.equal.append(word)if __name__ == '__main__':app = QApplication(sys.argv)ex = test()ex.show()sys.exit(app.exec_())

集成为exe

这里主要介绍cx_Freeze集成的方法

  • pip install cx_freeze安装打包的库
  • 编写配置文件
# -*- coding: utf-8 -*-
# @Time : 2021/12/1 20:44
# @Author : MinChess
# @File : setup.py
# @Software: PyCharm 
import sys
from cx_Freeze import setup, Executable
build_exe_options = {"packages": ["os"]}
base = None
if sys.platform == "win32":base = "Win32GUI"
setup(name="九陌斋分词",version="0.1",description="My GUI application!",options={"build_exe": build_exe_options},executables=[Executable("xxx.py", base=base)])
  • 到该目录下通过python setup.py build运行该程序即可完成集成

完整分词工具的编写

  • 首先得确定方案与路线
  1. 首先得有GUI界面:得有按钮 得有显示字符串的框…
  2. 核心代码:有了界面就得思考如何实现了,比如如何获取文件 如何输出 如何执行分词
  3. 事件通信:事件通信就是思考如何将事件绑定起来,也就是点击对应按钮执行我们想要的功能
  4. 测试与集成:写完代码就需要不断的测试,直到没有bug再集成成为EXE文件
  • 这里不做详细的代码拆分介绍,贴出完整代码如下,资料包点击链接即可获取

代码包(主程序、集成程序、图标文件、停用词表):https://cloud.189.cn/web/share?code=ZBZvqeBBz6Jb(访问码:0wri)

# -*- coding: utf-8 -*-
# @Time : 2021/12/1 20:44
# @Author : MinChess
# @File : jieba_cut.py
# @Software: PyCharm 
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import re
import jieba
import jieba.posseg
from collections import Counterclass Jieba_Main_Window(QWidget):sig = pyqtSignal()def __init__(self):super().__init__()self.initUI()sys.stdout = Stream(newText=self.onUpdateText)self.timer = QTimer(self)self.timer.timeout.connect(self.__openByIODevice)def onUpdateText(self, text):cursor = self.info_content.textCursor()cursor.movePosition(QTextCursor.End)cursor.insertText(text)self.info_content.setTextCursor(cursor)self.info_content.ensureCursorVisible()def initUI(self):self.setWindowTitle('九陌斋-Jieba分词')self.setWindowIcon(QIcon('favicon.ico'))self.show()self.resize(1200, 900)  # 宽×高self.setMinimumSize(1200, 900)alllayout = QHBoxLayout()vlistsum = QHBoxLayout()vlistlayout = QVBoxLayout()v00layout = QVBoxLayout()v01layout = QVBoxLayout()v10layout = QVBoxLayout()v11layout = QVBoxLayout()v0layout = QVBoxLayout()v1layout = QVBoxLayout()self.choose_file = QPushButton("文件选择")self.choose_file.setStyleSheet('''QPushButton{font-size:18px;color:white;font-weight:bold;}QPushButton{background:#2ca9e1;border-radius:5px;}QPushButton:hover{background:#84a2d4;}''')self.choose_file.setFixedHeight(32)self.choose_file.clicked.connect(self.on_actQFile_Open_triggered)self.choose_save = QPushButton("文件保存")self.choose_save.clicked.connect(self.QFile_Save)self.choose_save.setStyleSheet('''QPushButton{font-size:18px;color:white;font-weight:bold;}QPushButton{background:#2ca9e1;border-radius:5px;}QPushButton:hover{background:#84a2d4;}''')self.choose_save.setFixedHeight(32)# self.choose_save.clicked.connect(self.QFile_Save)self.start_clean = QPushButton("开始处理")self.start_clean.clicked.connect(self.jieba_cut)self.start_clean.setStyleSheet('''QPushButton{font-size:18px;color:white;font-weight:bold;}QPushButton{background:#2ca9e1;border-radius:5px;}QPushButton:hover{background:#84a2d4;}''')self.start_clean.setFixedHeight(32)self.cut_word_list = QPushButton("默认列表")self.cut_word_list.clicked.connect(self.default_cut_list)self.cut_word_list.setStyleSheet('''QPushButton{font-size:18px;color:white;font-weight:bold;}QPushButton{background:#2ca9e1;border-radius:5px;}QPushButton:hover{background:#84a2d4;}''')self.cut_word_list.setFixedHeight(32)self.default_clean = QPushButton("帮助文档")self.default_clean.setStyleSheet('''QPushButton{font-size:18px;color:white;font-weight:bold;}QPushButton{background:#2ca9e1;border-radius:5px;}QPushButton:hover{background:#84a2d4;}''')self.default_clean.setFixedHeight(32)self.default_clean.clicked.connect(self.help_info)self.file_name = QLabel('文件名称:')self.file_name_path = QLineEdit()self.lab_rules = QLabel('文件内容:')self.rules_content = QTextEdit()self.stop_words_rules = QLabel('停用词列表:')self.stop_words_content = QTextEdit()self.file_name_path.setReadOnly(True)self.file_content_name = QLabel('分词结果:')self.file_content = QTextEdit()self.save_file_fenci = QPushButton("分词结果保存")self.save_file_fenci.clicked.connect(self.on_actQFile_Save_triggered)self.save_file_fenci.setStyleSheet('''QPushButton{font-size:18px;color:white;font-weight:bold;}QPushButton{background:#2ca9e1;border-radius:5px;}QPushButton:hover{background:#84a2d4;}''')self.save_file_fenci.setFixedHeight(36)self.lab_info = QLabel('信息输出(输出系统提示信息):')self.info_content = QTextEdit()self.info_content.setReadOnly(True)self.info_content.setStyleSheet("font-size:18px;color:#003399")self.lab_finish = QLabel('词性标注结果(不建议使用文件保存,各方面问题还在解决中):')self.finishi_content = QTextEdit()self.save_file = QPushButton("词性标注结果保存")self.save_file.clicked.connect(self.on_actQFile_Save_triggered2)self.save_file.setStyleSheet('''QPushButton{font-size:18px;color:white;font-weight:bold;}QPushButton{background:#2ca9e1;border-radius:5px;}QPushButton:hover{background:#84a2d4;}''')self.save_file.setFixedHeight(36)v00layout.addWidget(self.choose_file)v00layout.addWidget(self.choose_save)v00layout.addWidget(self.start_clean)v00layout.addWidget(self.cut_word_list)v00layout.addWidget(self.default_clean)v00layout.addWidget(self.file_name)v00layout.addWidget(self.file_name_path)v00layout.addWidget(self.lab_rules)v00layout.addWidget(self.rules_content)vlistlayout.addWidget(self.stop_words_rules)vlistlayout.addWidget(self.stop_words_content)vlistsum.addLayout(v00layout)vlistsum.addLayout(vlistlayout)vlistsum.setStretchFactor(v00layout,5)vlistsum.setStretchFactor(vlistlayout,3)v01layout.addWidget(self.file_content_name)v01layout.addWidget(self.file_content)v01layout.addWidget(self.save_file_fenci)v10layout.addWidget(self.lab_info)v10layout.addWidget(self.info_content)v11layout.addWidget(self.lab_finish)v11layout.addWidget(self.finishi_content)v11layout.addWidget(self.save_file)v0layout.addLayout(vlistsum)v0layout.addLayout(v10layout)v0layout.setStretchFactor(vlistsum,7)v0layout.setStretchFactor(v10layout,3)v1layout.addLayout(v01layout)v1layout.addLayout(v11layout)alllayout.addLayout(v0layout)alllayout.addLayout(v1layout)alllayout.setStretchFactor(v0layout,4)alllayout.setStretchFactor(v1layout,3)self.setLayout(alllayout)def __openByIODevice(self, fileName):fileDevice = QFile(fileName)if not fileDevice.exists():return Falseif not fileDevice.open(QIODevice.ReadOnly | QIODevice.Text):return Falsetry:self.rules_content.clear()while not fileDevice.atEnd():qtBytes = fileDevice.readLine()  # 返回QByteArray类型pyBytes = bytes(qtBytes.data())  # QByteArray转换为bytes类型lineStr = pyBytes.decode("utf-8")  # bytes转换为str型lineStr = lineStr.strip()  # 去除结尾增加的空行self.rules_content.append(lineStr)finally:fileDevice.close()return Truedef on_actQFile_Open_triggered(self):curPath = QDir.currentPath()title = "打开一个文件"filt = "文本文件(*.txt);;csv文件(*.csv);;程序文件(*.h *.py);;所有文件(*.*)"  # 文件过滤器fileName, flt = QFileDialog.getOpenFileName(self, title, curPath, filt)if (fileName == ""):returnif self.__openByIODevice(fileName):self.file_name_path.setText(fileName)print("文件已打开!")else:print("错误", "打开文件失败")def __saveByIODevice(self,fileName):  ##用QFile保存文件fileDevice = QFile(fileName)if not fileDevice.open(QIODevice.WriteOnly | QIODevice.Text):return Falsetry:text = self.rules_content.toPlainText()  # 返回str类型strBytes = text.encode("utf-8")  # str转换为bytes类型fileDevice.write(strBytes)  # 写入文件finally:fileDevice.close()return Truedef saveByIODevice(self,fileName):  ##用QFile保存文件fileDevice = QFile(fileName)if not fileDevice.open(QIODevice.WriteOnly | QIODevice.Text):return Falsetry:text = self.file_content.toPlainText()  # 返回str类型strBytes = text.encode("utf-8")  # str转换为bytes类型fileDevice.write(strBytes)  # 写入文件finally:fileDevice.close()return Truedef on_actQFile_Save_triggered(self):curPath = QDir.currentPath()  # 获取系统当前目录title = "另存为一个文件"  # 对话框标题filt = "文本文件(*.txt);;Python程序(*.py);;文本文件(*.xlsx);;csv文件(*.csv);;所有文件(*.*)"  # 文件过滤器fileName, flt = QFileDialog.getSaveFileName(self, title, curPath, filt)if (fileName == ""):returnif self.saveByIODevice(fileName):print("文件保存成功:",fileName)else:print("错误", "保存文件失败")# QMessageBox.critical(self, "错误", "保存文件失败")def saveByIODevice2(self,fileName):  ##用QFile保存文件fileDevice = QFile(fileName)if not fileDevice.open(QIODevice.WriteOnly | QIODevice.Text):return Falsetry:text = self.finishi_content.toPlainText()  # 返回str类型strBytes = text.encode("utf-8")  # str转换为bytes类型fileDevice.write(strBytes)  # 写入文件finally:fileDevice.close()return Truedef on_actQFile_Save_triggered2(self):curPath = QDir.currentPath()  # 获取系统当前目录title = "另存为一个文件"  # 对话框标题filt = "文本文件(*.txt);;Python程序(*.py);;文本文件(*.xlsx);;csv文件(*.csv);;所有文件(*.*)"  # 文件过滤器fileName, flt = QFileDialog.getSaveFileName(self, title, curPath, filt)if (fileName == ""):returnif self.saveByIODevice2(fileName):print("文件保存成功:",fileName)else:print("错误", "保存文件失败")# QMessageBox.critical(self, "错误", "保存文件失败")def QFile_Save(self):fileName = self.file_name_path.text()if fileName == "":print("你没有打开任何文件......")if self.__saveByIODevice(fileName):print("保存成功!\n文件路径:",fileName)else:print("保存文件失败")def help_info(self):QMessageBox.about(self, "提示信息:", "分词模块主要利用jieba分词工具对文本数据进行分词处理,同时还加入了去停用词功能,即去掉一些无意义的词条,支持自定义停用词词表!这一个大模块的功能非常重要,因为词频统计、LDA主题模型等多个方面都是基于词语展开的!同时分词功能中还加入了多个模式的分词。")def jieba_cut(self):self.finishi_content.clear()self.file_content.clear()cut_words = ""cut_words2 = ""all_words = ""cut_re = ""line = self.rules_content.toPlainText()cut_word_list = self.stop_words_content.toPlainText().split()cut = set(cut_word_list)if line == "":print("待处理文件为空!!!")elif self.stop_words_content.toPlainText() == "":print("请设置停用词列表,可点击默认列表使用系统列表!")else:line.strip('\n')fir_result = jieba.cut(line)for word in fir_result:if word not in cut:if word !='\t' and word != " ":cut_re += wordcut_re += " "seg_list = jieba.cut(line, cut_all=True)words = jieba.posseg.cut(str(cut_re).replace(" ",""))ccc = jieba.cut(str(cut_re).replace(" ",""))all_words += (" ".join(ccc))for word, flag in words:loop = QEventLoop()QTimer.singleShot(1, loop.quit)loop.exec_()self.finishi_content.append(word+','+flag)print(all_words)self.file_content.append(str(cut_re))# for i in all_words:# print(i)# 词频统计c = Counter()for x in all_words.split(" "):if len(x) >= 1 and x != '\r\n':c[x] += 1# 输出词频最高的前N个词# print('\n词频统计结果:')for (k, v) in c.most_common(60):loop = QEventLoop()QTimer.singleShot(100, loop.quit)loop.exec_()# print("%s:%d" % (k, v))def default_cut_list(self):filename = "NLPIR_stopwords.txt"pf = open(filename, "r", encoding='UTF-8')a = pf.read()self.stop_words_content.setText(a)self.selected = Falseclass Stream(QObject):newText = pyqtSignal(str)def write(self, text):self.newText.emit(str(text))if __name__ == '__main__':app = QApplication(sys.argv)ex = Jieba_Main_Window()sys.exit(app.exec_())

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

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

相关文章

Fakelocation Server服务器/专业版 Windows11

前言:需要Windows11系统 Fakelocation开源文件系统需求 Windows11 | Fakelocation | 任务一 打开 PowerShell(以管理员身份)命令安装 Chocolatey Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProto…

【云计算】腾讯云架构高级工程师认证TCP--考纲例题,知识点总结

【云计算】腾讯云架构高级工程师认证TCCP–知识点总结,排版整理 文章目录 1、云计算架构概论1.1 五大版块知识点(架构设计,基础服务,高阶技术,安全,上云)1.2 课程详细目录1.3 云基础架构设计1.4…

HarmonyOs鸿蒙开发实战(22)=>开源插件集成-城市选择案例(带字母索引可修改源码)

1.第一步>DevEco Studio集成开源插件 1.1.下载资源插件 1.2.打开Perferences页面,从本地导入安装插件 2.第二步>导入HarmonyOs Next组件市场的城市选择案例,安装 2.1. 代码空白处右键,打开开源组件弹窗 2.2. 安装城市选择案例 3.第三步…

ROS之什么是Node节点和Package包?

1.什么是ROS? 官方术语:ROS(Robot Operating System,机器人操作系统)是一个开源的、模块化的机器人软件框架。它为机器人开发提供了一套工具和库,用于实现硬件抽象、设备驱动、消息传递、多线程管理等功能…

Windows环境安装MongoDB

文章目录 1. 下载MongoDB2. 安装MongoDB3. Compass-图形化界面客户端4. 更换Compass的主题 阅读本文前可以先阅读以下文章: MongoDB快速入门(MongoDB简介、MongoDB的应用场景、MongoDB中的基本概念、MongoDB的数据类型、MongoDB的安装与部署、MongoDB的常…

在线解析工具链接

在线字数统计工具-统计字符字节汉字数字标点符号-计算word文章字数字数统计,字符统计,字节统计,字数计算,统计字数,统计字节数,统计字符数,统计word字数,在线字数统计,在线查字数,计算字数,字数统计工具,支持手机移动端查询多少字数,英文:Calculate the number of words,Count …

RTL8211F 1000M以太网PHY指示灯

在RK3562 Linux5.10 SDK里面已支持该芯片kernel-5.10/drivers/net/phy/realtek.c,而默认是没有去修改到LED配置的,我们根据硬件设计修改相应的寄存器配置,该PHY有3个LED引脚,我们LED0不使用,LED1接绿灯(数据…

通关C语言自定义类型:联合和枚举

C语言的自定义类型有四个分别是:数组;结构体(struct);联合体(union);枚举(enum)。前面已经讨论过数组和结构体,这期让我们来学习一下联合体和枚举…

java八股-SpringCloud微服务-Eureka理论

文章目录 SpringCloud架构Eureka流程Nacos和Eureka的区别是?CAP定理Ribbon负载均衡策略自定义负载均衡策略如何实现?本章小结 SpringCloud架构 Eureka流程 服务提供者向Eureka注册服务信息服务消费者向注册中心拉取服务信息服务消费者使用负载均衡算法挑…

介绍一下toupper(ch);函数(c基础)

hi , I am 36 适合对象c语言初学者 toupper(ch1); tolower(ch2); 是返回ch的大写或小写的字符但并不改变ch 若传递数字仍返回该数字 格式 #include<ctype.h> char res toupper(ch); 链接扫雷游戏代码分享(c基础)-CSDN博客 hi , I am 36. thanks for your look…

数据结构(Java版)第二期:包装类和泛型

目录 一、包装类 1.1. 基本类型和对应的包装类 1.2. 装箱和拆箱 1.3. 自动装箱和自动拆箱 二、泛型的概念 三、引出泛型 3.1. 语法规则 3.2. 泛型的优点 四、类型擦除 4.1. 擦除的机制 五、泛型的上界 5.1. 泛型的上界的定义 5.2. 语法规则 六、泛型方法 6.1…

敬请关注:CEPGT 2024 新增主讲

Prof. Marc A. Rosen, Ontario Tech University, Canada 曾担任安大略省理工大学工程与应用科学学院创始院长、加拿大工程学院院长和加拿大机械工程学会会长。 他的主要研究领域是能源、热力学、可持续发展等。Google Scholar Citations 48000余次&#xff0c;H指数98。Prof. …

【Python】30个Python爬虫的实战项目!!!(附源码)

Python爬虫是数据采集自动化的利器。本文精选了30个实用的Python爬虫项目&#xff0c;从基础到进阶&#xff0c;每个项目都配有完整源码和详细讲解。通过这些项目的实战&#xff0c;可以全面掌握网页数据抓取、反爬处理、并发下载等核心技能。 一、环境准备 在开始爬虫项目前…

如何编译 Cesium 源码

如何编译 Cesium 源码 Cesium 是一个开源的 JavaScript 库&#xff0c;用于构建 3D 地球和地图应用程序。它提供了一套强大的 API 和工具&#xff0c;使开发者能够创建丰富的地理空间应用。本文将指导您如何从 GitHub 下载 Cesium 源码&#xff0c;并在本地进行编译。 TilesB…

计算服务器定制化,计算力提升的关键!

如今&#xff0c;计算服务器的性能、成本、灵活性以及可靠性等因素对于企业的运营和发展起着至关重要的作用。定制服务器&#xff0c;作为一种根据企业特定需求和业务特点专门设计制造的服务器解决方案&#xff0c;正逐渐成为众多企业的明智之选。 对于计算服务器而言&#xff…

51WORLD与南京水利研究院联合研发,国产数字孪生超融合一体机

近日&#xff0c;太湖流域水治理国际会议在江苏省无锡市举行。大会由水利部国际合作与科技司、河湖管理司、中国水利学会、水利部太湖流域管理局、无锡市人民政府、中国交通建设集团有限公司指导&#xff0c;南京水利科学研究院主办&#xff0c;以“践行新发展理念、推进流域水…

STL关联式容器之map

map的特性是&#xff0c;所有元素都会根据元素的键值自动被排序。map的所有元素都是pair&#xff0c;同时拥有实值(value)和键值(key)。pair的第一元素被视为键值&#xff0c;第二元素被视为实值。map不允许两个元素拥有相同的键值。下面是<stl_pair.h>中pair的定义 tem…

python小课堂(一)

基础语法 1 常量和表达式2 变量和类型2.1 变量是什么2.2 变量语法 3 变量的类型3.1 动态类型特性 4 注释4.1注释是什么 5 输入输出5.1 print的介绍5.2 input 6 运算符6.1 算术运算符在这里插入图片描述6.2 关系运算符6.3 逻辑运算符6.4赋值运算符 1 常量和表达式 在print()中可…

Qt:信号槽

一. 信号槽概念 信号槽 是 Qt 框架中一种用于对象间通信的机制 。它通过让一个对象发出信号&#xff0c;另一个对象连接到这个信号的槽上来实现通信。信号槽机制是 Qt 的核心特性之一&#xff0c;提供了一种灵活且类型安全的方式来处理事件和数据传递。 1. 信号的本质 QT中&a…

高质量代理池go_Proxy_Pool

高质量代理池go_Proxy_Pool 声明&#xff01; 学习视频来自B站up主 ​泷羽sec​​ 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以…