【数据可视化】1 Qt Designer安装与NLP情绪识别展示—— 播放视频、滑块进度条、导入字幕文本、显示图片

1. Qt Designer安装

pip install pyqt5
pip install PyQt5-tools

在这里插入图片描述
此网站安装Qt Designer,pycharm环境配置参考此文章

可使用下面的命令将 ui 文件转换为 python 代码:

pyuic5 MainWindow.ui -o MainWindow.py

2. 计算器功能实例

Qt designer页面简介看,关于布局看GUI官方文档

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QMainWindow
from MainWindow import Ui_MainWindow


class MyWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.setupUi(self)

        self.pushButton.clicked.connect(self.disp)
        self.pushButton_2.clicked.connect(self.disp2)
        self.pushButton_3.clicked.connect(self.disp3)
        self.pushButton_4.clicked.connect(self.disp4)
        self.pushButton_5.clicked.connect(self.disp5)
        self.pushButton_6.clicked.connect(self.disp6)
        self.pushButton_7.clicked.connect(self.disp7)
        self.pushButton_8.clicked.connect(self.disp8)
        self.pushButton_9.clicked.connect(self.disp9)
        self.pushButton_10.clicked.connect(self.disp10)
        self.pushButton_11.clicked.connect(self.disp11)
        self.pushButton_12.clicked.connect(self.disp12)
        self.pushButton_13.clicked.connect(self.disp13)
        self.pushButton_14.clicked.connect(self.disp14)
        self.pushButton_15.clicked.connect(self.disp15)
        self.pushButton_16.clicked.connect(self.disp16)

    def disp(self):
        self.textEdit.insertPlainText('1')

    def disp2(self):
        self.textEdit.insertPlainText('2')

    def disp3(self):
        self.textEdit.insertPlainText('3')

    def disp4(self):
        self.textEdit.insertPlainText('4')

    def disp5(self):
        self.textEdit.insertPlainText('5')

    def disp6(self):
        self.textEdit.insertPlainText('6')

    def disp7(self):
        self.textEdit.insertPlainText('7')

    def disp8(self):
        self.textEdit.insertPlainText('8')

    def disp9(self):
        self.textEdit.insertPlainText('9')

    def disp10(self):
        self.textEdit.insertPlainText('0')

    def disp11(self):
        self.textEdit.insertPlainText('+')

    def disp12(self):
        self.textEdit.insertPlainText('-')

    def disp13(self):
        self.textEdit.insertPlainText('*')

    def disp14(self):
        self.textEdit.insertPlainText('/')

    def disp15(self):
        self.textEdit.clear()

    def disp16(self):
        text = self.textEdit.toPlainText()
        text = eval(text)
        self.textEdit.insertPlainText('\n\n')
        self.textEdit.setAlignment(Qt.AlignRight)
        self.textEdit.insertPlainText(str(text))
        print(text)



if __name__ == '__main__':
    # application 对象
    app = QApplication(sys.argv)
    # QMainWindow对象
    # mainwindow = QMainWindow()
    # 这是qt designer实现的Ui_MainWindow类
    # ui_components = Ui_MainWindow()     # 继承-Ui_MainWindow类
    # 调用setupUi()方法,注册到QMainWindow对象
    # ui_components.setupUi(mainwindow)

    mainwindow = MyWindow()

    mainwindow.show()       # 显示
    sys.exit(app.exec_())

在这里插入图片描述

3. 播放视频 滑块控制进度

qt官方文档player.py,这两没什么用,主要参考此文章,修改与踩坑:

  1. 解决Qt播放视频无法播放的问题
  2. 播放视频需要在qt designer promoted classes
  3. 解决滑块条的问题
import sys

from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog
from MainWindow import Ui_MainWindow

from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtCore import QUrl

from myVideoWidget import myVideoWidget

class MyWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.setupUi(self)

        self.videoFullScreen = False  # 判断当前widget是否全屏
        self.videoFullScreenWidget = myVideoWidget()  # 创建一个全屏的widget
        self.videoFullScreenWidget.setFullScreen(1)
        self.videoFullScreenWidget.hide()  # 不用的时候隐藏起来

        self.player = QMediaPlayer()

        self.player.setVideoOutput(self.wgt_video)

        self.btn_open.clicked.connect(self.openVideoFile)
        self.btn_play.clicked.connect(self.playVideo)  # play
        self.btn_stop.clicked.connect(self.pauseVideo)
        self.sld_video.sliderMoved.connect(self.changeVideo)
        self.player.positionChanged.connect(self.changeSlide)

    def openVideoFile(self):
        # self.player.setMedia(QMediaContent(QFileDialog.getOpenFileUrl()[0]))  # 手动选取视频文件
        self.player.setMedia(QMediaContent(QUrl.fromLocalFile('...your path/大学物理典型问题解析—力学与热学 第5讲 牛顿运动定律及其应用-1/1牛顿运动定理简要回顾.mp4')))
        self.player.play()

    def playVideo(self):
        self.player.play()

    def pauseVideo(self):
        self.player.pause()

    def changeSlide(self, position):
        self.vidoeLength = self.player.duration() + 0.1
        self.sld_video.setValue(round((position / self.vidoeLength) * 100))
        self.lab_video.setText(str(round((position / self.vidoeLength) * 100, 2)) + '%')

    def changeVideo(self, position):
        self.vidoeLength = self.player.duration() + 0.1
        self.player.setPosition(round((position/100 )* self.vidoeLength))

if __name__ == '__main__':
    app = QApplication(sys.argv)        # application 对象

    mainwindow = MyWindow()
    mainwindow.show()       # 显示

    # player = QMediaPlayer()
    # vw = QVideoWidget()  # 定义视频显示的widget
    # vw.show()
    # player.setVideoOutput(vw)  # 视频播放输出的widget,就是上面定义的
    # player.setMedia(QMediaContent(QFileDialog.getOpenFileUrl()[0]))  # 选取视频文件
    # player.play()  # 播放视频

    sys.exit(app.exec_())

4. 实现字幕与视频同步

关于这个一开始需要加0.1的问题不大,不管它,看一下总时长:

self.vidoeLength = self.player.duration() + 0.1
print(self.player.duration(), self.vidoeLength)

结果:

0 0.1
301080 301080.1

可见单位就是ms

main函数中添加:

    begin_list = []
    end_list = []
    text_list = []
    text_path = '...your path/大学物理典型问题解析—力学与热学 第5讲 牛顿运动定律及其应用-1/1牛顿运动定理简要回顾.txt'
    file = open(text_path, 'r', encoding='utf-8')
    for line in file.readlines():
        line = line.strip('\n').split(' ')
        begin_list.append(eval(line[0]))
        end_list.append(eval(line[1]))
        text_list.append(line[2])
    file.close()

changeSlide(self, position)函数中添加:

        # 改变当前文本
        for i in range(len(begin_list)):
            if position >= begin_list[i] and position <= end_list[i]:
                self.lab_text.setText(text_list[i])

5. 显示图片

参考官方文档,拖入Label,在changeSlide(self, position)函数中添加:

         # 显示图像
         from PyQt5.QtGui import QPixmap
         pixmap = QPixmap('C:/Users/Yang SiCheng/Videos/Captures/Screenshot 1_20_2021 8_53_20 PM.png')
         self.lab_emo_image.setScaledContents(True)      # 缩放
         self.lab_emo_image.setPixmap(pixmap)

插值法绘制平滑曲线:此文此文,Savitzky-Golay 滤波器实现曲线平滑见此文

6. 显示matplotlib.pyplot生成的图片

import sys

from PyQt5.QtWidgets import QApplication, QMainWindow
from MainWindow import Ui_MainWindow

from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QPixmap

from myVideoWidget import myVideoWidget

import numpy as np
from gensim.models import KeyedVectors
word_vectors = KeyedVectors.load('vectors.kv')


def get_sentence_vec(sentence):
    import jieba
    import re
    sentence = ''.join(re.findall('[\u4e00-\u9fa5|\n]',sentence))
    sentence_list = ' '.join(jieba.cut(sentence)).split(' ')
    vecsum = np.zeros(word_vectors.vector_size)
    cnt = 0
    for word in sentence_list:
        try:
            vecsum = vecsum + word_vectors[word]
            cnt += 1
        except:
            continue
    if cnt == 0: return vecsum
    return vecsum/cnt


begin_list = []
end_list = []
text_list = []
test_data = []
text_path = '...your path/大学物理典型问题解析—力学与热学 第5讲 牛顿运动定律及其应用-1/1牛顿运动定理简要回顾.txt'
file = open(text_path, 'r', encoding='utf-8')
for line in file.readlines():
    line = line.strip('\n').split(' ')
    begin_list.append(eval(line[0]))
    end_list.append(eval(line[1]))
    text_list.append(line[2])
    test_data.append(get_sentence_vec(line[2]))
file.close()


x = []
y = []
import matplotlib.pyplot as plt
def plot_proba(i, pos_proba, begin_list=begin_list, end_list=end_list):
    x.append((end_list[i]+begin_list[i])/2)
    y.append(pos_proba)


import joblib
model = joblib.load('sgd_model_5.m')

predict = model.predict(test_data)
# predict = Norm(test_data,predict)
#
# print(len(predict) == len(test_data))
# for i in range(len(text_list)):
#     print(text_list[i], predict[i])


def emotion_convert(string):
    dictionary = {
        1: 'POS',
        -1: 'NEG',
        0: 'NORM'
    }
    return dictionary.get(string, None)


def Norm(i, test_data, predict2):  # 置信度低于某值时认为为平淡
    global x, y
    uncertain_classification = 0
    proba = model.predict_proba(test_data)
    for j in range(0, len(predict2)):  # 对于每一个句子
        plot_proba(j, proba[j][1])
        if proba[j][0] < 0.8 and proba[j][1] < 0.8:
            # print('置信度低于0.8:%d' % i)
            uncertain_classification += 1
            predict2[j] = 0
            continue
    plt.figure(1)
    plt.ylim(0,1)
    plt.bar(x=begin_list[i], height=proba[i][1], width=end_list[i] - begin_list[i], align='edge')
    plt.savefig('1.jpg')
    plt.figure(4)
    plt.ylim(0, 1)
    plt.bar(x=begin_list[i], height=proba[i][0], width=end_list[i] - begin_list[i], align='edge')
    plt.savefig('4.jpg')
    plt.figure(2)
    plt.plot(x, y, 'r', linewidth='1')
    plt.savefig('2.jpg')
    plt.clf()
    # from scipy.interpolate import make_interp_spline
    # import numpy as np
    # x_smooth = np.linspace(np.array(x).min(),np.array(x).max(),1000)
    # y_smooth = make_interp_spline(x, y)(x_smooth)
    from scipy.signal import savgol_filter
    x_smooth = x
    y_smooth = savgol_filter(y, 25, 3, mode='nearest')
    plt.figure(3)
    plt.plot(x_smooth, y_smooth, 'r', linewidth='1')
    plt.savefig('3.jpg')
    plt.clf()
    x = []
    y = []
    del x_smooth
    del y_smooth


    # plt.show()
    # print('总的句子个数为:%d' % len(predict))
    # print('平淡的句子个数为:%d' % uncertain_classification)

    return predict[i],proba[len(predict2)-1][0],proba[len(predict2)-1][1]



class MyWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.setupUi(self)

        self.videoFullScreen = False  # 判断当前widget是否全屏
        self.videoFullScreenWidget = myVideoWidget()  # 创建一个全屏的widget
        self.videoFullScreenWidget.setFullScreen(1)
        self.videoFullScreenWidget.hide()  # 不用的时候隐藏起来

        self.player = QMediaPlayer()

        self.player.setVideoOutput(self.wgt_video)

        self.btn_open.clicked.connect(self.openVideoFile)
        self.btn_play.clicked.connect(self.playVideo)  # play
        self.btn_stop.clicked.connect(self.pauseVideo)
        self.sld_video.sliderMoved.connect(self.changeVideo)
        self.player.positionChanged.connect(self.changeSlide)

        self.lab_emo_image.setScaledContents(True)
        self.lab_emo_image2.setScaledContents(True)
        self.lab_emo_image3.setScaledContents(True)
        self.lab_emo_image_.setScaledContents(True)

    def openVideoFile(self):
        # self.player.setMedia(QMediaContent(QFileDialog.getOpenFileUrl()[0]))  # 手动选取视频文件
        self.player.setMedia(QMediaContent(QUrl.fromLocalFile('...your path/大学物理典型问题解析—力学与热学 第5讲 牛顿运动定律及其应用-1/1牛顿运动定理简要回顾.mp4')))
        self.player.play()

    def playVideo(self):
        self.player.play()

    def pauseVideo(self):
        self.player.pause()

    def changeSlide(self, position):
        self.vidoeLength = self.player.duration() + 0.1
        self.sld_video.setValue(round((position / self.vidoeLength) * 100))
        self.lab_video.setText(str(round((position / self.vidoeLength) * 100, 2)) + '%')
        # 改变当前文本
        for i in range(len(begin_list)):
            if position >= begin_list[i] and position <= end_list[i]:
                self.lab_text.setText(text_list[i])
                Class, neg_proba, pos_proba = Norm(i, test_data[:i+1], predict[:i+1])
                # Norm(i, test_data[:i + 1], predict[:i + 1])
                self.lab_emo_image.setPixmap(QPixmap('1.jpg'))
                self.lab_emo_image2.setPixmap(QPixmap('2.jpg'))
                self.lab_emo_image3.setPixmap(QPixmap('3.jpg'))
                self.lab_emo_image_.setPixmap(QPixmap('4.jpg'))

                self.label_class.setText(emotion_convert(Class))
                self.lab_pos_proba.setText(str(pos_proba))
                self.lab_neg_proba.setText(str(neg_proba))


        # 显示图像
        # pixmap = QPixmap('C:/Users/Yang SiCheng/Videos/Captures/Screenshot 1_20_2021 8_53_20 PM.png')
        # self.lab_emo_image.setScaledContents(True)      # 缩放
        # self.lab_emo_image.setPixmap(pixmap)
        # 显示matplotlib.pyplot生成的图片



    def changeVideo(self, position):
        self.player.setPosition(round((position/100 )* self.vidoeLength))



if __name__ == '__main__':
    app = QApplication(sys.argv)        # application 对象

    mainwindow = MyWindow()



    mainwindow.show()       # 显示
    sys.exit(app.exec_())

在这里插入图片描述

小结

使用qt designer实现播放视频、滑块进度条、导入语音识别的文本内容、根据之前的NLP过程产生的情绪识别模型进行数据可视化,结果良好

未来工作:

  1. NLP文本匹配度
  2. DS融合原理和实现
  3. NLP文本匹配数据可视化
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值