Как из слова или фразы получить все возможные варианты написания?

simbel

Новичок
Как из слова или фразы получить все возможные варианты написания?

Допустим есть такой текст - "Sony DCR DVD508E". Как сделать, чтобы скрипт составил все варианты написания этой фразы. Т.е например,
--> SonyDCRDVD508E
--> Sony DCRDVD508E
--> SonyDCR DVD508E
--> SonyDCRDVD 508E
--> SonyDCRDVD508 E
--> Sony DCR DVD508E
--> Sony DCRDVD 508E
--> Sony DCRDVD508 E
--> Sony DCR DVD 508E
--> SonyDCR DVD 508 E
и т.д.

Общую схему я вижу такой:
1) Для начала нужно разделить строку на подстроки - числовые и буквенные (из "Sony DCR DVD508E" должно получиться 5 подстрок - "Sony", "DCR", "DVD", "508", "E" ). У меня возникла сложность как из строки выделить числовые подстроки, если они не разделены пробелами.
2) Дальше тоже для меня большой вопрос, каким образом, собственно, составить вышеприведённые варианты написания. При этом последовательность подстрок в получаемых строках должна быть сохранена.

Помогите, подскажите, пожалуйста.
 

simbel

Новичок
В принципе, с первым пунктом разобрался кое-как. Не знаю эффективно это, совсем ли правильно. Но вроде разделяется:
PHP:
$good = 'Sony DCR DVD508E';
for($n=0;$n<strlen($good);$n++){
  if((!is_numeric($good[$n]) && !empty($good[$n-1]) && is_numeric($good[$n-1])) || (is_numeric($good[$n]) && !empty($good[$n-1]) && !is_numeric ($good[$n-1]))){
     $sin .= ' '.$good[$n];
  }
  else{
     $sin .= $good[$n];
  }
}
echo $sin;
Второй пункт пока остаётся загадкой не решённой. Всё что пытался сделать вообще не то.

-~{}~ 19.03.08 02:42:

Регуляркой не пытался, потому-что не очень с ней дружу.
 

zerkms

TDD infected
Команда форума
из "Sony DCR DVD508E" должно получиться 5 подстрок - "Sony", "DCR", "DVD", "508", "E"
ну ладно "508 Е", а на основе какой логики разделяются остальные подстроки?
 

simbel

Новичок
В этом цикле отделяются только цифры от букв пробелами.
Там где уже есть пробел остаётся без изменений.
В результате получается, что все нужные подстроки отделены пробелами.
Дальше explode(' ', $sin) создаем массив подстрок и как-то дальше делаем второй пункт. Пока не придумал... думаю. Если есть мысли по этому поводу - приму с благодарностью.

-~{}~ 19.03.08 03:13:

Похоже здесь нужна рекурсивная функция...

а б в г д

аб в г д
а бв г д
а б вг д
а б в гд

абв г д
а бвг д
а б вгд

абвг д
а бвгд

абвгд
 

fixxxer

К.О.
Партнер клуба
не знаю конечно что за задача решается, но для поиска лучше наоборот приводить все к некоей "нормальной" форме
 

Wicked

Новичок
fixxxer, korchasa
+2

zerkms
DVD508 по тому же принципу, что и 508E.
Остальные же и так разделены пробелами.
Все логично.

simbel
а б в г д

аб в г д
а бв г д
а б вг д
а б в гд

абв г д
а бвг д
а б вгд

абвг д
а бвгд

абвгд
что-то не вижу "абв гд" и им подобных.
 

Alexandre

PHPПенсионер
если найти общее правило разделения, то можно написать регулярку, а то для одного товара так:
SonyDCR DVD 508 E , а для других:
Sony VCT-FXA
SONY Corporation 128 bit Sony Playstation PSP
Sony NEC Optiarc Inc. NEC Sony Optiarc DVD±RW+CD/RW AD-5200A(-01)
SONY Corporation DVD/MPEG4 SONY DVP-NS28
SONY Corporation standart LCD HOOD for Nikon D70S JND70SS HVL-FSL1
SONY Corporation 08.1 Mpx 03x Optical Zoom Sony DSC-T70/B Black 3.0" LCD, MS Duo (NEW) DSC-T30/S

это для примера: несколько товаров разных категорий
 

Beavis

Banned
ну выделять надо прежде всего слова, ограниченные пробелами или спецсимволами, и цифры ограниченные буквами, пробелами или спецсимволами...

а потом все варианты написания можно перебрав составив примерно такую табличку
000...000
000...001
000...010
000...011
...
111...111
 

Alexandre

PHPПенсионер
про таблицу не очень понял...
что с ней делать?

-~{}~ 19.03.08 09:42:

вот два варианта
--> Sony DCR DVD508E
--> Sony DCRDVD 508E
508Е мы отсекаем регуляркой,
а как распознать: 'DCR DVD' & DCRDVD что это одно и тоже ?
как мне видится, необходимо искать ключевые фразы и от них уже отталкиваться, искать их вхожения в номенклатуре товара:
Sony - производитель
DCR_DVD - вид технологии
508 E - вид модели...
с камерами легко, но с другими наименованиями посложнее.
 

fixxxer

К.О.
Партнер клуба
ваще постановка задачи дурацкая.
пока тредстартер не объяснит, почему нельзя сделать так, как я сказал выше, нечего гадать ваще
 

simbel

Новичок
В разных прайс-листах различных интерне-магазинов часто втречаются вариации написания названия одной и тойже модели.
Вот я и решил сделать так, что бы на основе введённого названия Sony DCR DVD508E создавался список различных вариантов названия.
И после этого уже осуществлять поиск по БД всех этих вариантов.
Может и не идеально, но всё же больше найдётся, чем если искать только по введённому назанию. И при этом не будет захватываться ничего лишнего.
 

crocodile2u

http://vbolshov.org.ru
убирай все пробелы везде - и в искомой фразе, и в данных. Все будет в лучшем виде.
 

simbel

Новичок
Выше предлагали сделать список:
000...000
000...001
000...010
000...011
...
111...111
каким образом его можно сооздать? Уже всё передумал. Не проще ли напрямую работать с самой фразой разделённой на подстроки?

-~{}~ 19.03.08 10:24:

Если убрать все пробелы в искомых данных, то как это будет выглядеть при выводе таких данных на страницу? Монолитом? По-моему это не подходит... Или есть какие-то нюансы?
 

fixxxer

К.О.
Партнер клуба
а держать две варианта - оригинал и "нормализованный" - разве очень тяжело?
 

Alexandre

PHPПенсионер
для поиска лучше убить все спецсимволы и искать по нормализованному варианту, вариант fixxxer + crocodile2u

но возможные запросы в поисковой строке:
DCR DVD
sony 508
dcr 508
sony dvd
fulltext не пойдет.
а like по лексемам - выдаст кучу хлама.
 

tashkentchi

Новичок
А если искать так:

1. Приводим имена товаров к следующему нормализованному виду:

SonyDCR DVD 508E => sonydcrdvd508e => son ony nyd ydc dcr crd rdv dvd vd5 d50 508 08e

2. Приводим запрос к тому-же виду:

dcr 508 => dcr508 => dcr cr5 r50 508

3. Фултекстом ищем нормализованной запрос в нормализованных именах товаров.

-~{}~ 19.03.08 16:45:

Хотя, наверное, лучше не избавляться от пробелов и нормальзовать каждое слово отдельно:

1. SonyDCR DVD 508E => son ony nyd ydc dcr dvd 508 08e

2. sony dvd => son ony dvd

3. см. выше

Тогда в результатах поиска будет меньше мусора.
 

Beavis

Banned
Автор оригинала: Alexandre
про таблицу не очень понял...
что с ней делать?
PHP:
<?
$words = array('а', 'б', 'в', 'г', 'д');
$count = count($words);
for ($i=0; $i<pow(2, $count-1); $i++) {
	printf("%04b - ",$i);
	for ($j=0; $j<$count; $j++) {
		echo $words[$j];
		if ($i & pow(2, $j)) echo " ";
	}
	echo "<br />\r\n";
}
?>
 
Сверху