微博舆情监测系统介绍
本程序为一个多功能的文本处理和分析工具,基于前一步微博爬虫得到的数据,主要用于情感分析、文本聚类、生成词云和预警检查。
程序模块和功能概览
- 配置和初始化:设置日志、字体和加载停用词(
stopwords.txt
)。 - 文本预处理:使用结巴分词(jieba)对文本进行分词和清洗。
- 情感标记:根据预设的正负面词汇(
neg_words.txt
和pos_words.txt
)标记数据。 - 数据加载和处理:加载数据集(
data.csv
),应用文本预处理和标记。 - 情感分析:使用SnowNLP库分析文本情感。
- Word2Vec模型训练:训练一个Word2Vec模型来获取文本的向量表示。
- 文本向量化:将处理过的文本转换成向量。
- 分类模型训练和评估:使用朴素贝叶斯分类器进行情感分类,并生成分类报告。
- 聚类分析:使用K-Means算法对文本向量进行聚类。
- 预警检查:根据讨论热度和情感倾向生成预警。
- 生成词云:对聚类结果和整体数据生成词云,可视化关键词。
- 可视化:展示情感类别和聚类结果的分布。
- 执行主函数:将所有步骤综合起来,执行定时任务。
具体代码解释
配置和初始化
配置日志和字体,以支持中文显示和记录程序运行时的信息。加载停用词表,这些词在分词后会被过滤掉,以便准确分析文本的有效内容。
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()