синонимайзер скрипт

K
На сайте с 12.05.2015
Offline
35
2295

всем удачи в работе

Обращаюсь к вам вот с какой прозьбой

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


$result="тут текст который надо обработать";

mb_internal_encoding("UTF-8");
function synonimize($str, $repl_array){
$keys = array_map(function($key){
return '#'.$key.'#ui';
}, $repl_array);

foreach ($keys as $i=>$key) {
$str = preg_replace_callback( "/\b(" . $key . ")\b/iu", function ($match) use ($repl_array, $i) {
$syns = explode('|', $repl_array[$i]);
array_splice($syns, array_search(mb_strtolower($match[0]), array_map('mb_strtolower', $syns)), 1);
return $syns[rand(0, count($syns) - 1)];
}, $str);
}

return $str;
}

$gb = file("../sun.txt");

$result = synonimize($result,$gb);

база вида

слово|синоним1|синоним2

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

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




<?php
/**
* Синоминайзер, перемешиватель абзацев и предложений
*
*/
class synonymizer{

/**
* Символ разделения параграфов
*
* @var string
*/
private $paragraph_symbol;

/**
* Использовать в качестве синонима оригинал слова
*
* @var boolean
*/
private $synonym_original;
/**
* Путь к файлу базы
*
* @var string
*/
private $synonym_base_path;
/**
* оставлять рисунки
*
* @var boolean
*/
private $image_save;

/**
* конструктор класса
*
*/
public function __construct($parSymb="</p>", $synOriginal=false, $basePath="synbase.dat", $saveImage=true){
$this->paragraph_symbol=$parSymb;
$this->synonym_original=$synOriginal;
$this->synonym_base_path=$basePath;
$this->image_save=$saveImage;
}

/**
* Основная функция класса
*
* @param string $text - входной текст для изменения
* @param boolean $use_synonymizer - использовать синоминайзер?
* @param boolean $mashup_paragraph - перемешивать параграфы?
* @param boolean $mashup_sentence - перемешивать предложения в параграфах?
* @return string - измененный текст
*/
public function change_text($text, $use_synonymizer=true, $mashup_paragraph=true, $mashup_sentence=true){

if ($use_synonymizer){
$text=$this->synonymizer($text);
}

if ($mashup_paragraph||$mashup_sentence){
$paragraphs = preg_split("/".str_replace("/", "\/", $this->paragraph_symbol)."+?/", $text, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
if ($mashup_paragraph){
srand((float) microtime() * 10000000);
shuffle($paragraphs);
}
if ($mashup_sentence){
foreach ($paragraphs as $key => $paragraph) {

if ($this->image_save) preg_match_all("/<img***91;^>***93;+>/",$paragraph,$images);
$paragraph = strip_tags($paragraph);
if ($this->paragraph_symbol == "</p>")
$paragraphs***91;$key***93; = "<p>";
else
$paragraphs***91;$key***93; = "";
if (!empty($images***91;0***93;)) $paragraphs***91;$key***93; .= $this->mashup_sentence($paragraph)."<br/>".implode("<br/>", $images***91;0***93;)."<br/>";
else $paragraphs***91;$key***93; .= $this->mashup_sentence($paragraph);
}
}
$text=join($paragraph_symbol, $paragraphs) . $paragraph_symbol;
}

return $text;
}
/**
* функция для перемешивания предложений в параграфах
*
* @param string $text - входной текст для изменения
* @return string - измененный текст
*/
private function mashup_sentence($text) {
$sentences = preg_split("/(***91;\.\!\?***93;)\s/", trim($text), -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
/* $sentences5 = preg_split("/(<img+?>)\s/", trim($text), -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);*/
// print_r($sentences);
$sentences2 = array();
$num = 0;
foreach($sentences as $key => $sentence) {
if ($sentence == "." || $sentence == "!" || $sentence == "?") {
$sentences2***91;$num - 1***93; .= $sentence;
continue;
}
$sentences2***91;$num***93; .= trim($sentence);
$num++;
}

srand((float) microtime() * 10000000);
shuffle($sentences2);
return join(" ", $sentences2);
}


/**
* Функция для замены слов синонимами
*
* @param string $text - входной текст для изменения
* @return string - измененный текст
*/
private function synonymizer($text){
$handle = fopen("./".$this->synonym_base_path, "r");
$contents = ''; $i=0;
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
$marr=explode("=",$buffer);
$original=$marr***91;0***93;;
$synarr=explode(",",$marr***91;1***93;);
if($this->synonym_original)$synarr***91;***93;=$original;
$syn=$synarr***91;rand()%count($synarr)***93;;
$text=str_replace(" ".$original." "," ".$syn." ",$text);
$text=str_replace(" ".$original.","," ".$syn.",",$text);
$text=str_replace(" ".$original."."," ".$syn.".",$text);
// $text=preg_replace("/(***91;\.\!\?\s***93;)".$original."(***91;\.\!\?\s***93;)/","$1".$syn."$2",$text);
$i++;
}
fclose($handle);
return $text;
}

}

?>


K
На сайте с 12.05.2015
Offline
35
#1

чо никто не подскажет как подкорректировать код

K
На сайте с 12.05.2015
Offline
35
#2

такое ощущение что тема запретная одна вода что никто не сможет подсказать как правильно сделать

G
На сайте с 22.09.2007
Offline
161
#3
ksap:
такое ощущение что тема запретная одна вода что никто не сможет подсказать как правильно сделать

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

PN
На сайте с 22.08.2012
Offline
103
#4

ksap, изучите мой рабочий синонимайзер, там нет таких проблем

https://github.com/safe-solutions/randomizer

Мой совет помог? Не скупись! Bitcoin 1Lseddet1o1B6odgXQHbGaWGwRkt1Db8Ef Ethereum 0x450f1a17461e25194B7F9226cDEe70173F39e1e1
K
На сайте с 12.05.2015
Offline
35
#5

громоздкий очень у вас скрипт

а вот с этим маленьким может подскажите где условие подставить чтоб только точные вхождения меняло

function synonimize($str, $repl_array){

$keys = array_map(function($key){
return '#'.$key.'#ui';
}, $repl_array);

foreach ($keys as $i=>$key) {
$str = preg_replace_callback($key, function ($match) use ($repl_array, $i) {
$syns = explode('|', $repl_array[$i]);
array_splice($syns, array_search(mb_strtolower($match[0]), array_map('mb_strtolower', $syns)), 1);
return $syns[rand(0, count($syns) - 1)];
}, $str);
}

return $str;
}

$gb = file("../as/sun1.txt");

$result = synonimize($result,$gb);

скажите кто платно сможет помочь

---------- Добавлено 21.07.2016 в 16:59 ----------

чото он криво вставляется в пшп тегах

вот так правильно

function synonimize($str, $repl_array){

$keys = array_map(function($key){

return '#'.$key.'#ui';

}, $repl_array);

foreach ($keys as $i=>$key) {

$str = preg_replace_callback($key, function ($match) use ($repl_array, $i) {

$syns = explode('|', $repl_array[$i]);

array_splice($syns, array_search(mb_strtolower($match[0]), array_map('mb_strtolower', $syns)), 1);

return $syns[rand(0, count($syns) - 1)];

}, $str);

}

return $str;

}

$gb = file("../as/sun1.txt");

$result = synonimize($result,$gb);

MK
На сайте с 18.08.2005
Offline
126
#6

В 3 строке попробуйте

return '#\b('.$key.')\b#ui';
нет
B
На сайте с 23.05.2001
Offline
195
#7

ksap

$result="тут текст который надо обработать";

В Ризалте, в первой же строчке - "текст, который надо обработать"?

Дальше код, в принципе, и читать неинтересно :)

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

Чтобы больше на переменных не экономили.

P.S. Ничего личного :)

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