Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Задача по перестановке слов в строке  [new]
Bujhm_C
Member

Откуда:
Сообщений: 82
Есть массив записей в виде таблицы, где строка представлена не в порядочной схеме. (существительное не всегда в начале слова), например:

Наименование ТМЦ
Автоматический выключатель АП 50Б-3МТ
Выключатель АП 50Б
Выключатель автоматический серии АП-50Б
Автомат АП-50Б-3МТ 50
Кислота серная
Серная кислота
Пускатель магнитный ПМЕ221 220В
Магнитный пускатель ПМЕ221
ПМЕ221- пускатель
Клапан А20821-010-15 сильфонный
Сильфонный клапан А20821-010-15


Задача. Необходимо разбить строки и переместить имя существительное на первое место
(Первое слово с большой, второе слово /прилагательной/ с маленькой буквы)

Наименование ТМЦ
Выключатель автоматический АП 50Б-3МТ
Выключатель АП 50Б
Выключатель автоматический серии АП-50Б
Автомат АП-50Б-3МТ 50
Кислота серная
Кислота серная
Пускатель магнитный ПМЕ221 220В
Пускатель магнитный ПМЕ221
Пускатель- ПМЕ221
Клапан А20821-010-15 сильфонный
Клапан сильфонный А20821-010-15


Заранее спасибо за помощь.
1 сен 18, 08:44    [21661018]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
Bujhm_C
Member

Откуда:
Сообщений: 82
Да, еще, это не фиксированные данные необходимо написать код для любого массива записей!
1 сен 18, 08:48    [21661019]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
aleks222
Member

Откуда:
Сообщений: 985
Ну... большая и маленькая буквы - это не проблема.

А вот синтаксический разбор строки - это искусственный интеллект надо запилить.

Для имитации искусственного интеллекта можно

1. Разбить все строки на слова.
2. Составить словарь уникальных слов.
Это должно делаться автоматом при вводе новых строк.

3. Врукопашную пометить в этом словаре существительные. Периодически повторяя это, по мере пополнения словаря.

4. Ну а дальше уже легче.
5. Каждую строку разбиваете на слова.
6. Ищете по словарю существительное.
7. Собираете строку из слов обратно, с существительным на первом месте.
1 сен 18, 09:20    [21661029]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3251
В 2017 добавили Machine Learning, как раз можете поиграться. Заодно и нам расскажете.
1 сен 18, 11:05    [21661086]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
Bujhm_C
Member

Откуда:
Сообщений: 82
Не думал, что это так сложно...
Разбить на слова решаемая задача. А вычислить прилагательное ( по окончаниям), что действительно неподъемная задача? Может кто то копал в этом направлении? Неужели никак?
1 сен 18, 12:28    [21661132]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
msLex
Member

Откуда:
Сообщений: 8091
Bujhm_C
Не думал, что это так сложно...
Разбить на слова решаемая задача. А вычислить прилагательное ( по окончаниям), что действительно неподъемная задача? Может кто то копал в этом направлении? Неужели никак?

"Мороженное" это прилогательное или существительное?
1 сен 18, 13:19    [21661149]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
Massa52
Member

Откуда:
Сообщений: 379
msLex,
Если "Мороженное" приложить к мясу - то прилагательное. Если в стаканчике или на палочке - существительное :)
1 сен 18, 16:22    [21661238]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
Bujhm_C
Member

Откуда:
Сообщений: 82
Massa52
msLex,
Если "Мороженное" приложить к мясу - то прилагательное. Если в стаканчике или на палочке - существительное :)



ТЕМА ПРИОБРЕТАЕТ ЮМОРИСТИЧЕСКИЙ ОТТЕНОК!

А если серьезно, можно из строки вытащить прилагательное ?
1 сен 18, 17:32    [21661284]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36980
Bujhm_C
А если серьезно, можно из строки вытащить прилагательное ?
Несомненно, инженеры американской компании Microsoft добавили в свой продукт скрытую функцию, которая вытаскивает из строки исключительно русские прилагательные. Просто ее еще никто не смог найти.

З.Ы. Не несите чушь, пожалуйста. Лингвистический анализ не имеет отношения к тематике данного форума.

Сообщение было отредактировано: 1 сен 18, 17:38
1 сен 18, 17:35    [21661286]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 27753
Bujhm_C
А вычислить прилагательное ( по окончаниям), что действительно неподъемная задача?

Думаю вполне подъёмная. Оцените ведь, какие там у вас возможны окончания и сделайте простой вариант.
1 сен 18, 18:02    [21661295]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
Bujhm_C
Member

Откуда:
Сообщений: 82
[url=]lingvonet.html[/url]
Немного близко к теме...
1 сен 18, 18:04    [21661298]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
Bujhm_C
Member

Откуда:
Сообщений: 82
http://yeaahcode.blogspot.com/2015/01/lingvonet.html
ссылка
1 сен 18, 18:05    [21661300]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
Bujhm_C
Member

Откуда:
Сообщений: 82
function chastrechiRUS($string)
{
    /*
      Группы окончаний:
      1. прилагательное
      2. причастие
      3. глагол
      4. существительное
    */

    $groups 
        = array(
            1 => array('ее', 'ие', 'ые', 'ое', 'ими', 'ыми', 'ей', 
                  'ий', 'ый', 'ой', 'ем', 'им','ым','ом','его',
                  'ого','ему','ому','их','ых','ую','юю','ая',
                  'яя','ою','ею'),
            2 => array('ивш','ывш','ующ','ем','нн','вш','ющ',
                       'щ','ущи','ющи', 'ящий','щих','щие'),
            3 => array('ила','ыла','ена','ейте','уйте','ите',
                       'или','ыли','ей', 'уй','ил','ыл',
                       'им','ым','ен','ило','ыло','ено',
                       'ят','ует','уют','ит','ыт','ены','ить',
                       'ыть','ишь','ую','ю','ла','на','ете',
                       'йте','ли','й','л','ем','н','ло','но',
                       'ет','ют','ны','ть','ешь','нно'),
            4 => array ('а','ев','ов','ие','ье','е','иями',
                        'ями','ами','еи','ии','и','ией',
                        'ей','ой','ий','й','иям','ям','ием',
                        'ем','ам','ом','о','у','ах','иях',
                        'ях','ы','ь','ию','ью','ю','ия',
                        'ья','я','ок', 'мва', 'яна', 'ровать'),
        );

    $res=array();

    $words = explode(' ', $string);
    //print_r($words);
    foreach ($words as $wk=>$w) {
        foreach ($groups as $gk=>$g) {
            foreach ($g as $part) {
                if (substr($w, -strlen($part)) == $part 
                    && $res[$wk][$gk] < strlen($part) // любая часть речи, окончания
                    || stripos($w, $part)!==false 
                    && $gk == 2 //причастие, в любом месте слова
                ) {
                    $res[$wk][$gk] = strlen($part);
                }

            }
        }
        if (!isset($res[$wk][$gk])) {
            $res[$wk][$gk] = 0;
        }
    }


    $result = array();
    foreach ($res as $r) {
        arsort($r);
        array_push($result, key($r));
    }
    return $result;
}


На SQL как перевести или на с# (пардон,что не по теме)
1 сен 18, 18:18    [21661306]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
Bujhm_C
function chastrechiRUS($string)
{
    /*
      Группы окончаний:
      1. прилагательное
      2. причастие
      3. глагол
      4. существительное
    */

    $groups 
        = array(
            1 => array('ее', 'ие', 'ые', 'ое', 'ими', 'ыми', 'ей', 
                  'ий', 'ый', 'ой', 'ем', 'им','ым','ом','его',
                  'ого','ему','ому','их','ых','ую','юю','ая',
                  'яя','ою','ею'),
            2 => array('ивш','ывш','ующ','ем','нн','вш','ющ',
                       'щ','ущи','ющи', 'ящий','щих','щие'),
            3 => array('ила','ыла','ена','ейте','уйте','ите',
                       'или','ыли','ей', 'уй','ил','ыл',
                       'им','ым','ен','ило','ыло','ено',
                       'ят','ует','уют','ит','ыт','ены','ить',
                       'ыть','ишь','ую','ю','ла','на','ете',
                       'йте','ли','й','л','ем','н','ло','но',
                       'ет','ют','ны','ть','ешь','нно'),
            4 => array ('а','ев','ов','ие','ье','е','иями',
                        'ями','ами','еи','ии','и','ией',
                        'ей','ой','ий','й','иям','ям','ием',
                        'ем','ам','ом','о','у','ах','иях',
                        'ях','ы','ь','ию','ью','ю','ия',
                        'ья','я','ок', 'мва', 'яна', 'ровать'),
        );

    $res=array();

    $words = explode(' ', $string);
    //print_r($words);
    foreach ($words as $wk=>$w) {
        foreach ($groups as $gk=>$g) {
            foreach ($g as $part) {
                if (substr($w, -strlen($part)) == $part 
                    && $res[$wk][$gk] < strlen($part) // любая часть речи, окончания
                    || stripos($w, $part)!==false 
                    && $gk == 2 //причастие, в любом месте слова
                ) {
                    $res[$wk][$gk] = strlen($part);
                }

            }
        }
        if (!isset($res[$wk][$gk])) {
            $res[$wk][$gk] = 0;
        }
    }


    $result = array();
    foreach ($res as $r) {
        arsort($r);
        array_push($result, key($r));
    }
    return $result;
}



На SQL как перевести или на с# (пардон,что не по теме)


Попробуйте яндекс переводчиком
1 сен 18, 18:29    [21661307]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
Bujhm_C
На SQL как перевести
+ Перевод
use tempdb;
go

create function dbo.fnPartOfSpeech
(
 @word varchar(100)
)
returns table
as
return (
 with WordEndings as
 (
  select
   t.mask, '%' + t.we as we
  from
   (
    values
     (1, 'ее'), (1, 'ие'), (1, 'ые'), (1, 'ое'), (1, 'ими'), (1, 'ыми'), (1, 'ей'),  
     (1, 'ий'), (1, 'ый'), (1, 'ой'), (1, 'ем'), (1, 'им'),(1, 'ым'),(1, 'ом'),(1, 'его'), 
     (1, 'ого'),(1, 'ему'),(1, 'ому'),(1, 'их'),(1, 'ых'),(1, 'ую'),(1, 'юю'),(1, 'ая'), 
     (1, 'яя'),(1, 'ою'),(1, 'ею'), 

     (2, 'ивш'),(2, 'ывш'),(2, 'ующ'),(2, 'ем'),(2, 'нн'),(2, 'вш'),(2, 'ющ'), 
     (2, 'щ'),(2, 'ущи'),(2, 'ющи'), (2, 'ящий'),(2, 'щих'),(2, 'щие'),

     (4, 'ила'), (4, 'ыла'), (4, 'ена'), (4, 'ейте'), (4, 'уйте'), (4, 'ите'), 
     (4, 'или'), (4, 'ыли'), (4, 'ей'),  (4, 'уй'), (4, 'ил'), (4, 'ыл'), 
     (4, 'им'), (4, 'ым'), (4, 'ен'), (4, 'ило'), (4, 'ыло'), (4, 'ено'), 
     (4, 'ят'), (4, 'ует'), (4, 'уют'), (4, 'ит'), (4, 'ыт'), (4, 'ены'), (4, 'ить'), 
     (4, 'ыть'), (4, 'ишь'), (4, 'ую'), (4, 'ю'), (4, 'ла'), (4, 'на'), (4, 'ете'), 
     (4, 'йте'), (4, 'ли'), (4, 'й'), (4, 'л'), (4, 'ем'), (4, 'н'), (4, 'ло'), (4, 'но'), 
     (4, 'ет'), (4, 'ют'), (4, 'ны'), (4, 'ть'), (4, 'ешь'), (4, 'нно'),

     (8, 'а'),(8, 'ев'),(8, 'ов'),(8, 'ие'),(8, 'ье'),(8, 'е'),(8, 'иями'), 
     (8, 'ями'),(8, 'ами'),(8, 'еи'),(8, 'ии'),(8, 'и'),(8, 'ией'), 
     (8, 'ей'),(8, 'ой'),(8, 'ий'),(8, 'й'),(8, 'иям'),(8, 'ям'),(8, 'ием'), 
     (8, 'ем'),(8, 'ам'),(8, 'ом'),(8, 'о'),(8, 'у'),(8, 'ах'),(8, 'иях'), 
     (8, 'ях'),(8, 'ы'),(8, 'ь'),(8, 'ию'),(8, 'ью'),(8, 'ю'),(8, 'ия'), 
     (8, 'ья'),(8, 'я'),(8, 'ок'), (8, 'мва'), (8, 'яна'), (8, 'ровать')
   ) t(mask, we)
 )
 select
  sum(a.mask) as mask
 from
  (select ltrim(rtrim(@word))) t(word) cross apply
  (
   select top (1) with ties mask from WordEndings where t.word like we order by row_number() over (partition by mask order by len(we) desc)
  ) a(mask) 
);
go

declare @t table (s varchar(100));
insert into @t
values
 ('Автоматический выключатель АП 50Б-3МТ'),
 ('Выключатель АП 50Б'),
 ('Выключатель автоматический серии АП-50Б');

select
 t.s, stuff(d.s, 1, 1, upper(left(d.s, 1)))
from
 @t t cross apply
 (
  select
   case when b.mask is not null then lower(a.value) else a.value end + ' '
  from
   string_split(t.s, ' ') a outer apply
   dbo.fnPartOfSpeech(a.value) b 
  order by
   case when b.mask = 8 and row_number() over (partition by case when b.mask = 8 then 1 else 0 end order by (select 1)) = 1 then 0 else 1 end,
   row_number() over (order by (select 1))
  for xml path(''), type
 ) c(x) cross apply
 (select c.x.value('.', 'varchar(100)')) d(s);
go

drop function dbo.fnPartOfSpeech;
go
1 сен 18, 20:09    [21661340]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
x1ca4064
Member

Откуда:
Сообщений: 1141
Bujhm_C
Задача. Необходимо разбить строки и переместить имя существительное на первое место
(Первое слово с большой, второе слово /прилагательной/ с маленькой буквы)


Эта задача больше похожа на подзадачу какой-то другой проблемы. Если это так, может, сообщите основную задачу?
1 сен 18, 20:46    [21661363]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
Bujhm_C
Member

Откуда:
Сообщений: 82
x1ca4064
Bujhm_C
Задача. Необходимо разбить строки и переместить имя существительное на первое место
(Первое слово с большой, второе слово /прилагательной/ с маленькой буквы)


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



Вы правы. Моя задача гораздо масштабнее. Если интересно, могу поделится. Есть набор записей, около 160 тыс. Это записи приобретенных ТМЦ в разное время. Иду от обратного- данные уже есть ,а порядка нет. Хочу создать отраслевой справочник оборудования и материалов предприятия. Структура следующая. Наименование, тип, модификация. Руками группировать не умно. Поэтому желание автоматизировать процесс.
1 сен 18, 22:58    [21661418]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7768
Bujhm_C,

имо напишите на шарпе разборщик строк и окончаний в одном флаконе.
2 сен 18, 00:15    [21661499]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
x1ca4064
Member

Откуда:
Сообщений: 1141
Bujhm_C,

Боюсь, полностью автоматизировать этот процесс не получится (в свое время приходилось решать более простую задачу - сопоставление по наименованию двух справочников, решение получилось полуавтоматическим). Можно попробовать:
- Взять готовый справочник существительных
- Посмотреть статистику слов: существительных, особенно в фиксированной тематике, должно быть не очень много. Возможно, по этой статистике можно построить свой справочник существительных.
- Попробовать алгоритмы кластеризации, например, k-means с расстоянием Левенштейна. Вопрос о количестве кластеров нужно решить отдельно.

Сама задача интересная, удачи.
2 сен 18, 17:15    [21661833]     Ответить | Цитировать Сообщить модератору
 Re: Задача по перестановке слов в строке  [new]
256k
Member

Откуда: с.Торчилово, Псковская обл.
Сообщений: 437
Massa52
msLex,
Если "Мороженное" приложить к мясу - то прилагательное. Если в стаканчике или на палочке - существительное :)


а учитывая, что такого слова нет - так вообще фантастика
3 сен 18, 16:51    [21662906]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить