Склонение географических объектов по падежам

GrimlockGuy

Новичок
Склонение географических объектов по падежам

Привет всем,

Мне нунжно автоматически просклонять 90000 географических имен по падежам. Перед тем, как написать программу (сомневаюсь, что такие есть) я хотел бы найти словарь, по которому я смогу просклонять все имена.

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

Я читал о словарях Зализняка, Лебедева, но не совсем уверен, что это то, что мне нужно.

Ищу словарь, который позволит создать падежи для 90000 географических имен, основываясь только на имени в именительном падеже, т.е. по аффиксу (как я понял это суффикс + окончание). Подскажите, где я могу найти подобный словарь и существует ли вообще такой в природе?

Зараннее спасибо.
 

GP

Новичок
как я понял проблема в склонении сочетания слов? (Среднее Поволжье и т.п.).

можно просто доработать какой нибудь скрипт тип этого
http://phpmorphy.h18.ru/demo.php
до поддержки 2 и больше слов

хотя думаю в таком случае ошибок со склонениями неизбежать ))
 

GrimlockGuy

Новичок
Спасибо.

А у этой программы есть зеркало, у меня не загружается эта страница. :(

Ошибки допустимы, если их не больше пары процентов. :)

-~{}~ 03.11.07 18:15:

Нашел зеркало.

-~{}~ 03.11.07 18:52:

Попробовал скрипт, возникло два вопроса.

Первый и главный вопрос. Этот скрипт может вывести заданное слово именно в падежах (в виде массива "родительный париж > Парижа" или еще как-то - не важно)?

Второй вопрос, у кого-нибудь получалось использовать этот сервер с кодировкой UTF-8? Попробовал изменить локали, сохранить скрипты в UTF-8 - не помогает.
 

GP

Новичок
Автор оригинала: GrimlockGuy Этот скрипт может вывести заданное слово именно в падежах
конечно, если доработать. Обратись к разработчикам или на фриланс сайт. Там тебе за небольшую плату обязательно помогут это сделать ;)

насчёт utf - а utf тебе зачем? смысла нет. вот будет у тебя скрипт делающий то что тебе надо- задумаешься и над этим вопросом ))
 

iceman

говнокодер
пиши алгоритм относительно правил русского языка :)
 

GrimlockGuy

Новичок
Автор оригинала: GP
конечно, если доработать. Обратись к разработчикам или на фриланс сайт. Там тебе за небольшую плату обязательно помогут это сделать ;)
Сайт не коммерческий, не могу себе позволить тратиться на фрилансеров. К тому же "небольшой" платой здесь дело вряд ли обойдется.

Подскажи, каким образом его можно доработать и стоит ли вообще новичку за это браться?

насчёт utf - а utf тебе зачем? смысла нет. вот будет у тебя скрипт делающий то что тебе надо- задумаешься и над этим вопросом ))
У меня сервер полностью на UTF-8 (php/html/xml/mysql - все работает через UTF-8). Думаю, что если буду запихивать падежи в mysql, например, могут возникнуть ошибки.

Автор оригинала: iceman
пиши алгоритм относительно правил русского языка :)
Можно конечно, но это очень сложно и долго. Придется перебирать 120000 сущностей, а это гигантский объем работы. Да и ошибок больше будет.
 

HraKK

Мудак
Команда форума
Что бы разбиратся не надо знать ООП. Достаточно знать классы и работу с ними.
ООП != классы.

Я в ООП коде разберался в 1 месяц обучения пхп. Вообще не зная что такое ООП.
 

GrimlockGuy

Новичок
Если мне PHP гуру скажут, что это возможно, будет под силу новичку и займет не много времени, то буду разбираться. :)

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

Мне скрипт кажется достаточно сложным, хотя основы ООП я знаю.
 

Страшный Злодей

Бывший член клуба (достало хамство).
GrimlockGuy
А как бы "в ручную" склоняли по падежам эти географические объекты? Есть алгоритм? В основу можно положить вот это http://slovari.yandex.ru/dict/krugosvet/article/krugosvet/5/1007632.htm
и это то же можно http://kozin1.narod.ru/newsite/padeg.htm
Хотя, конечно, именно, с географическими названиями, не все так просто..

Или вот готовая прога http://www.rtads.org/CaseGen.zip , для Win в 'exe' файле. Вам собственно, этот экзешник и не нужен для, т.к. для понимания не сложного алгоритма нужно будет лишь прочитать пару маленьких текстовых файлов и и дальше сами поймете, как писать собственный скрипт.

Ну, а если уж совсем лень заниматься написанием, то вот http://morpher.ru/Default.aspx онлайн "склоняльщик" вам нужно всего -то прогнать скриптом через него 90000 ваших географических мест (если, конечно автор не обидется на это изнасилование сайта)
 

GrimlockGuy

Новичок
Спасибо за ссылки.

Автор оригинала: Страшный Злодей
А как бы "в ручную" склоняли по падежам эти географические объекты? Есть алгоритм?
Алгоритм можно создать, но это огромная работа, плюс в результате будет большой процент ошибок.

К сожалению, там нет примеров для PHP или чего-то, в чем я чувствую себя уверенно. :(

Или вот готовая прога http://www.rtads.org/CaseGen.zip , для Win в 'exe' файле. Вам собственно, этот экзешник и не нужен для, т.к. для понимания не сложного алгоритма нужно будет лишь прочитать пару маленьких текстовых файлов и и дальше сами поймете, как писать собственный скрипт.
К сожалению автоматом программа допускает очень много ошибок. Ей нужно вручную выставлять число, род и т.д. для правильного перевода.

Ну, а если уж совсем лень заниматься написанием, то вот http://morpher.ru/Default.aspx онлайн "склоняльщик" вам нужно всего -то прогнать скриптом через него 90000 ваших географических мест (если, конечно автор не обидется на это изнасилование сайта)
Изнасилованием не хочу заниматься. Может есть что-нибудь подобное, но открытое, пусть "сырое" или с меньшим количеством правил?
 

cDLEON

Онанист РНРСlub
Вы готовое хотите?
Добро пожаловать в соответствующий форум, либо - в ГУГЛ.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Готовое, быстро и нашару бывает то, что у всех есть и никому не нужно. То, что многим нужно - почти всегда трудно.
Я бы написал владельцам morpher.ru и попросил воспользоваться их системой не нагружая ее (небольшая частота запросов, по ночам) и, возможно, за вознаграждение.
Если ты делаешь свой проект для развлечения - плати за свое развлечение.
Халява в другом месте (С) :)
 

GrimlockGuy

Новичок
Я напишу автору склоняльщика. Но как я могу посылать запрос и извлекать результат с помощью PHP? Может у кого-нибудь есть ссылка на туториал?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
А вот этому прийдется научиться самостоятельно.
Обсуждение техники автоматизации работы с сайтами из скрипта - "вне закона" на этом форуме.
 

Жигaн

Новичок
для phpMorphy:

PHP:
<?php
define('PHPMORPHY_DIR', dirname(__FILE__) . '/../phpmorphy/trunk/src');
require_once(PHPMORPHY_DIR . '/common.php');

class GeoGen {
	private static
		$case_map = array(
			'им' => 'Именительный',
			'рд' => 'Родительный',
			'вн' => 'Винительный',
			'дт' => 'Дательный',
			'тв' => 'Творительный',
			'пр' => 'Предложный',
		);
		
	private
		$morphy;
	
	function __construct() {
		$opts = array(
			'storage' => PHPMORPHY_STORAGE_MEM,
			'with_gramtab' => true,
			'predict_by_suffix' => true, 
			'predict_by_db' => true
		);
		
		$dir = PHPMORPHY_DIR . '/dicts';
		$this->morphy = new phpMorphy(
			new phpMorphy_FilesBundle($dir, 'rus'),
			$opts
		);
		
		setlocale(LC_CTYPE, 'windows-1251');
	}
	
	function generate($word) {
		$word = strtoupper($word);
		
		if(false === ($result = $this->morphy->getAllFormsWithGramInfo($word))) {
			return false;
		}
		
		return $this->postprocessResult($word, $result);
	}
	
	private function postprocessResult($base, $result) {
		$new_result = array();
		
		for($i = 0, $c = count($result); $i < $c; $i++) {
			if(count($one_result = $this->processOneItem($base, $result[$i]))) {
				$new_result[] = $one_result;
			}
		}
		
		return $new_result;
	}
	
	private function processOneItem($base, $result) {
		$new_result = array();
		
		for($i = 0, $c = count($result['forms']); $i < $c; $i++) {
			foreach($this->generateNewKey($base, $result['all'][$i]) as $key) {
				if(isset($new_result[$key])) {
					$old = $new_result[$key];
					$new_result[$key] = array($old, $result['forms'][$i]);
				} else {
					$new_result[$key] = $result['forms'][$i];
				}
			}
		}
		
		return $new_result;
	}
	
	private function generateNewKey($base, $graminfoString) {
		$result = array();
		
		foreach(explode(';', $graminfoString) as $item) {
			if(substr($item, 0, 1) == 'С') {
				$result[] = $this->extractCase($item) . ' ' . $base;
			}
		}
		
		return $result;
	}
	
	private function extractCase($graminfoString) {
		$result = 'unknown';
		
		foreach(explode(',', substr($graminfoString, 2)) as $grammem) {
			if(isset(self::$case_map[$grammem])) {
				$result = self::$case_map[$grammem];
				break;
			}
		}
		
		return $result;
	}
};

$gen = new GeoGen();

$word = 'МОСКВА';
$result = $gen->generate($word);

var_dump($result);
результат:
PHP:
array(1) {
  [0]=>
  array(6) {
    ["Именительный МОСКВА"]=>
    string(6) "МОСКВА"
    ["Родительный МОСКВА"]=>
    string(6) "МОСКВЫ"
    ["Дательный МОСКВА"]=>
    string(6) "МОСКВЕ"
    ["Предложный МОСКВА"]=>
    string(6) "МОСКВЕ"
    ["Винительный МОСКВА"]=>
    string(6) "МОСКВУ"
    ["Творительный МОСКВА"]=>
    array(2) {
      [0]=>
      string(7) "МОСКВОЙ"
      [1]=>
      string(7) "МОСКВОЮ"
    }
  }
}
 
Сверху