如何检查关键字是否与推荐系统中的电影名称相似?
How can i check if the keyword is similar to the movie title in my recommendation system?
我已经尝试了所有我知道的方法来检查关键字是否与我的 dataset.csv 电影标题中的内容相似,但没有任何效果。如果标题与数据集中的标题完全相似,它只会向我推荐电影。例如:如果我搜索 Spider-Man 3 那么它会向我推荐与之相关的电影,但是如果我搜索蜘蛛侠 3 那么它就不会知道我的意思并显示错误。
import pandas as pd
import openpyxl
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import CountVectorizer
df = pd.read_csv('dataset.csv')
df.head(3)
df['Movie_id'] = range(0,1000)
#print(df.head(10))
#print(df.shape)
columns = ['Actors', 'Director', 'Genre', 'Title']
#print(df[columns].head(3))
#print(df[columns].isnull().values.any())
def important(data):
features = []
for i in range(0, data.shape[0]):
features.append(data['Actors'][i]+' '+data['Director'][i]+' '+data['Genre'][i]+' '+data['Title'][i])
return features
df['features'] = important(df)
#print(df.head(3))
cm = CountVectorizer().fit_transform(df['features'])
cs = cosine_similarity(cm)
print(cs)
print(cs.shape)
title = "Spider-Man 3"#works
#title = "spider man" doesnt works
movie_id = df[df.Title == title]['Movie_id'].values[0]
scores = list(enumerate(cs[movie_id]))
sorted_Scores = sorted(scores, key = lambda x:x[1], reverse=True)
sorted_Scores = sorted_Scores[1:]
print(sorted_Scores)
a = 0
print("The 10 most recommended movie to", title, 'are:')
for item in sorted_Scores:
movie_title = df[df.Movie_id == item[0]]['Title'].values[0]
print(a+1, movie_title)
a += 1
if a > 9:
break
那么我如何根据这段代码将其设为关键字。
您可以使用 fuzzywuzzy 库。
from fuzzywuzzy import process, fuzz
titles = df['Title'].unique().tolist()
fuzzy_matches = process.extract('Spider-Man 3', titles, scorer=fuzz.token_set_ratio)
在此之后,fuzzy_matches
应该包含具有相似词的元组以及它们相似程度的值。然后,您可以获取最合适的标题并进行搜索。
像这样:
best_fitting_title = fuzzy_matches[0][0]
movie_id = df[df.Title == best_fitting_title]['Movie_id'].values[0]
我没有完全测试它,因为我没有示例数据,但它应该可以工作。
你的问题是你试图在这里通过准确的标题找到电影:
movie_id = df[df.Title == title]['Movie_id'].values[0]
在那里你寻找 df.Title == title
如果标题有任何不同,它找不到任何东西。
您的解决方案是使用某种字符串相似性算法来查找与您的关键字最相似的现有标题。这是一个最小的工作示例,使用 python 的内置 SequenceMatcher
来查找与您的关键字最相似标题的电影 ID。
from difflib import SequenceMatcher
from functools import partial
import pandas as pd
df = pd.DataFrame([{'Movie_id': 0, 'Title': 'Spider-Man 3'},
{'Movie_id': 1, 'Title': 'Iron-Man 3'},
{'Movie_id': 2, 'Title': 'Titanic'},
{'Movie_id': 3, 'Title': 'Iconic'}])
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
title = 'ironman 3'
most_similar_index = df[['Title']].apply(lambda row: similar(row['Title'], title), axis=1).argmax()
movie_id = df.loc[most_similar_index, 'Movie_id']
输出:
print(movie_id)
1
使用fuzzywuzzy
包:
# Python env: pip install fuzzywuzzy
# Anaconda env: conda install fuzzywuzzy
from fuzzywuzzy import extractOne
>>> df
Movie_id Movies
0 11 Spider-Man
1 12 Superman
2 12 Batman
>>> title
'Spider 3'
>>> extractOne(title, df['Movies'])
('Spider-Man', 82, 0)
# (text, score, index)
>>> df.iloc[extractOne(title, df['Movies'], score_cutoff=80)[2]]['Movie_id']
11
我已经尝试了所有我知道的方法来检查关键字是否与我的 dataset.csv 电影标题中的内容相似,但没有任何效果。如果标题与数据集中的标题完全相似,它只会向我推荐电影。例如:如果我搜索 Spider-Man 3 那么它会向我推荐与之相关的电影,但是如果我搜索蜘蛛侠 3 那么它就不会知道我的意思并显示错误。
import pandas as pd
import openpyxl
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import CountVectorizer
df = pd.read_csv('dataset.csv')
df.head(3)
df['Movie_id'] = range(0,1000)
#print(df.head(10))
#print(df.shape)
columns = ['Actors', 'Director', 'Genre', 'Title']
#print(df[columns].head(3))
#print(df[columns].isnull().values.any())
def important(data):
features = []
for i in range(0, data.shape[0]):
features.append(data['Actors'][i]+' '+data['Director'][i]+' '+data['Genre'][i]+' '+data['Title'][i])
return features
df['features'] = important(df)
#print(df.head(3))
cm = CountVectorizer().fit_transform(df['features'])
cs = cosine_similarity(cm)
print(cs)
print(cs.shape)
title = "Spider-Man 3"#works
#title = "spider man" doesnt works
movie_id = df[df.Title == title]['Movie_id'].values[0]
scores = list(enumerate(cs[movie_id]))
sorted_Scores = sorted(scores, key = lambda x:x[1], reverse=True)
sorted_Scores = sorted_Scores[1:]
print(sorted_Scores)
a = 0
print("The 10 most recommended movie to", title, 'are:')
for item in sorted_Scores:
movie_title = df[df.Movie_id == item[0]]['Title'].values[0]
print(a+1, movie_title)
a += 1
if a > 9:
break
那么我如何根据这段代码将其设为关键字。
您可以使用 fuzzywuzzy 库。
from fuzzywuzzy import process, fuzz
titles = df['Title'].unique().tolist()
fuzzy_matches = process.extract('Spider-Man 3', titles, scorer=fuzz.token_set_ratio)
在此之后,fuzzy_matches
应该包含具有相似词的元组以及它们相似程度的值。然后,您可以获取最合适的标题并进行搜索。
像这样:
best_fitting_title = fuzzy_matches[0][0]
movie_id = df[df.Title == best_fitting_title]['Movie_id'].values[0]
我没有完全测试它,因为我没有示例数据,但它应该可以工作。
你的问题是你试图在这里通过准确的标题找到电影:
movie_id = df[df.Title == title]['Movie_id'].values[0]
在那里你寻找 df.Title == title
如果标题有任何不同,它找不到任何东西。
您的解决方案是使用某种字符串相似性算法来查找与您的关键字最相似的现有标题。这是一个最小的工作示例,使用 python 的内置 SequenceMatcher
来查找与您的关键字最相似标题的电影 ID。
from difflib import SequenceMatcher
from functools import partial
import pandas as pd
df = pd.DataFrame([{'Movie_id': 0, 'Title': 'Spider-Man 3'},
{'Movie_id': 1, 'Title': 'Iron-Man 3'},
{'Movie_id': 2, 'Title': 'Titanic'},
{'Movie_id': 3, 'Title': 'Iconic'}])
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
title = 'ironman 3'
most_similar_index = df[['Title']].apply(lambda row: similar(row['Title'], title), axis=1).argmax()
movie_id = df.loc[most_similar_index, 'Movie_id']
输出:
print(movie_id)
1
使用fuzzywuzzy
包:
# Python env: pip install fuzzywuzzy
# Anaconda env: conda install fuzzywuzzy
from fuzzywuzzy import extractOne
>>> df
Movie_id Movies
0 11 Spider-Man
1 12 Superman
2 12 Batman
>>> title
'Spider 3'
>>> extractOne(title, df['Movies'])
('Spider-Man', 82, 0)
# (text, score, index)
>>> df.iloc[extractOne(title, df['Movies'], score_cutoff=80)[2]]['Movie_id']
11