Я пытаюсь найти лучшее решение для сравнения двух одинаковых строк и выбора наиболее похожих.
У меня есть множество прямых названий фильмов. У меня также есть массив названий фильмов с дополнительным текстом.
Пример:
Мой массив с прямыми именами фильмов содержит такие строки:
"Super Troopers",
"Everest",
"Star Wars: Episode I The Phantom Menace"
Мой другой массив со строками фильма находится в формах, подобных следующему:
"Super Troopers (2001) 720P-AC3-x264",
"Everest - 2015.1080p.DTS mkv",
"Star Wars - Episode 1: The Phantom Menace 1080p h265 HEVC TrueHD"
То, что я сейчас делаю, — это циклический просмотр моего первого массива, сравнение каждого фильма со вторым массивом и использование strpos()
Если я найду точное соответствие, отлично. Если нет, мне нужно выполнить какую-то другую функцию, чтобы найти, какие две строки наиболее похожи. Я пытался использовать similar_text()
а также levenshtein()
со смешанными результатами.
В моих приведенных выше примерах, strpos()
Я бы отлично подошел как к Эвересту, так и к Супер-десантнику, но для строки Звездных войн мне нужны дополнительные проверки. Такие вещи, как дефисы и двоеточия, а также «I» и «1», используемые по-разному, а также дополнительная информация, которая следует за названием фильма, дают мне спорадические результаты с similar_text()
а также levenshtein()
Я думаю о том, что, возможно, сначала подставлю названия фильмов с дополнительной информацией, сначала вычислив strlen()
название фильма плюс 5 или около того дополнительных символов для хорошей меры перед запуском similar_text()
или же levenshtein()
function / s, так как одна общая вещь, которую они все имеют, — это названия их фильмов в начале строки. Это может сделать функции схожести строк, возможно, немного более точными?
Или, может быть, какая-то функция разбивает каждое слово и проверяет, сколько из них соответствует другой строке. Существует ли такая функция?
Я буду больше возиться с этим, но если у кого-нибудь есть какие-либо сведения о том, как они могут решить эту проблему, я хотел бы знать.
Благодарю.
У меня есть идея для интересного решения. Он использует базу данных. Каждый раз, когда вы получаете новый фильм в своей коллекции, вы разделяете название фильма на слова. Например:
"Star Wars: Episode I The Phantom Menace"
будет разделен на:
"Star", "Wars:", "Episode", "I", "The", "Phantom", "Menace"
Оттуда у вас будут следующие таблицы в вашей базе данных:
CREATE TABLE movie_search (
movie_keyword varchar(255) NOT NULL,
movie_id INT NOT NULL,
PRIMARY KEY (movie_keyword)
)
CREATE TABLE movies (
movie_id INT NOT NULL AUTO_INCREMENT,
movie_name varchar(255) NOT NULL,
PRIMARY KEY (movie_id)
)
Пример таблицы movie_search:
key_word | movie_id
star -------- 1
wars -------- 1
spider ------ 2
man --------- 2
Пример таблицы фильмов:
movie_id | movie_name
1 -------- star wars
2 -------- spider man
Каждый раз, когда кто-то хочет найти фильм на вашем сайте, вы разбиваете его фразу на все слова, используя explode(" ", $searched_name);
, Оттуда вы будете искать в своей базе данных все совпадающие совпадения ключевых слов в таблице movie_search, и если повторится movie_id, вы сможете увеличить количество найденных совпадений ключевых слов для каждого фильма. Таким образом, после выполнения поиска с хорошим PHP-кодом, ваш результат должен быть многомерным массивом с 3 элементами в каждой строке:
array (
[0] => array (
[movie_id] = 1,
[movie_name] = star wars,
[count] = 2),
[1] => array (...),
....
)
где фильм с наибольшим количеством ключевых слов (наибольшее количество) будет отображаться в верхней части массива. Вы также можете решить, сколько результатов вы хотите вывести, поместив «ORDER BY 10» в ваш код SQL
НАДЕЮСЬ, ЭТО ПОМОЖЕТ! 🙂
Других решений пока нет …