Skip to main content

微博舆情监测系统介绍

· 8 min read
Proca
usagi妈妈

本程序为一个多功能的文本处理和分析工具,基于前一步微博爬虫得到的数据,主要用于情感分析、文本聚类、生成词云和预警检查。

程序模块和功能概览

  1. 配置和初始化:设置日志、字体和加载停用词(stopwords.txt)。
  2. 文本预处理:使用结巴分词(jieba)对文本进行分词和清洗。
  3. 情感标记:根据预设的正负面词汇(neg_words.txtpos_words.txt)标记数据。
  4. 数据加载和处理:加载数据集(data.csv),应用文本预处理和标记。
  5. 情感分析:使用SnowNLP库分析文本情感。
  6. Word2Vec模型训练:训练一个Word2Vec模型来获取文本的向量表示。
  7. 文本向量化:将处理过的文本转换成向量。
  8. 分类模型训练和评估:使用朴素贝叶斯分类器进行情感分类,并生成分类报告。
  9. 聚类分析:使用K-Means算法对文本向量进行聚类。
  10. 预警检查:根据讨论热度和情感倾向生成预警。
  11. 生成词云:对聚类结果和整体数据生成词云,可视化关键词。
  12. 可视化:展示情感类别和聚类结果的分布。
  13. 执行主函数:将所有步骤综合起来,执行定时任务。

具体代码解释

配置和初始化

配置日志和字体,以支持中文显示和记录程序运行时的信息。加载停用词表,这些词在分词后会被过滤掉,以便准确分析文本的有效内容。

import logging
import matplotlib.font_manager as fm
import matplotlib

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 配置字体 windows下, FONT_PATH = 'C:/Windows/Fonts/msyh.ttc'
FONT_PATH = '/System/Library/Fonts/STHeiti Medium.ttc'
font_path = FONT_PATH
prop = fm.FontProperties(fname=font_path)
matplotlib.rcParams['font.family'] = prop.get_name()

def load_stopwords(path):
with open(path, 'r', encoding='utf-8') as file:
stopwords = set(line.strip() for line in file)
return stopwords

文本预处理与标记

使用jieba进行中文分词,通过比较分词结果与预先设定的正负面词汇表进行情感标记。

import jieba

def preprocess_text(text):
words = jieba.cut(text)
words_filtered = [word for word in words if word not in stopwords and word.strip() != '']
return words_filtered

def label_data(text):
words = set(jieba.cut(text))
if any(word in neg_words for word in words):
return 0
elif any(word in pos_words for word in words):
return 1
else:
return -1 # 未知标签

数据加载和情感分析

加载数据集,应用预处理和标记,使用SnowNLP进行情感分析。

import pandas as pd
from snownlp import SnowNLP

def load_data(filename):
data = pd.read_csv(filename)
data['processed'] = data['微博正文'].apply(preprocess_text)
data['label'] = data['微博正文'].apply(label_data)
data = data[data['label'] != -1]
return data

data['sentiment'] = data['微博正文'].apply(lambda x: SnowNLP(x).sentiments) # 获取情感分数

为什么需要向量化

在自然语言处理(NLP)中,文本向量化是将文本数据转换为数值向量的过程。这一步是必要的,因为计算机无法直接理解原始文本。向量化后的文本可以用于各种机器学习算法,以进行情感分析、文本分类、聚类等任务。

Word2Vec模型训练和文本向量化

Word2Vec 是一种流行的模型,它可以把每个单词转换成一个多维空间中的向量。这些向量捕捉了词语间的语义关系,例如相似词会在向量空间中彼此接近。通过Word2Vec模型,我们可以得到文本数据的密集表示(dense representation),这对于很多算法来说是效率较高的输入形式。

训练Word2Vec模型以获取文本数据的向量表示,然后将处理过的文本转换成向量。

train_word2vec 函数接受分词后的句子列表作为输入,并使用这些句子来训练一个 Word2Vec 模型。模型的参数包括:

  • vector_size:向量的维度大小。
  • window:当前词和预测词之间的最大距离。
  • min_count:忽略总频率低于此值的所有词。
  • workers:训练模型时使用的线程数。 这些参数可以根据具体的数据集和需求进行调整。

text_to_vector 函数将单个文本(已分词)转换为一个向量。它通过对文本中的每个词的向量取平均值来实现。如果文本中的词不在 Word2Vec 模型的词汇表中,则忽略这些词。最后,使用np.clip确保向量中的所有值都是非负的,这有时可以帮助改善模型的性能。

通过这种方式,文本数据被转换为数值形式,可以被机器学习算法有效处理。向量化的文本数据可以用于训练分类器或进行聚类分析,以及其他多种数据分析任务。

from gensim.models import Word2Vec
import numpy as np

def train_word2vec(sentences, vector_size=100, window=5, min_count=5, workers=4):
model = Word2Vec(sentences, vector_size=vector_size, window=window, min_count=min_count, workers=workers)
return model

def text_to_vector(text, model):
vector = np.mean([model.wv[word] for word in text if word in model.wv], axis=0)
vector = np.clip(vector, 0, None)
return vector

分类和聚类

使用朴素贝叶斯分类器进行情感分类,并使用K-Means算法进行聚类分析。

from sklearn.naive_bayes import MultinomialNB
from sklearn.cluster import KMeans
from sklearn.metrics import classification_report

clf = MultinomialNB()
clf.fit(X, y)
data['predicted_label'] = clf.predict(X)

print("Classification Report:")
print(classification_report(y, data['predicted_label']))

kmeans = KMeans(n_clusters=5, random_state=42)
kmeans.fit(X)
data['cluster'] = kmeans.labels_

生成词云和可视化

生成词云展示关键词,可视化情感类别和聚类结果的分布。

from wordcloud import WordCloud
import matplotlib.pyplot as plt

def generate_wordcloud(text):
words = jieba.cut(text)
filtered_words = [word for word in words if word not in stopwords and len(word.strip()) > 1]
text_after_jieba = ' '.join(filtered_words)
wordcloud = WordCloud(font_path=FONT_PATH, width=800, height=400, background_color='white').generate(text_after_jieba)
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()

主函数

整合所有步骤,执行定时任务,生成最终的报告和预警。

def main():
# 实现所有分析步骤
...

if __name__ == "__main__":
main()