Сравнение двух строк для сходства в переполнении стека

Я пытаюсь найти лучшее решение для сравнения двух одинаковых строк и выбора наиболее похожих.

У меня есть множество прямых названий фильмов. У меня также есть массив названий фильмов с дополнительным текстом.

Пример:

Мой массив с прямыми именами фильмов содержит такие строки:

"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, так как одна общая вещь, которую они все имеют, — это названия их фильмов в начале строки. Это может сделать функции схожести строк, возможно, немного более точными?

Или, может быть, какая-то функция разбивает каждое слово и проверяет, сколько из них соответствует другой строке. Существует ли такая функция?

Я буду больше возиться с этим, но если у кого-нибудь есть какие-либо сведения о том, как они могут решить эту проблему, я хотел бы знать.

Благодарю.

1

Решение

У меня есть идея для интересного решения. Он использует базу данных. Каждый раз, когда вы получаете новый фильм в своей коллекции, вы разделяете название фильма на слова. Например:

"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

НАДЕЮСЬ, ЭТО ПОМОЖЕТ! 🙂

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]