У меня есть список имен файлов и список названий, которые я хочу сопоставить друг с другом. (Для приложения отслеживания телешоу я пишу)
Пример:
[Commie] Psycho-Pass 2 - 01 [495A3950].mkv //filename
Psycho-Pass 2 // title it should be matched to
[UTW]_Fate_Kaleid_Liner_Prisma_Ilya_2wei_-_01_[h264-720p][34F564F6].mkv
Fate Kaleid Liner Prisma Ilya 2wei
The.Big.Bang.Theory.S08E05.720p.HDTV.X264-DIMENSION[rartv]
The Big Bang Theory
Modern.Family.S06E03.720p.HDTV.x264-KILLERS[rartv]
Modern Family
Я нахожу регулярное выражение несколько утомительным решением, поскольку формат имени файла не всегда одинаков. Я думал о сравнении, где система будет принимать решение на основе доверительного измерения (процентный порог). Фактические названия предварительно определены в базе данных (без номера эпизода). Мне нужно сопоставить имя файла с названием.
Я не хочу идти по пути машинного обучения, если в этом нет необходимости;)
Есть идеи?
Не подойдет ли следующий простой метод?
for each $title
$count = 0
for each $word in $title
if $word in $filename:
$count++
/* additive error */
if count >= (number of words in title) - $some_alpha:
/* found matching title */
/* multiplicative error */
if count / (number of words in title) >= $some_percentage:
/* found matching title */
Или вы ищете что-то более сложное?
После некоторого исследования я наткнулся на levenshtein
метод php:
http://php.net/manual/en/function.levenshtein.php
Поскольку у меня уже есть база данных, заполненная именами Show, и я просто хочу сопоставить имя файла, я могу использовать этот метод для перебора каждого имени шоу и выбора наилучшего соответствия!
Согласно вашему тексту, у вас есть база данных со списком уже сохраненных заголовков. Теперь вы хотите сопоставить их с именами файлов. Ниже у меня есть код, который сделает это. Я использовал матч и не совпадает в тех местах, где вы бы поставили вещи, если они совпадают.
Первое, что вам нужно сделать, это очистить имя файла, а затем сопоставить заголовки с именем файла. В этом случае я просто скажу, что вы пытаетесь сопоставить заголовки с именами файлов из вашего списка [Commie] Psycho-Pass 2 — 01 [495A3950] .mkv. Код показан ниже. Вы можете скопировать и вставить, и это будет работать.
/** list of titles from the database**/
$title_array = ["Psycho-Pass 2", "Fate Kaleid Liner Prisma Ilya 2wei", "The Big Bang Theory", "Modern Family"];
/** filename you want to match with the titles **/
$filename_raw = "[Commie] Psycho-Pass 2 - 01 [495A3950].mkv";
/**
* Clean the $filename
* Replace the dot and underscore with space, and remember to escape the characters, because they are special
* Here we just have a variable holding the pattern we need to replace and the replacement
**/
$patterns = array ('/\./','/\_/');
$replace = array (' ', ' ');
/**
* this is were replacement occurs
**/
$filename_clean = preg_replace($patterns, $replace, $filename_raw);
foreach($title_array as $title){
if (strpos($filename_clean,$title) !== false) {
echo "Match <br />";
/**
* you might want to put a break here since your have already found the match but I will leave that up to you
*/
}else{
echo "Match Not found<br />";
}
}