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

电影名称匹配功能异常:复制数据集内名称仍返回None

电影名称匹配功能异常:复制数据集内名称仍返回None

嘿,我完全懂你现在的挫败感——明明从自己的数据集里直接复制电影名称输入,结果匹配函数还是返回None,这实在太闹心了。咱们来一步步排查问题,找到解决办法:

首先,揪出最可能的核心问题:你的数据合并方式把部分电影给过滤掉了!

你看,你用pd.merge(movies_pd, movie_stats, on="movieId")做合并,这个默认是内连接(inner join)——也就是说,只有同时出现在movies_pd(电影列表)和movie_stats(有评分记录的电影)里的影片才会被保留到pd1里。如果你复制的是movies.csv里某部没有任何评分记录的电影,那它根本不在pd1的title列里,自然匹配不到,返回None。

解决办法1:保留所有电影(包括无评分的)

把合并方式改成左连接(left join),这样不管电影有没有评分,都会保留在pd1里:

pd1 = pd.merge(movies_pd, movie_stats, on="movieId", how="left")

这样即使某部电影没有评分,它的标题也会出现在候选列表里,你复制的名称就能匹配到了。另外建议把变量books改成movie_titles,避免和书籍混淆,代码可读性会更好。

其他可能的排查点

  • 去掉过于宽泛的try-except:你现在的find_book函数里用了except:捕获所有异常,这会掩盖很多潜在错误(比如参数类型问题)。建议暂时去掉try-except,或者只捕获特定异常,这样能看到具体的报错信息,方便调试。
  • 验证字符串是否真的一致:有时候看起来一样的字符串可能藏着隐藏字符(比如全角空格、换行符),可以在代码里加几行验证:
    # 查看输入字符串的原始形式
    print("输入的字符串原始格式:", repr(user_input))
    # 检查数据集中是否存在完全匹配的标题
    match_in_data = pd1[pd1["title"].str.strip().str.lower() == user_input]
    print("数据集中的匹配结果:", match_in_data)
    
    如果这里输出为空,就说明你复制的电影确实不在pd1里,左连接的修改就能解决问题。
  • 确认匹配分数逻辑:完全匹配的字符串score应该是100,肯定会满足score>70的条件,所以如果匹配不到,大概率是数据里根本没有这个标题,而不是分数阈值的问题。

调整后的示例代码

我把几个关键修改点整合到代码里了:

from surprise import SVD, Dataset
from surprise import Reader
import pandas as pd
from fuzzywuzzy import process

def find_movie(user_input, movie_titles):
    result = process.extractOne(user_input, movie_titles)
    if result:  
        match, score = result  
        if score > 70:  
            return match
    return None  

movies_pd = pd.read_csv('movies.csv')
rating_pd = pd.read_csv('ratings.csv')

movie_stats = rating_pd.groupby("movieId").agg(
    avg_rating = ("rating","mean"),
).reset_index()

# 改成左连接,保留所有电影
pd1 = pd.merge(movies_pd, movie_stats, on="movieId", how="left")

# 变量名改成movie_titles,语义更清晰
movie_titles = pd1["title"].str.strip().str.lower()
user_input = input("what movie have you watched? ").strip().lower()

# 新增验证步骤,方便排查
print("输入的字符串原始格式:", repr(user_input))
match_in_data = pd1[pd1["title"].str.strip().str.lower() == user_input]
print("数据集中的匹配结果:", match_in_data)

match_movie = find_movie(user_input, movie_titles)
print(match_movie)

备注:内容来源于stack exchange,提问作者reza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:17:59