Bootstrap

基于Python+Django的网络舆情分析系统项目实战(附源码+论文)

大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦。

python-网络舆情分析系统演示

源码下载地址直达:

https://download.csdn.net/download/m0_46388260/87921413

🎀 当前专栏:基于Python的毕业设计

精彩专栏推荐👇🏻👇🏻👇🏻

💞微信小程序毕业设计
🎀 安卓app毕业设计
🌎Java毕业设计

一、项目简介

本系统使用Python语言和MySQL数据库开发,为社会的网络管理部门提供了言论分析、言论管理、用户管理等多种功能,让用户不需要再繁琐的查看每个人的微博帐号就可以进行以自己城市或地区为关键词的言论分析和管理,在保障了网民们的隐私权和言论自由权的同时,可以最大效率地查看和本地有关的舆情或负面评论。

二、系统设计

2.1软件功能模块设计

本系统的主要用户是负责舆情监控的管理人员,本系统允许多个用户同时使用,也就是说用户可以有多个,但管理员用户只有一个。系统的功能主要是对用户的言论进行分析,所有的言论会进行数据的展示,也可以使用饼状统计图进行更直观的显现,除此之外用户还可以对自己的个人信息比如密码进行维护,管理员用户可以管理其他的用户信息,可以修改或删除系统中现有的用户。系统结构图如下所示:
在这里插入图片描述

2.2数据库设计

(1)用户信息表,用户注册之后的个人信息会存储在此表中。这个表中的用户ID应设置为主键,除此之外还要有用户名、密码、注册时间等列。
在这里插入图片描述

(2)文本分类及文本信息表,经过爬取收集到的言论的信息都会保存在此表中,设置两张表的目的是可以使用分类表管理言论的种类,使用文本信息表来详细的管理文本的信息。
在这里插入图片描述

(3)文本管理信息表,这张表主要存储系统中的文本管理信息,当用户或管理员用户对收集到的文本信息进行查看或者管理时就需要对此表进行操作。此外,本信息表中应设置一列来反映当前文本的管理状态,如未处理、已处理等。
在这里插入图片描述

(4)站内新闻表,站内新闻表用来保存本系统内的站内新闻信息,管理员会定期对本表进行维护,让用户看到最新的新闻。

在这里插入图片描述

三、系统项目部分截图

3.1首页展示

用户在输入正确的域名后即可访问本系统,不过用户在注册用户之前只能访问系统公告及站内新闻等信息。本系统的首页使用上中下结构,头部为导航,中间部分的左侧为当前的用户信息,除此之外还能显示当前的日期和天气,右侧为当前系统内的总发言数、总用户数等数据。在这里插入图片描述

3.2登录注册

未进行注册的用户无法使用本系统的所有功能,只有经过一系列表单验证后完成注册拥有自己的账号之后才可以进行登录,进而使用所有的功能。在这里插入图片描述

3.3文本分析

用户登录首页后点击上方的文本分析即可进入本功能,进入后可以查看系统的所有文本的历史输入,也可以在文本框中输入新的文本信息进行分析,具体操作如下:在这里插入图片描述
在这里插入图片描述

3.4 个人信息查看

在首页上方的导航栏中有个人信息的超链接按钮,点击个人信息后即可进入本页面,用户在此界面上可以查看到当前账户的ID、姓名、联系方式和最后登录时间等信息。具体界面如下:在这里插入图片描述

对比分析模块

本系统的数据分析由两种算法组成,在本功能中用户可以通过柱状图和饼图对两种算法的分析进行查看,具体操作界面如下:
在这里插入图片描述

注册用户管理模块

管理员在登录系统后台之后可以通过本功能对用户信息进行查看和管理,可以查看用户的帐号、密码及其他基本的个人信息,还能为用户进行权限的设置,用户没有权限的时候是无法进行言论管理的,除此之外,如果用户违反了网站的相关规定,管理员可以对用户进行删除。
用户管理模块分为两个功能,首先是可以进行用户的创建,在输入用户的姓名、密码和手机号的信息后即可进行新用户的添加。新添加的用户可以通过数据列表上方的搜索栏进行搜索,输入用户的姓名就可以查看到指定的数据信息,如果用户的信息发生了改变,比如更换了手机号时就可以点击列表最右边的修改进行用户数据的更新。操作界面如下图:
在这里插入图片描述
在这里插入图片描述

四、论文目录

1.引 言 1
1.1 课题研究背景及意义 2
1.2 国内外研究现状及发展趋势 2
1.3 本文的研究思路与结构 2
2.开发工具及技术 1
2.1 B/S结构的介绍 2
2.2 Python技术的介绍 2
2.3 HTML技术的介绍 2
2.4 MYSQL数据库的介绍 3
2.5 本系统算法的介绍 3
2.6 开发环境的介绍 3
3.需求分析 1
3.1 可行性分析 4
3.2 功能需求分析 4
3.3 非功能需求分析 4
4 总体设计 6
4.1 系统总体结构设计 6
4.2 系统的数据库设计 6
5 系统功能实现 6
5.1 首页展示 6
5.2 用户登录注册 6
5.3 文本分析 6
5.4 文本管理 6
5.5 个人信息查看 6
5.6 对比分析 6
5.7 用户管理 6

6 系统测试 6
6.1 测试目的 6
6.2 测试内容 6
6.3 测试总结 6
7.结 论 2
致 谢 3
参考文献 4

五、部分核心代码

# -*- coding:utf-8 -*-
import csv
import numpy as np
import jieba
import jieba.analyse
import jieba.posseg as pseg
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from keras import models
from keras import layers
from keras import Input
from gensim.models import word2vec
from keras.preprocessing.text import Tokenizer
from keras.utils.np_utils import to_categorical
from keras.preprocessing.sequence import pad_sequences
from keras.models import Model
from keras.models import Sequential
from keras.models import load_model
from keras.layers import Flatten, Dense, Dropout, Conv1D, MaxPool1D, Embedding

# ----------------------------------第一步 数据预处理--------------------------------
file = "data.csv"


# 获取停用词
def stopwordslist():  # 加载停用词表
    stopwords = [line.strip() for line in open('stop_words.txt', encoding="UTF-8").readlines()]
    return stopwords


# 去除停用词
def deleteStop(sentence):
    stopwords = stopwordslist()
    outstr = ""
    for i in sentence:
        # print(i)
        if i not in stopwords and i != "\n":
            outstr += i
    return outstr


# 中文分词
Mat = []
with open(file, "r", encoding="UTF-8") as f:
    # 使用csv.DictReader读取文件中的信息
    reader = csv.DictReader(f)
    labels = []
    contents = []
    for row in reader:
        # 数据元素获取
        if row['label'] == '好评':
            res = 0
        else:
            res = 1
        labels.append(res)

        # 中文分词
        content = row['content']
        # print(content)
        seglist = jieba.cut(content, cut_all=False)  # 精确模式
        # print(seglist)

        # 去停用词
        stc = deleteStop(seglist)  # 注意此时句子无空格
        # 空格拼接
        seg_list = jieba.cut(stc, cut_all=False)
        output = ' '.join(list(seg_list))
        # print(output)
        contents.append(output)

        # 词性标注
        res = pseg.cut(stc)
        seten = []
        for word, flag in res:
            if flag not in ['nr', 'ns', 'nt', 'mz', 'm', 'f', 'ul', 'l', 'r', 't']:
                # print(word,flag)
                seten.append(word)
        Mat.append(seten)

print(labels[:5])
print(contents[:5])
print(Mat[:5])

# ----------------------------------第二步 特征编号--------------------------------
# fit_on_texts函数可以将输入的文本每个词编号 编号根据词频(词频越大编号越小)
tokenizer = Tokenizer()
tokenizer.fit_on_texts(Mat)
vocab = tokenizer.word_index  # 停用词已过滤,获取每个词的编号
print(vocab)

# 使用 train_test_split 分割 X y 列表
X_train, X_test, y_train, y_test = train_test_split(Mat, labels, test_size=0.3, random_state=1)
print(X_train[:5])
print(y_train[:5])

# ----------------------------------第三步 词向量构建--------------------------------
# Word2Vec训练
maxLen = 100  # 词序列最大长度
num_features = 100  # 设置词语向量维度
min_word_count = 3  # 保证被考虑词语的最低频度
num_workers = 4  # 设置并行化训练使用CPU计算核心数量
context = 4  # 设置词语上下文窗口大小

# 设置模型
model = word2vec.Word2Vec(Mat, workers=num_workers, size=num_features,
                          min_count=min_word_count, window=context)
# 强制单位归一化
model.init_sims(replace=True)
# 输入一个路径保存训练模型 其中./data/model目录事先存在
model.save("CNNw2vModel")
model.wv.save_word2vec_format("CNNVector", binary=False)
print(model)
# 加载模型 如果word2vec已训练好直接用下面语句
w2v_model = word2vec.Word2Vec.load("CNNw2vModel")

# 特征编号(不足的前面补0)
trainID = tokenizer.texts_to_sequences(X_train)
print(trainID)
testID = tokenizer.texts_to_sequences(X_test)
print(testID)
# 该方法会让CNN训练的长度统一
trainSeq = pad_sequences(trainID, maxlen=maxLen)
print(trainSeq)
testSeq = pad_sequences(testID, maxlen=maxLen)
print(testSeq)

# 标签独热编码 转换为one-hot编码
trainCate = to_categorical(y_train, num_classes=2)  # 二分类问题
print(trainCate)
testCate = to_categorical(y_test, num_classes=2)  # 二分类问题
print(testCate)

# ----------------------------------第四步 CNN构建--------------------------------
# 利用训练后的Word2vec自定义Embedding的训练矩阵 每行代表一个词(结合独热编码和矩阵乘法理解)
embedding_matrix = np.zeros((len(vocab) + 1, 100))  # 从0开始计数 加1对应之前特征词
for word, i in vocab.items():
    try:
        # 提取词向量并放置训练矩阵
        embedding_vector = w2v_model[str(word)]
        embedding_matrix[i] = embedding_vector
    except KeyError:  # 单词未找到跳过
        continue

# 训练模型
main_input = Input(shape=(maxLen,), dtype='float64')
# 词嵌入 使用预训练Word2Vec的词向量 自定义权重矩阵 100是输出词向量维度
embedder = Embedding(len(vocab) + 1, 100, input_length=maxLen,
                     weights=[embedding_matrix], trainable=False)  # 不再训练
# 建立模型
model = Sequential()
model.add(embedder)  # 构建Embedding层
model.add(Conv1D(256, 3, padding='same', activation='relu'))  # 卷积层步幅3
model.add(MaxPool1D(maxLen - 5, 3, padding='same'))  # 池化层
model.add(Conv1D(32, 3, padding='same', activation='relu'))  # 卷积层
model.add(Flatten())  # 拉直化
model.add(Dropout(0.3))  # 防止过拟合 30%不训练
model.add(Dense(256, activation='relu'))  # 全连接层
model.add(Dropout(0.2))  # 防止过拟合
model.add(Dense(units=2, activation='softmax'))  # 输出层

# 模型可视化
model.summary()

# 激活神经网络 
model.compile(optimizer='adam',  # 优化器
              loss='categorical_crossentropy',  # 损失
              metrics=['accuracy']  # 计算误差或准确率
              )

# 训练(训练数据、训练类标、batch—size每次256条训练、epochs、随机选择、验证集20%)
history = model.fit(trainSeq, trainCate, batch_size=256,
                    epochs=6, validation_split=0.2)
model.save("TextCNN")

# ----------------------------------第五步 预测模型--------------------------------
# 预测与评估
mainModel = load_model("TextCNN")
result = mainModel.predict(testSeq)  # 测试样本
print(result)
print(np.argmax(result, axis=1))
score = mainModel.evaluate(testSeq,
                           testCate,
                           batch_size=32)
print(score)

# ----------------------------------第五步 可视化--------------------------------
import matplotlib.pyplot as plt

plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Valid'], loc='upper left')

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Valid'], loc='upper left')
plt.show()

获取源码或论文

如需对应的论文或源码,也可以下方微信联系我

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;