Как заменить слова на синонимы?

seosniks
На сайте с 13.08.2007
Offline
389
8755

Здравствуйте гуру PHP.

Прошу помощи у знающих людей.

Есть текст

Эта книга призвана ответить на два извечных вопроса: «Какими средствами достигается великолепная запись?» и «Как делается качественный микс?». И хотя большинство из присутствующих могут сказать, какое качество микса их устроило бы, чаще всего они не знают, как этого достичь, когда они уже находятся в студии.

есть файлик синонимов

ответить=расказать|сообщить|помочь

средствами=методами|способами
делается=создаеться|изобретается
хотя=может|возможно

как на PHP реализовать замену синонимами , но заменить так чтоб измененное слово менялось только один раз.Просто перепробовал несколько вариантов но что то не выходит

Буду очень благодарен за подсказки и советы.

пробовал разные варианты но что то не вышло ничего.


setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russian.1251', 'russian');

$words = array(
'Петя' => 'Вася',
'Вася' => 'Егор'
);

function replace($word)
{
global $words;

if ( isset($words[$word[0]]) ) return $words[$word[0]];
return $word[0];
}


$text = <<<EOFF
Мнолог двух пиплов.
- Надо идти на завод в сео денег нет, - сказал Петя, челу который решил стать дорвейшиком.
- На заводе холодно и мухи наглые, - возразил Вася,лучше уж доры,воразил Петя.
EOFF;

echo 'Исходный текст:', PHP_EOL, $text, PHP_EOL;

$text = preg_replace_callback('/\w+/', 'replace', $text);

echo PHP_EOL;
S
На сайте с 28.10.2005
Offline
319
#1

Перебирайте текст последовательно по одному слову и заменяйте на случайный синоним

[Удален]
#2


//Загружаем синонимы
$arr_=file('file_s_simoimami.txt');
$arr=array();
foreach($arr_ as $str)
{
$str=trim($str);
$t1=explode('=',$str);
$master=trim($t1[0]);
if(!isset($t1[1]))continue;
$t2=explode('|',$t1[1]);
if(sizeof($t2)==0)continue;
foreach($t2 as $t)$arr[crc32(strtolower($master))][crc32(strtolower(trim($t)))]=array('word'=>trim($t),'rep'=>0);
}
echo$text='<br />Эта книга призвана ответить на два извечных вопроса: <Какими средствами достигается великолепная запись?> и <Как делается качественный микс?>. И хотя большинство из присутствующих могут сказать, какое качество микса их устроило бы, чаще всего они не знают, как этого достичь, когда они уже находятся в студии.';
echo'<br />';
$text_arr=explode(' ',$text);
$str_='';
foreach($text_arr as $item)
{
$fl=false;
$t=str_replace('.','',str_replace(',','',str_replace('!','',str_replace('?','',str_replace('"','',str_replace('\'','',str_replace('<','',str_replace('>','',str_replace(':','',str_replace(';','',$item))))))))));
if(isset($arr[crc32(strtolower($t))]))
{
foreach($arr[crc32(strtolower($t))] as $k=>$v)if($v['rep']==0)
{
$str_.=str_ireplace($t,$v['word'],$item).' ';
$$v['rep']=1;
$fl=true;
break;
}//if
}//if
if(!$fl)$str_.=$item.' ';
}//foreach
echo $str_;

На вашем примере получаем:

Эта книга призвана ответить на два извечных вопроса: <Какими средствами достигается великолепная запись?> и <Как делается качественный микс?>. И хотя большинство из присутствующих могут сказать, какое качество микса их устроило бы, чаще всего они не знают, как этого достичь, когда они уже находятся в студии.

Эта книга призвана расказать на два извечных вопроса: <Какими методами достигается великолепная запись?> и <Как создаеться качественный микс?>. И может большинство из присутствующих могут сказать, какое качество микса их устроило бы, чаще всего они не знают, как этого достичь, когда они уже находятся в студии.
E
На сайте с 17.02.2008
Offline
191
#3

Что-то у вас огромный код получается. Это делается практически в одну строку.

Функция preg_replace имеет параметр, ограничивающий количество операций.

Например, вот как я реализовал генерацию ссылок по ключевым словам.

$content = preg_replace("/\b(".$row[text].")\b/i","<a href=\"".$row."\">\\1</a>",$content,$count);

Копайте в эту сторону.

Выбираю прокси здесь: https://goo.su/zUub4. Хотите купить и Вы?
[Удален]
#4
extruder:
Что-то у вас огромный код получается. Это делается практически в одну строку.

Признаю, не люблю я регексы ввиду незнания этой алхимии :(

seosniks
На сайте с 13.08.2007
Offline
389
#5
extruder:
Что-то у вас огромный код получается. Это делается практически в одну строку.
Функция preg_replace имеет параметр, ограничивающий количество операций.

Например, вот как я реализовал генерацию ссылок по ключевым словам.
$content = preg_replace("/\b(".$row[text].")\b/i","<a href=\"".$row."\">\\1</a>",$content,$count);


Копайте в эту сторону.

генерация ссылок очень проста я делал ее для сапы, а вот ключевые слова посложнее.

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

Есть варианты с вот пример самый простой способ который я делал для забивки базы данных ключевыми словами.


$file_array = file("counter.txt");
if(!$file_array){
echo("Ошибка открытия файла");}
else{
for($i=0; $i < count($file_array); $i++){

echo"\n";
echo "<a href='ваша ссылка'>".$file_array['$i']."</a>";
}
}}
а если у вас ссылки из сапы например для каждой страницы то тогда делается 2 файла.

самое главное хорошая база синонимов,а лучше словоформ :)

SJ
На сайте с 16.03.2008
Offline
78
#6
seosniks:
самое главное хорошая база синонимов,а лучше словоформ :)

морфология рулит :)

а вобще для своего расстановщика ссылок по тексту я просто проходил стеммером по массиву с ключевыми словами и по тексту. Потом искал совпадения и разворачивал обратно.

Любимый хостинг (http://beget.ru?id=2902) How can we grow old when the soundtrack of our lives is rock-n-roll?
seosniks
На сайте с 13.08.2007
Offline
389
#7
nikitian:

//Загружаем синонимы
$arr_=file('file_s_simoimami.txt');
$arr=array();
foreach($arr_ as $str)
{
$str=trim($str);
$t1=explode('=',$str);
$master=trim($t1[0]);
if(!isset($t1[1]))continue;
$t2=explode('|',$t1[1]);
if(sizeof($t2)==0)continue;
foreach($t2 as $t)$arr[crc32(strtolower($master))][crc32(strtolower(trim($t)))]=array('word'=>trim($t),'rep'=>0);
}
echo$text='<br />Эта книга призвана ответить на два извечных вопроса: <Какими средствами достигается великолепная запись?> и <Как делается качественный микс?>. И хотя большинство из присутствующих могут сказать, какое качество микса их устроило бы, чаще всего они не знают, как этого достичь, когда они уже находятся в студии.';
echo'<br />';
$text_arr=explode(' ',$text);
$str_='';
foreach($text_arr as $item)
{
$fl=false;
$t=str_replace('.','',str_replace(',','',str_replace('!','',str_replace('?','',str_replace('"','',str_replace('\'','',str_replace('<','',str_replace('>','',str_replace(':','',str_replace(';','',$item))))))))));
if(isset($arr[crc32(strtolower($t))]))
{
foreach($arr[crc32(strtolower($t))] as $k=>$v)if($v['rep']==0)
{
$str_.=str_ireplace($t,$v['word'],$item).' ';
$$v['rep']=1;
$fl=true;
break;
}//if
}//if
if(!$fl)$str_.=$item.' ';
}//foreach
echo $str_;



На вашем примере получаем:

Спасибо за вариант. Но тут к сожеленью он не сработает если база будет мегабайты.

вот еще пример

<?php

$trans = array("hello" => "hi", "hi" => "hello");
echo strtr("hi all, I said hello", $trans);
?>

hello all, I said hi

Возможно лучше будет что то типа

Это не рабочий вариант Я его нашел в сети. Но суть в том что лусше использовать базу sql

Потому как текстовый файл открыть будет проблематично если его вес метров 50.

// исходные пустые массивы

$words = array();
$synonyms = array();

// строим запрос
$sql = "SELECT * FROM `news_synonyms` WHERE `active`='1'";
// делаем запрос к БД
$spisok = main_sql_query("$sql");
while($row_id = mysql_fetch_assoc($slova)){ // перебор слов
// загоняем слово
array_push($words, " " . $row_id['source_word'] . " ");
// заоняем синоним
array_push($synonyms, " " . $row_id['destination_word'] . " ");

seosniks добавил 06.03.2009 в 18:11

Добрый вечер. Снова обращаюсь к знающим хорошо PHP

Значиться перегнал я все синонимы в базу данных.

База получилась 6 мб.

в базе 103731 синонимов

по этому чтоб получить базу нужно как то сделать запрос чтобы скрипт не перебирал всю подряд базу. А искал только то что начинаеться по конкретному слову.

например

если синонимайзер нашел слово

ЯСНОЕ то подставил синоним ВРАЗУМИТЕЛЬНОЕ

Но вот как сделать счтоб мускул мог нормально работать и не выдавал ошибку с нехваткой

памяти.

Я так понимаю что надо искать не по ID а по имени ключевого искомого слова

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

$row["source_word"] нужное слово

меняем его на $row["destination_word"]

в итоге получим то что надо.

Вот только незнаю как искать по тексту.

Подскажите пожалуйста как найти и получить само слово.

сам принцип работы крипта наверное таким должен быть.

1 разбить текст на массив и проверять каждое совпадение, найдя совпадение заменить его на синоним. или может кто может недорого помочь.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий