此内容根据文章生成,仅用于文章内容的解释与总结
该项目适合作为小型的项目原型,适合教学和练手。最初这个项目的灵感源于我的个人需求,我需要一个工具来查看主流话题,同时又不想下载一堆 APP 来接收推送。项目最终的数据使用github pages来展示。
项目开源地址:https://github.com/jiangyangcreate/SocialMood
项目查看地址:https://jiangyangcreate.github.io/SocialMood/
使用流程
# 安装依赖
cd python
python setup.py
# 运行数据抓取,生成静态网页
python crawler.py
依赖安装
所需依赖可以通过 setup.py
下载安装。因为有些模块不是pip就算安装好的。
setup.py
import subprocess
import sys
import nltk
def install_requirements():
print("正在安装依赖...")
subprocess.check_call([sys.executable, "-m", "pip", "install", "-r", "requirements.txt"])
def install_browser():
print("正在安装浏览器...")
subprocess.check_call([sys.executable, "-m", "playwright", "install"])
def download_nltk_data():
print("正在下载NLTK词典文件...")
nltk.download('vader_lexicon')
def download_qwen2_model():
try:
print("正在下载Qwen2大模型(7B)...")
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "Qwen/Qwen2.5-7B-Instruct"
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
prompt = "请回复:你好,我是Qwen2大模型,有什么可以帮您的吗?"
messages = [
{"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(
**model_inputs,
max_new_tokens=512
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print('Qwen2大模型(7B)响应:', response)
except Exception as e:
print(f"跳过下载Qwen2大模型(7B),出现错误:{e}")
def main():
try:
install_requirements()
install_browser()
download_nltk_data()
download_qwen2_model()
print("所有安装步骤已完成!")
except subprocess.CalledProcessError as e:
print(f"安装过程中出现错误:{e}")
sys.exit(1)
if __name__ == "__main__":
main()
主要功能
该系统的主要功能包括:
- 抓取热搜数据:从微博、抖音、B站等平台抓取热搜数据。
这里也可以通过API获取,爬取注意不要变成DDOS攻击。
- 数据处理:使用 Pandas 进行数据清洗与处理。
使用pandas主要是处理一些文本型的数据,譬如10万要换算为100000。
使用jieba分词 用于后续词云图生成,需要剔除一些单字与标点符号。当然,最近b站很喜欢在标题中加空格,所以要先去空格再分词。
有些数据的热度值还没计算出来,可以使用幂律分布的线性回归填补热度缺失值。这里使用指数回归、普通线性回归效果都不好。
幂律分布常见的样子:个人UP主粉丝排名前几名粉丝差距有百万,像指数分布。但是后续排名的up粉丝差距就很小,接近线性分布。如果我随机扣掉一个排名的up主的粉丝数,让你预测,你可以预测多准。我面对的大概就是这样的一个问题。
下面是我的解决方案:
def estimate_missing_heat(self):
"""估算缺失的热度值"""
features = ["排名"]
target = "处理后热度"
def impute_group(group):
X = group[features]
y = group[target]
# 如果没有缺失值,直接返回原始组
if not y.isnull().any():
return group
# 幂律分布拟合(通过对数变换实现)
X_train = X[y.notnull()]
y_train = y[y.notnull()]
# 将 X_train 转换为浮点数类型
X_train = X_train.astype(float)
# 对X和y进行对数变换,处理可能的零值
log_X_train = np.log(X_train + 1)
log_y_train = np.log(y_train + 1)
lr = LinearRegression()
lr.fit(log_X_train, log_y_train)
# 获取拟合的系数
slope = lr.coef_[0]
intercept = lr.intercept_
# print(f"拟合的幂律方程为: y = {np.exp(intercept):.2f} * x^{slope:.2f}")
# 预测缺失值
X_missing = X[y.isnull()]
if not X_missing.empty:
# 将 X_missing 转换为浮点数
X_missing = X_missing.astype(float)
log_X_missing = np.log(X_missing + 1)
log_predictions = lr.predict(log_X_missing)
predictions = np.exp(log_predictions) - 1 # 反向变换
# 确保预测值不小于0
predictions = np.maximum(predictions, 0)
# 确保预测值符合排名顺序
for i, pred in enumerate(predictions):
rank = X_missing.iloc[i]["排名"]
higher_ranks = y[(X["