Перейти к содержимому


Фото
* * * * * 2 голосов

Склонение по падежам

Склонение Падежи Simpla 2.3.x

Best Answer mishanya , 13.05.2016 - 09:26

UPD 3.0 с новым апи и записью падежей в базу

 
 
1. делаем запрос в базу
CREATE TABLE IF NOT EXISTS `s_declination` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `phrase` varchar(255) NOT NULL,
  `declination` varchar(1024) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8

2. Регистрируем плагин, для этого в файл api/Design.php (примерно строка 42) добавляем:

$this->smarty->registerPlugin('modifier', 'declination', array($this, 'declination_modifier'));
3. Дальше добавим в самый конец функцию для обработки нового апи и возвращения падежей (если у вас была старая ф-я версии 1 или 2, нужно ее удалить):
public function declination_modifier($text, $numForm = null, $numType = 'О') {

	// Смотрим есть ли в базе сколонение
	$query = $this->db->placehold("SELECT d.id, d.phrase, d.declination FROM __declination d WHERE d.phrase=? LIMIT 1", $text);
	$this->db->query($query);
	$d = $this->db->result();

	if($d) {
		$result = unserialize($d->declination);
	} else {
		$urlXml = "https://ws3.morpher.ru/russian/declension?s=".urlencode($text);
		$d = @simplexml_load_file($urlXml);
		$d = (array)$d;
	    if(!empty($d)){
	        $arrData = array();

	        $arrData['И']['О'] = (string) $text;
	        foreach ($d as $key=>$val) {
	        	if(!is_object($val))
	            	$arrData[$key]['О'] = (string) $val;
	            else {
	            	$multiple = (array)$val;
	            	foreach ($multiple as $key=>$m) {
	            		$arrData[$key]['М'] = (string) $m;
	            	}
	            }
	        }
	        $result = $arrData;

			$query = $this->db->placehold("INSERT INTO __declination SET ?%", array('phrase'=>$text, 'declination'=>serialize($result)));
			$this->db->query($query);
	    }
	}

    if($numForm) {
    	if( isset($result[$numForm][$numType]) ) {
    	     return $result[$numForm][$numType];
    	} else
    	     return $text;
   	} else {
    	return $result;
    }
}

 

Как использовать: для нужной переменной добавляем модификатор |declination:падеж:тип_падежа

например:

{$product->name|declination:'Д':'О'}
{'Главная'|declination:'Р':'М'}

Список падежей:

И - Именительный падеж
Р - Родительный падеж
Д - Дательный падеж
В - Винительный падеж
Т - Творительный падеж
П - Предложный падеж
 
Тип падежа:
О - единственный
М - множественный
Перейти к посту


  • Чтобы отвечать, сперва войдите на форум
50 ответов в теме

#21 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 27.06.2015 - 22:13

UPD 2.0 С записью падежей в базу

 

1. Делаем запрос к базе:

CREATE TABLE IF NOT EXISTS `s_declination` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `phrase` varchar(255) NOT NULL,
  `declination` varchar(1024) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8

2. Регистрируем плагин, для этого в файл api/Design.php (примерно строка 42) добавляем:

$this->smarty->registerPlugin('modifier', 'declination', array($this, 'declination_modifier'));

3. Дальше добавим в самый конец функцию для обработки яндекс апи и возвращения падежей:

	public function declination_modifier($text, $numForm = null) {

		// Смотрим есть ли в базе сколонение
		$query = $this->db->placehold("SELECT d.id, d.phrase, d.declination FROM __declination d WHERE d.phrase=? LIMIT 1", $text);
		$this->db->query($query);
		$d = $this->db->result();

		if($d) {
			$result = unserialize($d->declination);
		} else {
			$urlXml = "http://export.yandex.ru/inflect.xml?name=".urlencode($text);
			$d = @simplexml_load_file($urlXml);
		    if($d){
		        $arrData = array();
		        foreach ($d->inflection as $one) {
		           $arrData[] = (string) $one;
		        }
		        $result = $arrData;

				$query = $this->db->placehold("INSERT INTO __declination SET ?%", array('phrase'=>$text, 'declination'=>serialize($result)));
				$this->db->query($query);
		    }
		}

        if($numForm) {
        	if( isset($result[$numForm]) ) {
        	     return $result[$numForm];
        	} else
        	     return $text;
       	} else {
        	return $result;
        }
	}

В лучае если фраза уже есть в базе, она выбирается из базы. если ее нет, делается запрос к АПИ, после чего записывается результат в базу.

 

Использовать так же как и первую версию!



#22 Maksclub

Maksclub

    Помогаю с Симплой

  • Фрилансер
  • 1 145 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 27.06.2015 - 22:47

UPD 2.0 С записью падежей в базу

 

1. Делаем запрос к базе:

 

2. Регистрируем плагин, для этого в файл api/Design.php (примерно строка 42) добавляем:

$this->smarty->registerPlugin('modifier', 'declination', array($this, 'declination_modifier'));

3. Дальше добавим в самый конец функцию для обработки яндекс апи и возвращения падежей:

	 
		

 

Это я полагаю для названия товаров? Или именно для склоняемого слова? И это запрсо лишний?


Изменено: Maksclub, 27.06.2015 - 22:48


#23 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 27.06.2015 - 22:50

Это я полагаю для названия товаров?

 

без разницы. в базу записывается фраза которую вы склоняете и результат склонения.

 

тоесть если у вас название категории Шапки или товар - Шапки, в базу запишеться фраза - Шапки и результат. и уже при втором обращении функция посмотрит что в базе уже есть Шапки и вернет вам результат из базы.



#24 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 27.06.2015 - 22:51

вы можете склонять любую переменную и она запишеться в базу. или простой текст 

{'Главная'|declination:5} 


#25 Maksclub

Maksclub

    Помогаю с Симплой

  • Фрилансер
  • 1 145 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 27.06.2015 - 23:01

без разницы. в базу записывается фраза которую вы склоняете и результат склонения.

 

тоесть если у вас название категории Шапки или товар - Шапки, в базу запишеться фраза - Шапки и результат. и уже при втором обращении функция посмотрит что в базе уже есть Шапки и вернет вам результат из базы.

Насколько это ресурсоемко если склонять по 2 свойства товара ...а товаров 5тыс? Можно ли это вызывать только в случае ошибки при связи с Яндексом?


Изменено: Maksclub, 27.06.2015 - 23:01


#26 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 27.06.2015 - 23:05

Насколько это ресурсоемко если склонять по 2 свойства товара ...а товаров 5тыс? Можно ли это вызывать только в случае ошибки при связи с Яндексом?

 

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

 

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



#27 Maksclub

Maksclub

    Помогаю с Симплой

  • Фрилансер
  • 1 145 сообщений
  • Дизайн, Программирование, Верстка, Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Москва

Опубликовано 27.06.2015 - 23:25

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

 

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

 

Спасибо большое за решение и его улучшение ! здоров, можно оживить title, для этого и буду использовать ;)



#28 jonny008

jonny008
  • Пользователь
  • 84 сообщений

Опубликовано 13.05.2016 - 08:36

Яндекс Склонятор погиб. 

 

Но появился http://api.morpher.r...?s=Екатеринбург



#29 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 13.05.2016 - 09:17

Яндекс Склонятор погиб. 

 

Но появился http://api.morpher.r...?s=Екатеринбург

 

спасибо, решение для этого апи обновлю



#30 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 13.05.2016 - 09:26   Best Answer

UPD 3.0 с новым апи и записью падежей в базу

 
 
1. делаем запрос в базу
CREATE TABLE IF NOT EXISTS `s_declination` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `phrase` varchar(255) NOT NULL,
  `declination` varchar(1024) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8

2. Регистрируем плагин, для этого в файл api/Design.php (примерно строка 42) добавляем:

$this->smarty->registerPlugin('modifier', 'declination', array($this, 'declination_modifier'));
3. Дальше добавим в самый конец функцию для обработки нового апи и возвращения падежей (если у вас была старая ф-я версии 1 или 2, нужно ее удалить):
public function declination_modifier($text, $numForm = null, $numType = 'О') {

	// Смотрим есть ли в базе сколонение
	$query = $this->db->placehold("SELECT d.id, d.phrase, d.declination FROM __declination d WHERE d.phrase=? LIMIT 1", $text);
	$this->db->query($query);
	$d = $this->db->result();

	if($d) {
		$result = unserialize($d->declination);
	} else {
		$urlXml = "https://ws3.morpher.ru/russian/declension?s=".urlencode($text);
		$d = @simplexml_load_file($urlXml);
		$d = (array)$d;
	    if(!empty($d)){
	        $arrData = array();

	        $arrData['И']['О'] = (string) $text;
	        foreach ($d as $key=>$val) {
	        	if(!is_object($val))
	            	$arrData[$key]['О'] = (string) $val;
	            else {
	            	$multiple = (array)$val;
	            	foreach ($multiple as $key=>$m) {
	            		$arrData[$key]['М'] = (string) $m;
	            	}
	            }
	        }
	        $result = $arrData;

			$query = $this->db->placehold("INSERT INTO __declination SET ?%", array('phrase'=>$text, 'declination'=>serialize($result)));
			$this->db->query($query);
	    }
	}

    if($numForm) {
    	if( isset($result[$numForm][$numType]) ) {
    	     return $result[$numForm][$numType];
    	} else
    	     return $text;
   	} else {
    	return $result;
    }
}

 

Как использовать: для нужной переменной добавляем модификатор |declination:падеж:тип_падежа

например:

{$product->name|declination:'Д':'О'}
{'Главная'|declination:'Р':'М'}

Список падежей:

И - Именительный падеж
Р - Родительный падеж
Д - Дательный падеж
В - Винительный падеж
Т - Творительный падеж
П - Предложный падеж
 
Тип падежа:
О - единственный
М - множественный

Изменено: mishanya, 16.08.2017 - 10:26


#31 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 13.05.2016 - 11:12

1.  Тип падежа - что это?  Может, имеется в виду ЧИСЛО, как обычно в русском языке?

2. {$product->name|declination:'Д':'О'}  - в этом примере тип падежа не соответствует описанию возможных типов .

3. Может, имелось в виду  "O - единственный" ?



#32 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 13.05.2016 - 11:33

1.  Тип падежа - что это?  Может, имеется в виду ЧИСЛО, как обычно в русском языке?

2. {$product->name|declination:'Д':'О'}  - в этом примере тип падежа не соответствует описанию возможных типов .

3. Может, имелось в виду  "O - единственный" ?

 

да, исправил тип падежа.



#33 daiv

daiv
  • Пользователь
  • 43 сообщений
  • Пользователь
  • Откуда:Москва

Опубликовано 22.07.2016 - 14:02

А из Множественного перевести в Единственное как?



#34 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 23.07.2016 - 11:20

А из Множественного перевести в Единственное как?

 

в сервисе не вижу такого апи к сожалению.



#35 service79

service79
  • Пользователь
  • 60 сообщений
  • Заказчик
  • Версия CMS:2.x

Опубликовано 28.09.2016 - 23:22

Подскажите, пожалуйста, а как использовать вариант пользовательского словаря? Есть слова, которые данный сервис не правильно склоняет, но при этом вычитал, что есть возможность использования XML-словаря, где можно прописать слова-исключения... Как его прописать? Вид файла такой:
 
<?xml version="1.0" encoding="utf-8"?>
<dictionary xmlns:xsi="http://www.w3.org/20...Schema-instance"
xsi:noNamespaceSchemaLocation="Russian.xsd">
<entry>
<singular>
<И>Гвардейский ордена Ленина Краснознаменный полк</И>
<Р>Гвардейского ордена Ленина Краснознаменного полка</Р>
<Д>Гвардейскому ордена Ленина Краснознаменному полку</Д>
<В>Гвардейский ордена Ленина Краснознаменный полк</В>
<Т>Гвардейским ордена Ленина Краснознаменным полком</Т>
<П>Гвардейском ордена Ленина Краснознаменном полке</П>
<М>в Гвардейском ордена Ленина Краснознаменном полку</М>
</singular>
</entry>
</dictionary>


Изменено: service79, 28.09.2016 - 23:23


#36 SeregaSobol

SeregaSobol
  • Пользователь
  • 16 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x

Опубликовано 15.08.2017 - 22:56

В данный момент изменился адрес запроса на
$urlXml
= "https://ws3.morpher....n/declension?s=".urlencode($text);
и добавились новые виды склонения.


Изменено: SeregaSobol, 15.08.2017 - 22:59


#37 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 16.08.2017 - 10:26

В данный момент изменился адрес запроса на
$urlXml = "https://ws3.morpher....n/declension?s=".urlencode($text);
и добавились новые виды склонения.

 

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



#38 bananovsv

bananovsv
  • Пользователь
  • 76 сообщений

Опубликовано 20.08.2017 - 04:11

А как сделать его чувствительным к регистру? Если он сохранил слово с прописной буквы, то он потом заменит слово со строчной на просклоненное с прописной, потому что в базе его таким найдет.



#39 mishanya

mishanya
  • Фрилансер
  • 2 409 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 20.08.2017 - 14:35

А как сделать его чувствительным к регистру? Если он сохранил слово с прописной буквы, то он потом заменит слово со строчной на просклоненное с прописной, потому что в базе его таким найдет.

а в чем разница?



#40 bananovsv

bananovsv
  • Пользователь
  • 76 сообщений

Опубликовано 21.08.2017 - 02:40

а в чем разница?

 

Ну вот есть слово «Арбуз» с прописной буквы. Он его просклоняет: Арбуз, Арбуза, Арбузу…

 

А потом у вас в тексте будет слово «арбуз» со строчной буквы. И он уже склонять не будет, а возьмёт из базы. А там это слово всегда с прописной.

 

Хотелось бы, чтобы при поиске в базе «Арбуз» ≠ «арбуз».

 

Или может кто знает более изящное решение этой проблемы.


Изменено: bananovsv, 21.08.2017 - 02:42






Также с меткой «Склонение, Падежи, Simpla 2.3.x»

0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых