终极算法 豆瓣是一款Python工具包,通过爬取豆瓣图书数据和深度学习算法推荐系统,帮助用户更好地发现、筛选、推荐符合自己喜好的图书。下面将分别从数据爬取、算法模型和推荐系统三个方面进行详细阐述。
一、数据爬取
1、使用requests和BeautifulSoup库进行页面解析。
import requests
from bs4 import BeautifulSoup
url = 'https://book.douban.com/top250'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
2、使用正则表达式获取图书信息。
pattern = re.compile(r'([0-9]+).(.*?).*?author">(.*?).*?year">(.*?).*?star">(.*?).*?span> ((.*?))', re.S)
items = re.findall(pattern, r.text)
3、将获取的数据写入CSV文件。
import csv
with open('books.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['排名', '书名', '作者', '出版日期', '评分', '评价人数', '书籍链接'])
for item in items:
writer.writerow([item[0], item[2], item[3], item[4], item[5], item[6], item[1]])
二、算法模型
1、使用Keras库构建神经网络模型。
from keras.models import Sequential
from keras.layers import Embedding, Dense, Flatten
model = Sequential()
model.add(Embedding(input_dim=num_words, output_dim=32))
model.add(Flatten())
model.add(Dense(units=1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
2、训练模型并保存。
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_val, y_val))
model.save('recommendation_model.h5')
3、在应用程序中加载模型并做出预测。
from keras.models import load_model
model = load_model('recommendation_model.h5')
prediction = model.predict(X_test)
三、推荐系统
1、使用Pandas库对图书数据进行处理。
import pandas as pd
df = pd.read_csv('books.csv')
df['评分'] = df['评分'].apply(lambda x: float(x))
df['评价人数'] = df['评价人数'].apply(lambda x: int(re.sub('D', '', x)))
2、将用户对图书的评分转换为二进制向量。
import numpy as np
def get_binary_vector(user_rating):
binary_vector = np.zeros(len(df), dtype=int)
for i, isbn in enumerate(df.ISBN):
if isbn in user_rating:
binary_vector[i] = user_rating[isbn]
return binary_vector
user_rating = {'0394800133': 5, '1416909427': 4, '059035342X': 3}
user_vector = get_binary_vector(user_rating)
3、计算用户向量与所有图书向量的相似度,并选出最相似的n本图书。
from sklearn.metrics.pairwise import cosine_similarity
cosine_similarities = cosine_similarity(df_matrix, user_vector.reshape(1,-1)).flatten()
related_indexes = cosine_similarities.argsort()[:-n-1:-1]
4、输出推荐结果。
for i in range(n):
related_index = related_indexes[i]
print(f"推荐图书{i+1}:{df.iloc[related_index]['书名']},作者:{df.iloc[related_index]['作者']},评分:{df.iloc[related_index]['评分']},评价人数:{df.iloc[related_index]['评价人数']}")