Перейти к содержанию
Официальный форум поддержки Simpla

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


Перейти к решению Решено mishanya,

Рекомендуемые сообщения

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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты
  • Ответов 53
  • Дата создания
  • Последний ответ

Лучшие авторы в теме

Лучшие авторы в теме

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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты
  • 10 месяцев спустя...

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

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты
  • Решение

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
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

Ссылка на сообщение
Поделиться на другие сайты
  • 2 месяца спустя...
  • 2 месяца спустя...

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

Изменено пользователем service79
Ссылка на сообщение
Поделиться на другие сайты
  • 10 месяцев спустя...

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

Изменено пользователем SeregaSobol
Ссылка на сообщение
Поделиться на другие сайты

В данный момент изменился адрес запроса на

$urlXml = "https://ws3.morpher.ru/russian/declension?s=".urlencode($text);

и добавились новые виды склонения.

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

 

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

Изменено пользователем bananovsv
Ссылка на сообщение
Поделиться на другие сайты

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

 

Измените запрос добавив в него BINARY 

 

 

 $query = $this->db->placehold("SELECT ... FROM __declination d WHERE  d.phrase=BINARY ? LIMIT 1", $text);

 

 

Изменено пользователем chocolate_moles
Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

Теперь в функции надо поменять адрес

с:

$urlXml = "https://ws3.morpher.ru/russian/declension?s=".urlencode($text);

на

$urlXml = "http://ws3.morpher.ru/russian/declension?s=".urlencode($text);

зачем? по https работает же?!

Ссылка на сообщение
Поделиться на другие сайты

зачем? по https работает же?!

Сори, у меня не работало какое-то время, я переделал. Но теперь опять все нормально, исправил пост

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

У всех перестало работать?

все работает нормально.. вот для проверки:

https://ws3.morpher.ru/russian/declension?s=%D1%82%D0%BE%D0%B2%D0%B0%D1%80

Изменено пользователем service79
Ссылка на сообщение
Поделиться на другие сайты

все работает нормально.. вот для проверки:

https://ws3.morpher.ru/russian/declension?s=%D1%82%D0%BE%D0%B2%D0%B0%D1%80

 

У меня ошибка по ссылке:

Screen%20Shot%202017-11-18%20at%2010.08.

 

Насколько я понял, у него просрочен сертификат.

Изменено пользователем bananovsv
Ссылка на сообщение
Поделиться на другие сайты

У меня ошибка по ссылке:

Screen%20Shot%202017-11-18%20at%2010.08.

Это не ошибка, а вопрос принятия сертификата безопасности.

По факту вот так: http://prntscr.com/hbzm1o

Изменено пользователем service79
Ссылка на сообщение
Поделиться на другие сайты

Это не ошибка, а вопрос принятия сертификата безопасности.

По факту вот так: http://prntscr.com/hbzm1o

 

В браузере-то я могу его принять. А сервер мой — нет. Что с этим делать?

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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

Загрузка...
×
×
  • Создать...