用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+" "+i
        self.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 jieba


class 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+" "+i
        self.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 Counter


class 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 False
        if not fileDevice.open(QIODevice.ReadOnly | QIODevice.Text):
            return False
        try:
            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 True

    def 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 == ""):
            return
        if 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 False
        try:
            text = self.rules_content.toPlainText()  # 返回str类型
            strBytes = text.encode("utf-8")  # str转换为bytes类型
            fileDevice.write(strBytes)  # 写入文件
        finally:
            fileDevice.close()
        return True

    def saveByIODevice(self,fileName):  ##用QFile保存文件
        fileDevice = QFile(fileName)
        if not fileDevice.open(QIODevice.WriteOnly | QIODevice.Text):
            return False
        try:
            text = self.file_content.toPlainText()  # 返回str类型
            strBytes = text.encode("utf-8")  # str转换为bytes类型
            fileDevice.write(strBytes)  # 写入文件
        finally:
            fileDevice.close()
        return True

    def 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 == ""):
            return

        if 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 False
        try:
            text = self.finishi_content.toPlainText()  # 返回str类型
            strBytes = text.encode("utf-8")  # str转换为bytes类型
            fileDevice.write(strBytes)  # 写入文件
        finally:
            fileDevice.close()
        return True

    def 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 == ""):
            return

        if 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 += word
                        cut_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 = False


class 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_())

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CMake + mingw + opencv

由于是在windows下开发,因此下载的是windows版本的安装程序,如图: 下载的是 MSVC 编译的 OpenCV,但由于我一般使用的是JetBrains的开发工具,并且为了方便跨平台,我一般也是使用cmakemingw编译,这…

11.22 校内模拟赛总结

挂分场 复盘 决定尝试一下多放一点时间在前期看题上 T1 发现是模拟;T2 看上去好神秘啊!想了一会一直没什么思路;T3 看上去眼熟,但还是觉得计数很困难;T4 看完发现是数据结构,推了推很快会了树高做法&…

使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程

当涉及到图数据时,复杂性是不可避免的。无论是社交网络中的庞大互联关系、像 Freebase 这样的知识图谱,还是推荐引擎中海量的数据量,处理如此规模的图数据都充满挑战。 尤其是当目标是生成能够准确捕捉这些关系本质的嵌入表示时,…

如何使用Python代码实现给GPU预加热

如何使用Python代码实现给GPU预加热 一、引言二、使用深度学习框架进行预加热2.1 TensorFlow预加热2.2 PyTorch预加热三、使用CUDA进行预加热四、预加热的效果评估与优化五、结论与展望在高性能计算和深度学习领域,GPU(图形处理器)已经成为不可或缺的加速工具。然而,在实际…

Leecode刷题C语言之统计不是特殊数字的数字数量

执行结果:通过 执行用时和内存消耗如下&#xff1a; bool isPrime(int n){if(n<2){return false;}for(int i2;i*i<n;i){if(n%i0){return false;}}return true; } int nonSpecialCount(int l, int r) {int psqrt(l);int q sqrt(r);int len r-l1;for(int i p; i <q;…

影响电阻可靠性的因素

一、影响电阻可靠性的因素&#xff1a; 影响电阻可靠性的因素有温度系数、额定功率&#xff0c;最大工作电压、固有噪声和电压系数 &#xff08;一&#xff09;温度系数 电阻的温度系数表示当温度改变1摄氏度时&#xff0c;电阻阻值的相对变化&#xff0c;单位为ppm/C.电阻温度…

Typora-PicGo-OSS对象存储

Typora-PicGo-对象存储OSS 问题描述&#xff1a; 上次做完Gitee图床配置后&#xff0c;今天发现图床突然不能使用了&#xff0c;直到我查找到Gitee仓库变成私有后才发现做的图床被封禁了当前仓库因涉嫌外链滥用(RAW)&#xff0c;不支持设置为公开仓库&#xff0c;就导致我的笔…

ESP-KeyBoard:基于 ESP32-S3 的三模客制化机械键盘

概述 在这个充满挑战与机遇的数字化时代&#xff0c;键盘已经成为我们日常学习、工作、娱乐生活必不可少的设备。而在众多键盘中&#xff0c;机械键盘&#xff0c;以其独特的触感、清脆的敲击音和经久耐用的特性&#xff0c;已经成为众多游戏玩家和电子工程师的首选。本文将为…

nohup java -jar supporterSys.jar --spring.profiles.active=prod

文章目录 1、ps -ef | grep java2、kill 13713、ps -ef | grep java4、nohup java -jar supporterSys.jar --spring.profiles.activeprod &5、ps -ef | grep java1. 启动方式进程 1371进程 19994 2. 主要区别3. 可能的原因4. 建议 1、ps -ef | grep java rootshipper:~# p…

大公司如何实现打印机共享的?如何对打印机进行管控或者工号登录后进行打印?异地打印机共享的如何实现可以帮助用户在不同地理位置使用同一台打印机完成打印任务?

大公司如何实现打印机共享的&#xff1f;如何对打印机进行管控或者工号登录后进行打印&#xff1f;异地打印机共享的如何实现可以帮助用户在不同地理位置使用同一台打印机完成打印任务&#xff1f; 如果在局域网内&#xff0c;可以不需要进行二次开发&#xff0c;通过对打印机进…

数字反向输出

数字反向输出 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 小明听到广播里的数字后&#xff0c;总喜欢反着念给妈妈听。请聪明的你将小明听到的数字反向输出。 输入 输入为一个整型的四位数n 输出 …

Vue页面不显示也不报错是怎么回事?如何解决?

在使用Vue.js进行前端开发时&#xff0c;有时会遇到一种令人困惑的情况:页面既不显示任何内容&#xff0c;控制台也不报错。这种情况往往让开发者摸不着头脑&#xff0c;但不必过分担心&#xff0c;通过一系列的排查和调试步骤&#xff0c;我们可以找到问题的根源并解决它。 本…

利用 GitHub 和 Hexo 搭建个人博客【保姆教程】

利用 GitHub 和 Hexo 搭建个人博客 利用 GitHub 和 Hexo 搭建个人博客一、前言二、准备工作&#xff08;一&#xff09;安装 Node.js 和 Git&#xff08;二&#xff09;注册 GitHub 账号 三、安装 Hexo&#xff08;一&#xff09;创建博客目录&#xff08;二&#xff09;安装 H…

C#开发基础之借用dotnet CLI命令行参数的设计了解命令行构建用法

前言 在C#开发中&#xff0c;命令行参数是一种重要的机制&#xff0c;用于在程序启动时向应用程序传递配置或指令。无论是构建CLI工具还是配置化启动的桌面程序&#xff0c;掌握命令行参数的用法可以帮助我们设计更灵活的应用程序。 本文将详细介绍C#中命令行参数的基本用法、…

【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录

背景 Jetbrain IDE 支持生成 Test 类&#xff0c;其中选择JUnit5 和 JUnit&#xff0c;但是感觉这不是标准的单元测试&#xff0c;因为接口命名吧。 差异对比 两者生成的单测API名称同原API&#xff0c;没加test前缀的。使用差异主要表现在&#xff1a; setUp &#xff06; …

网页中调用系统的EXE文件,如打开QQ

遇到一个实际的问题&#xff0c;需要在网页中打开本地的某个工业软件。 通过点击exe文件就可以调用到程序。 比如双击qq的exe就可以启动qq的程序。 那么问题就变成了如何加载exe程序呢&#xff1f; 可以通过Java的 Process process Runtime.getRuntime().exec(command);通过…

FME教程:实现按属性字段合并图斑,同时合并属性字段值,对合并的属性值同步进行去重处理的案例思路方法

目录 一、实现效果 二、实现过程 1.读取数据 2.融合图斑 3.合并属性字段值&#xff0c;并去重 4.属性字段值排序、整理 5.输出成果 6.模板的使用 三、总结 今天介绍使用FME实现按属性合并图斑&#xff0c;同时合并属性字段值&#xff0c;并对合并的属性值同步进行去重…

ant-design-vue中table组件多列排序

antD中table组件多列排序 使用前注意实现效果图实现的功能点及相关代码1. 默认按某几个字段排序2. 点击排序按钮可同时对多个字段进行排序3. 点击重置按钮可恢复默认排序状态。 功能实现完整的关键代码 使用前注意 先要确认你使用的antD版本是否支持多列排序&#xff0c;我这里…

【LeetCode热题100】栈

这道题一共记录了关于栈的5道题目&#xff1a;删除字符串中所有相邻重复项、比较含退格的字符串、基本计算器II、字符串解码、验证栈序列。 class Solution { public:string removeDuplicates(string s) {string ret;for(auto c : s){if(ret.size() 0 || c ! ret.back()) ret …

IText创建加盖公章的pdf文件并生成压缩文件

第一、前言 此前已在文章&#xff1a;Java使用IText根据pdf模板创建pdf文件介绍了Itex的基本使用技巧&#xff0c;本篇以一个案例为基础&#xff0c;主要介绍IText根据pdf模板填充生成pdf文件&#xff0c;并生成压缩文件。 第二、案例 以下面pdf模板为例&#xff0c;生成一个p…