基于ML.Net实现书籍推荐:求输入喜好文本匹配推荐的编程示例
书籍摘要推荐系统实现示例
一、基于TF-IDF+余弦相似度的实现
这种方案适合快速搭建,对资源要求低,无需预训练模型,能满足基础的文本匹配需求。
步骤说明
- 从数据库读取书籍ID、标题和摘要数据
- 用TF-IDF将文本转换为可计算的特征向量
- 计算用户喜好文本与所有书籍摘要的余弦相似度
- 按相似度从高到低排序,取Top10返回
代码示例
import sqlite3 from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity def load_books_from_db(db_path): """从数据库加载书籍数据""" conn = sqlite3.connect(db_path) cursor = conn.cursor() cursor.execute("SELECT id, title, summary FROM books") books = cursor.fetchall() conn.close() return books def recommend_books(user_preference, books, top_n=10): """根据用户喜好推荐书籍""" # 提取所有书籍摘要 summaries = [book[2] for book in books] # 将用户输入与书籍摘要合并,统一做TF-IDF拟合 all_texts = summaries + [user_preference] # 初始化TF-IDF向量器(中文场景需替换分词器和停用词) tfidf = TfidfVectorizer(stop_words='english') tfidf_matrix = tfidf.fit_transform(all_texts) # 计算用户输入与所有书籍的相似度 user_vector = tfidf_matrix[-1] similarities = cosine_similarity(user_vector, tfidf_matrix[:-1])[0] # 按相似度排序,筛选TopN书籍 sorted_indices = similarities.argsort()[::-1][:top_n] recommended = [(books[i][1], similarities[i]) for i in sorted_indices] return recommended # 示例调用 if __name__ == "__main__": books = load_books_from_db("books.db") user_input = "我喜欢科幻小说,尤其是涉及太空探索和人工智能伦理的故事" recommendations = recommend_books(user_input, books) print("推荐书籍:") for title, score in recommendations: print(f"- {title} (相似度: {score:.4f})")
中文场景适配说明
如果处理中文文本,需引入分词工具和中文停用词表,修改TF-IDF初始化代码:
import jieba # 可自行加载中文停用词表,或使用第三方库提供的 chinese_stopwords = ["的", "了", "和", ...] def tokenize_chinese(text): return jieba.lcut(text) tfidf = TfidfVectorizer(tokenizer=tokenize_chinese, stop_words=chinese_stopwords)
二、基于Sentence-BERT的语义相似度实现
这种方案利用预训练语义模型,能更好地理解文本深层含义,推荐准确性更高,适合对匹配精度要求高的场景。
步骤说明
- 加载预训练的Sentence-BERT模型
- 将书籍摘要和用户喜好文本转换为语义向量
- 计算向量间的余弦相似度,取Top10推荐
代码示例
import sqlite3 from sentence_transformers import SentenceTransformer, util def load_books_from_db(db_path): """从数据库加载书籍数据""" conn = sqlite3.connect(db_path) cursor = conn.cursor() cursor.execute("SELECT id, title, summary FROM books") books = cursor.fetchall() conn.close() return books def recommend_books(user_preference, books, top_n=10): """使用Sentence-BERT推荐书籍""" # 加载预训练模型(中文场景替换为'uer/sbert-base-chinese-nli') model = SentenceTransformer('all-MiniLM-L6-v2') # 批量生成书籍摘要的语义向量 summaries = [book[2] for book in books] book_embeddings = model.encode(summaries, convert_to_tensor=True) # 生成用户输入的语义向量 user_embedding = model.encode(user_preference, convert_to_tensor=True) # 计算相似度 cos_scores = util.cos_sim(user_embedding, book_embeddings)[0] # 获取TopN结果 top_results = cos_scores.topk(k=top_n) recommended = [(books[i][1], cos_scores[i].item()) for i in top_results.indices] return recommended # 示例调用 if __name__ == "__main__": books = load_books_from_db("books.db") user_input = "I love science fiction novels about space exploration and AI ethics" recommendations = recommend_books(user_input, books) print("推荐书籍:") for title, score in recommendations: print(f"- {title} (相似度: {score:.4f})")
优化建议
- 若书籍数据量较大(如百万级),可预先计算所有书籍的语义向量并存储到数据库,避免每次推荐重复计算,提升响应速度
- 安装依赖:
pip install scikit-learn sentence-transformers(sqlite3为Python内置库)
内容的提问来源于stack exchange,提问作者coolblue2000
相关产品推荐
相关产品推荐

