Jump to content

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


Go to solution Solved by mishanya,

Recommended Posts

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

 

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

 

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

Link to post
Share on other sites
  • Replies 53
  • Created
  • Last Reply

Top Posters In This Topic

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

 

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

 

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

Link to post
Share on other sites
  • 10 months later...
  • Solution

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:'Р':'М'}

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

И - Именительный падеж
Р - Родительный падеж
Д - Дательный падеж
В - Винительный падеж
Т - Творительный падеж
П - Предложный падеж
 
Тип падежа:
О - единственный
М - множественный
Edited by mishanya
Link to post
Share on other sites

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

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

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

Link to post
Share on other sites

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

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

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

 

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

Link to post
Share on other sites
  • 2 months later...
  • 2 months later...

Подскажите, пожалуйста, а как использовать вариант пользовательского словаря? Есть слова, которые данный сервис не правильно склоняет, но при этом вычитал, что есть возможность использования 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>

Edited by service79
Link to post
Share on other sites
  • 10 months later...

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

Link to post
Share on other sites

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

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

Link to post
Share on other sites

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

 

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

 

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

 

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

 

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

Edited by bananovsv
Link to post
Share on other sites

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

 

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

 

 

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

 

 

Edited by chocolate_moles
Link to post
Share on other sites
  • 1 month later...
  • 1 month later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...