You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 10:04:51