Помогите составить запрос SQL

D
На сайте с 28.06.2008
Offline
1114
513

В пределах одной таблицы есть поля name и name-morfer

В поле name указано название организации, например

"Детская библиотека №25"

мне нужно запросом продублировать имя организации в поле name-morfer изменив его падеж и регистр.

в поле name - "Детская библиотека №25"

в поле name-morfer - "детской библиотеке №25"

как это сделать?

Skom
На сайте с 02.12.2006
Offline
165
#1

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

Для других целей, имхо, только по словарям.

Cras amet qui numquam amavit quique amavit cras amet
АБ
На сайте с 22.11.2018
Offline
26
#2

UPDATE table_name SET name-morfer = REPLACE(name, 'что', 'на что') WHERE ...

Но вообще, Skom, прав.

T7
На сайте с 19.09.2018
Offline
63
#3
Dram:
в поле name - "Детская библиотека №25"
в поле name-morfer - "детской библиотеке №25"

Похожая задача была, касательно лемматизации, склонения слов и прочим

русским стеммингом

Выбирал м/у mystem и pymorphy2

Остановился на pymorphy2, несмотря на то,что 1 раз увидел Python. Гибче гораздо, данные можно отдавать в любом нужном варианте☝

Затраты:

  • 4 часа времени
  • 100500 запросов гугл*


#!/usr/bin/env python36
# -*- coding: utf-8 -*-
# Requires Python 3+
# Pymorphy2 support for jcms

import sys, pymorphy2, json, base64, locale, codecs

#locale, codecs for php exec ( fix UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-19: ordinal not in range(128))

def inflect(lsts, mth):
els = lsts.split()
ww = []
for tok in els:
if len( tok ) > 2:
ww.append( morph.parse(tok)[0].inflect({mth}).word )
return ww

locale.setlocale(locale.LC_ALL, "ru_RU.UTF-8")
if "detach" in dir(sys.stdout):
sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach())
sys.stdin = codecs.getwriter('utf-8')(sys.stdin.detach())

if __name__ == "__main__":

q = ''
m = ''

if len (sys.argv) > 2:
m = sys.argv[1]
q = sys.argv[2]
else:
print('Wrong parameters')
exit(1)

if m in [ "nomn", "gent", "datv", "accs",
"ablt", "loct", "voct", "gen2", "loc2" ]:
morph = pymorphy2.MorphAnalyzer()
infl = inflect(q, m)
print( infl )
else:
print('Wrong parameter to inflect')

exit(3)

(прошу знатоков python строго не судить за код, повторюсь, 1 блин, но идея понятна)

В итоге

$ python36 /home/web/py/morph/inflect gent "Детская библиотека"

['детской', 'библиотеки']

$ python36 /home/web/py/morph/inflect loct "Детская библиотека"

['детской', 'библиотеке']

* - когда надо было импортировать результат в php


$arg = [ '-nomn',
'Уфу,Магадану,Казани,Санкт Петербурге,Москвы,Самаре,Нижнем Новгороде,барнаулу,новый уренгой,пельсисков'
];
echo print_rh($arg, 'Исходные данные для inflect');
$lemm = 'python36 /home/web/py/morph/pymorph.py ' . base64_encode( json_encode( $arg ) );
$output = exec($lemm, $r, $rv);
echo print_rh( json_decode($output), 'lemma ' ), print_rh(\logger::logit( 'End pymorph', 'ok', __METHOD__ ), 'End');
/* Result
Исходные данные для inflect

Array
(
[0] => -nomn
[1] => Уфу,Магадану,Казани,Санкт Петербурге,Москвы,Самарой,Нижнем Новгороде,барнаулу,новый уренгой,пельсисков
)

lemma

stdClass Object
(
[pymorphy] => Array
(
[0] => уфа
[1] => магадан
[2] => казань
[3] => санкт петербург
[4] => москва
[5] => самара
[6] => нижний новгород
[7] => барнаул
[8] => новый уренгой
[9] => пельсиски
)

)

End
Array
(
[msg] => End pymorph
[status] => ok
[point] => Jcms\Intro\User::geomakenew
[ecode] => 0
[afterstart] => 65.81 ms
[afprevious] => 52.45 ms
[details] =>
[mem] => 0.48/2.00, mb
)

*/
M5
На сайте с 12.08.2009
Offline
221
M25
#4

я бы не городил ,а взял бы api (да ,платно, но недорого) вроде этого или этого и file_get_contents

► Рейтинг серверов — ТОП10 ◄
T7
На сайте с 19.09.2018
Offline
63
#5
M25:
я бы не городил ,а взял бы api (да ,платно, но недорого) вроде этого или этого и file_get_contents

Хозяин-барин:)

Но, гибкость и независимость и трудозатраты в 2 команды


pip install pymorphy2
pip install -U pymorphy2-dicts-ru
+ немного строк кода, намекают городить😂

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