📊 数据科学与大数据专业 | 数据分析与模型构建 | 数据驱动决策
✨ 专业领域:
-
数据挖掘与清洗
-
大数据处理与存储技术
-
机器学习与深度学习模型
-
数据可视化与报告生成
-
分布式计算与云计算
-
数据安全与隐私保护
💡 擅长工具:
-
Python/R/Matlab 数据分析与建模
-
Hadoop/Spark 大数据处理平台
-
SQL数据库管理与优化
-
Tableau/Power BI 数据可视化工具
-
TensorFlow/PyTorch 深度学习框架
✅ 大数据技术专业题目与数据
1. 数据获取与预处理
本文旨在通过分析哔哩哔哩(b站)数码区手机测评视频中的弹幕和评论,探究不同层次手机用户的实际需求。为了确保数据的广泛性和代表性,我们首先将市场上的手机按照性能、价格等因素分为四类:高性价比手机、中端手机、高端手机以及折叠屏手机。随后,利用网络爬虫技术对b站数码区内相关测评视频进行大规模的数据抓取,共收集了29万余条弹幕和17万余条评论。
- 数据来源选择:
- 平台选择:选择b站作为数据来源的原因在于其庞大的用户基数和活跃度,尤其是年轻一代用户群体对数码产品的高度关注。此外,b站弹幕文化的独特性使得用户能够即时表达自己的看法,形成了丰富的互动内容。
- 数据抓取方法:
- 爬虫工具使用:采用了Python语言结合Scrapy框架构建了专门针对b站的爬虫程序,该程序能够高效地抓取目标视频页面下的所有弹幕和评论信息,并将其保存为结构化的文本文件格式。为了保证数据抓取的合法性和道德性,我们在设计爬虫时严格遵守网站的服务条款,并控制请求频率以减轻服务器负担。
- 数据预处理步骤:
- 清洗与筛选:由于原始抓取的数据可能存在噪声或无关信息,因此需要对其进行初步清洗。具体操作包括去除重复项、过滤掉明显不相关的言论(如广告、恶意攻击等),同时保留有效的时间戳以便后续分析。对于弹幕数据,还特别进行了去重处理,因为同一时间点出现大量相同内容的情况较为常见。
- 分词与标注:考虑到中文自然语言处理的特点,采用Jieba分词工具对每一条弹幕和评论进行精确分词,并根据领域知识手动添加了一些专有名词到词典中以提高分词准确性。接着,使用Stanford NLP工具包对分词后的文本进行了命名实体识别(NER)和依存句法分析,为下一步的主题建模打下坚实基础。
2. 主题建模与融合
鉴于弹幕和评论两种文本形式存在显著差异——前者多为简短且缺乏完整语法规则的片段式表达,后者则更倾向于系统性的观点陈述——我们分别采用了不同的主题建模方法来挖掘其中蕴含的信息价值。
- 弹幕主题建模:
- UIE-Bertopic框架应用:针对弹幕文本结构稀疏的问题,本文提出了基于统一信息提取引擎(UIE)和Bertopic算法相结合的新颖框架。首先,利用UIE模块从海量弹幕中自动抽取出具有明确指向性的关键实体(例如品牌名、型号号、功能特性等),从而过滤掉那些没有实际意义的“空洞”反馈。接下来,借助Bertopic强大的分布式表示能力,对经过预处理后的弹幕集合执行主题聚类任务,最终得到一系列相互独立又彼此关联的主题类别。
- 评论主题建模:
- LDA模型应用:对于相对完整的评论文本,则直接应用经典的LDA(Latent Dirichlet Allocation)主题模型来进行主题发现。LDA作为一种生成式概率模型,可以有效地揭示文档集中潜在的话题分布情况。通过对训练集参数调整优化,我们成功提取出了多个具有代表性的评论主题,涵盖了从硬件配置到软件生态等多个方面。
- 主题融合策略:
- 跨视角一致性检查:考虑到弹幕和评论虽然同属一个话题讨论范畴,但各自侧重的角度不尽相同,因此有必要建立一种机制来确保两者之间的一致性和互补性。为此,我们提出了一种基于相似度度量的主题融合算法,即先计算各单一视角下每个主题与其他主题之间的余弦相似度得分,然后选取得分较高的配对组合形成最终合并后的大主题。这一过程不仅增强了结果的鲁棒性,也更好地反映了用户真实意图。
3. 细粒度情感分析与Kano模型应用
在完成主题建模之后,为了进一步量化用户对不同类型手机的关注焦点及其满意度水平,本文引入了细粒度情感分析技术,并结合管理学领域的Kano模型理论深入剖析了各类别手机的关键属性。
- 情感分析实施:
- 方面词设定:根据前期主题建模的结果,确定了一系列具体的方面词作为情感分析的基础单元。这些方面词覆盖了手机的主要组成部分和技术指标,如外观设计、处理器性能、屏幕质量、电池续航、操作系统流畅度等。针对每一个方面词,我们都建立了正负向情感词汇表,用于指导机器学习模型判断每条评论的情感倾向。
- 模型训练与评估:选择了SVM(Support Vector Machine)和支持向量回归(SVR)作为分类器和回归器的核心组件,分别用来预测离散型情感标签(正面/负面)和连续型情感评分(0-5分)。通过交叉验证的方法不断调整超参数直至获得最优性能表现。实验结果显示,所构建的情感分析系统能够在保持较高准确率的同时实现快速响应,满足实际应用场景的需求。
- Kano模型应用:
- 需求分类依据:基于情感分析得出的各项指标得分,我们运用Kano模型对不同档次手机的用户需求进行了细致划分。Kano模型将产品特性分为五类:基本型需求、期望型需求、魅力型需求、无差异需求和反向需求。通过对比各类别手机在各个维度上的得分分布,我们可以清晰地看到哪些属性是用户最为关心且不可或缺的基本要素,哪些又是能带来额外惊喜的魅力因素。
- 具体建议总结:
- 高性价比手机:厂商应当保持外观、处理器、续航这三类属性的优秀性能,并根据成本预算选择性地提升屏幕、价格、系统属性,售后服务属于吸引用户的差异化亮点。
- 中端手机:应优先依次提升处理器、屏幕、续航、性价比,并将外观设计和质感做成自身亮点。
- 高端手机:应当维持系统、处理器、产品体验,依次提升屏幕、续航属性,并将品牌管理与产品外观设计打造成亮点。
- 折叠屏手机:应保持外观和产品体验属性,进一步提升屏幕性能,形成差异化的品牌管理、售后服务以及系统属性。
# 导入必要的库
import requests
from bs4 import BeautifulSoup
import jieba
from bertopic import BERTopic
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation as LDA
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC, SVR
from sklearn.metrics import classification_report, mean_squared_error
import pandas as pd
# 爬虫函数定义
def crawl_bilibili(video_url):
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(video_url, headers=headers)
soup = BeautifulSoup(response.content, 'html.parser')
# 提取弹幕和评论
danmu_elements = soup.find_all('d', class_='chat-item__content')
comment_elements = soup.find_all('div', class_='comment-text')
danmus = [danmu.text for danmu in danmu_elements]
comments = [comment.text.strip() for comment in comment_elements]
return danmus, comments
# 数据预处理函数定义
def preprocess_data(texts):
processed_texts = []
for text in texts:
words = jieba.lcut(text)
filtered_words = [word for word in words if len(word) > 1] # 过滤单字
processed_texts.append(' '.join(filtered_words))
return processed_texts
# 主题建模函数定义
def topic_modeling(danmus, comments):
# 弹幕主题建模 (UIE-BERTopic)
vectorizer_danmu = CountVectorizer()
X_danmu = vectorizer_danmu.fit_transform(preprocess_data(danmus))
topic_model_danmu = BERTopic(language="zh")
topics_danmu, probs_danmu = topic_model_danmu.fit_transform(X_danmu)
# 评论主题建模 (LDA)
lda_model = LDA(n_components=10, random_state=42)
X_comment = vectorizer_danmu.transform(preprocess_data(comments))
lda_topics = lda_model.fit_transform(X_comment)
return topics_danmu, lda_topics
# 情感分析函数定义
def sentiment_analysis(texts):
# 分割训练集与测试集
X_train, X_test = train_test_split(texts, test_size=0.2, random_state=42)
# 训练分类器 (SVM)
clf = SVC(kernel='linear', C=1.0)
clf.fit(vectorizer.fit_transform(X_train), labels_train)
predictions = clf.predict(vectorizer.transform(X_test))
print(classification_report(labels_test, predictions))
# 训练回归器 (SVR)
reg = SVR(kernel='rbf', C=100, gamma=0.1, epsilon=.1)
reg.fit(vectorizer.fit_transform(X_train), ratings_train)
predicted_ratings = reg.predict(vectorizer.transform(X_test))
mse = mean_squared_error(ratings_test, predicted_ratings)
print(f'Mean Squared Error: {mse}')
# Kano模型应用函数定义
def apply_kano_model(dataframe):
# 假设dataframe包含每个方面的平均得分
basic_needs = ['外观', '处理器', '续航']
performance_needs = ['屏幕', '价格', '系统']
excitement_needs = ['售后服务', '品牌管理']
kano_results = {}
for need_type, aspects in [('Basic', basic_needs), ('Performance', performance_needs), ('Excitement', excitement_needs)]:
avg_scores = dataframe[aspects].mean(axis=1)
kano_results[need_type] = avg_scores.describe()
return kano_results
# 主函数
if __name__ == "__main__":
video_urls = [...] # 视频链接列表
all_danmus, all_comments = [], []
for url in video_urls:
danmus, comments = crawl_bilibili(url)
all_danmus.extend(danmus)
all_comments.extend(comments)
# 执行数据预处理
processed_danmus = preprocess_data(all_danmus)
processed_comments = preprocess_data(all_comments)
# 执行主题建模
danmu_topics, comment_topics = topic_modeling(processed_danmus, processed_comments)
# 执行情感分析
sentiment_analysis(processed_comments)
# 构建DataFrame并应用Kano模型
df = pd.DataFrame({
'外观': np.random.rand(len(processed_comments)),
'处理器': np.random.rand(len(processed_comments)),
'续航': np.random.rand(len(processed_comments)),
'屏幕': np.random.rand(len(processed_comments)),
'价格': np.random.rand(len(processed_comments)),
'系统': np.random.rand(len(processed_comments)),
'售后服务': np.random.rand(len(processed_comments)),
'品牌管理': np.random.rand(len(processed_comments))
})
kano_results = apply_kano_model(df)
print(kano_results)