Проблема с сопоставлением текста stristr в PHP

Я запускаю довольно простой скрипт, который пытается сопоставить строки из файла csv с потенциальными совпадениями в таблице mysql (сопоставление: ut8_general_ci). Для каждой строки в CSV-файле я вытаскиваю нужную строку (стог сена), которая выглядит примерно так:

"Полноправный комендант города Ратленд Ратленд, штат Вирджиния"

Для каждой строки я извлекаю список совпадений из моей базы данных и циклически перебираю их, пока stristr не найдет совпадение. (Я использую stristr вместо регулярного выражения, потому что это проще и (я думаю?) быстрее.) Некоторые совпадающие строки не имеют грамматического/синтаксического смысла, потому что они созданы как псевдонимы, характерные для этого набора данных. Одним из них является «City of Rutland Rutland VT» (псевдоним «City of Rutland (VT)»), который должен, но не соответствует приведенной выше строке. Для более чем 90% этих совпадений у меня нет никаких проблем. Однако определенное сопоставление текста, похоже, не работает.

Вот список тех, которые не могут привести к совпадению:

Стог сена => Игла

  • «Полноправный член города Окала, Окала, Флорида» => «Город Окала, Окала, Флорида»
  • «Действительный член правления округа водоснабжения и санитарии Энтони, штат Нью-Мексико» => «Округ водоснабжения и санитарии Энтони»
  • «Энергетический чистый воздух и изменение климата Subcmte Member Consol Inc.» => "Консоль Инк."
  • «Действительный член совета; старший вице-президент по интегрированным услугам Burke Inc. Цинциннати, Огайо» => «Burke Inc.»
  • «Город Сан-Антонио, Техас» => «Город Сан-Антонио, Техас»
  • «Полноправный член United National Indian Tribal Youth Inc. (UNITY)» => «United National Indian Tribal Youth Inc.»
  • «Субчлен ECA&CC, Кипр, Amax Minerals Inc.» => "Кипр Амакс Минералз Инк."
  • «Производственная группа Кремниевой долины» => «Производственная группа Кремниевой долины»
  • "Президент Global Environmental Resources Inc. Вашингтон, округ Колумбия" => "Global Environmental Resources Inc."
  • "Ланкастер Лабораториз Инк." => "Ланкастер Лабораториз Инк."

Я не уверен, что с этим делать, если только это не что-то очень простое, что я полностью пропустил. кажется, что большинство ошибок имеют "вкл." в матче, но не уверен, что это его причина.

Вот код (хотя ответ ниже отвечает всем требованиям):

$patterns = array();
$patterns[0] = '/\s+/';
$patterns[1] = '/&/';

$replacement = array();
$replacement[0] = ' ';
$replacement[1] = 'and';

$name = trim(preg_replace($patterns,$replacement,$name));

if(stristr($name,trim(preg_replace($patterns,$replacement,$org->org_name)))) {
// code here
}

Сейчас это не очень изящно, и я был бы признателен за любую дополнительную информацию о том, как нормализовать строки для сопоставления.


person tchaymore    schedule 04.04.2011    source источник
comment
Опубликуйте часть своего кода, пожалуйста.   -  person Khez    schedule 05.04.2011


Ответы (1)


Я предполагаю, что вы просматриваете это через браузер как html, так что (несколько) пробелов все сжимаются в один пробел. Таким образом, выглядит должно совпадать, но это не так.

Удобный способ предотвратить это с небольшими побочными эффектами — предварительно обработать и иголку, и стог сена:

$needle = trim(preg_replace('/\s+/',' ',$needle));
$haystack = trim(preg_replace('/\s+/',' ',$haystack));

trim() предназначен для решения проблем, вызванных начальными или конечными пробелами.

person mvds    schedule 04.04.2011
comment
Я бы дополнительно сделал дальнейшую нормализацию, такую ​​​​как нижний регистр. - person jmathai; 05.04.2011
comment
Удаление диакритических знаков (используя iconv) также является хорошим решением. Плюс удаление всех, кроме [a-z]. - person mvds; 05.04.2011