Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Найти самую длинную повторяющуюся фразу в нескольких текстах. Ищу функцию или алгоритм

Найти самую длинную повторяющуюся фразу в нескольких текстах. Ищу функцию или алгоритм
Я
   МимохожийОднако
 
07.11.19 - 08:19
Есть ли готовая функция, чтобы прикрутить её в 1С или что-то близкое?
Например, есть 3 текстовых фрагмента.
 
 
   Cyberhawk
 
1 - 07.11.19 - 08:57
http://algolist.manual.ru/ тут поищи
   ads55
 
2 - 08.11.19 - 10:44
(0) вот так можно, как то делал:
&НаКлиенте
Функция РазложитьТекстВМассив(мТекст)
    Результат = Новый СписокЗначений;
    
    ДлинаТекста = СтрДлина(СокрЛП(мТекст));
    ПозицияКонец = 0;
    
    перемТекст = мТекст;
    
    Пока ПозицияКонец <= ДлинаТекста Цикл
        
        ПозицияКонец = НайтиБлижайшуюПозициюСимвола(перемТекст, ПолучитьСимволыКонцаПредложения());
        
        Если ПозицияКонец = 0 Тогда
            Прервать;
        КонецЕсли;
        
        Подстрока = Сред(перемТекст, 0, ПозицияКонец);
        
        перемТекст = СокрЛП(Сред(перемТекст, ПозицияКонец + 1));
        
        Результат.Добавить(СтрДлина(Подстрока), Подстрока);
        
    КонецЦикла;
    
    Результат.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
    
    Возврат Результат;

КонецФункции

&НаКлиенте
Функция НайтиБлижайшуюПозициюСимвола(сТекст, сСимвол)
    спПозиций = Новый СписокЗначений;
    
    Для каждого мСмв Из сСимвол Цикл
        ЧислоПозиции = СтрНайти(сТекст, мСмв);
        Если ЧислоПозиции > 0 Тогда
            спПозиций.Добавить(ЧислоПозиции);
        КонецЕсли;
    КонецЦикла;
    
    спПозиций.СортироватьПоЗначению(НаправлениеСортировки.Возр);
    
    Если спПозиций.Количество() > 0 Тогда
         Возврат (спПозиций[0].Значение);
    КонецЕсли;    
        
    Возврат 0;
    
КонецФункции

&НаКлиенте
Функция ПолучитьСимволыКонцаПредложения()
    мСимволы = Новый Массив;
    мСимволы.Добавить(". ");
    мСимволы.Добавить("! ");
    мСимволы.Добавить("? ");
    мСимволы.Добавить("... ");
    Возврат мСимволы;
КонецФункции

&НаКлиенте
Процедура кмСравнить(Команда)
    мТекст1 = "";
    мТекст2 = мТекст1;

    мРезультат1 = РазложитьТекстВМассив(мТекст1);
    мРезультат2 = РазложитьТекстВМассив(мТекст2);
    
    Если мРезультат1.Количество() = 0
        Или мРезультат2.Количество() = 0 Тогда
        Сообщить("Ничего не найдено.");
        Возврат;
    КонецЕсли;
    
    Если мРезультат2.НайтиПоЗначению(мРезультат1[0].Значение) <> Неопределено Тогда
        мРезультат = (мРезультат2.НайтиПоЗначению(мРезультат1[0].Значение).Представление);
    КонецЕсли;
    
КонецПроцедуры
   Ёпрст
 
3 - 08.11.19 - 10:54
(0)
https://habr.com/ru/post/199190/

алгоритмы есть, но все они "тяжелые"
   Ёпрст
 
4 - 08.11.19 - 10:56
(1) хороший сайт.. суфиксные деревья..ээх.
   Cyberhawk
 
5 - 08.11.19 - 13:24
(4) Да, мне этот сайт как-то тоже помог натолкнуть на мысли в правильное русло) В закладках надежно схоронил.
   bootini
 
6 - 08.11.19 - 13:31
МодельПрогнозаПоискПоследовательностей (PredictionModelSequentialPatterns)
:)
   Cyberhawk
 
7 - 08.11.19 - 13:58
(6) Хренасебе что есть в 1С, никогда не курил это
https://its.1c.ru/db/v8316doc#bookmark:dev:TI000000690
   Ёпрст
 
8 - 08.11.19 - 14:02
(7) ага,
Использование в версии:
Доступен, начиная с версии 8.0.

какой только хрени не понапихано  в платформу и никто не пользуется
   Новиков
 
9 - 08.11.19 - 14:12
(0)
1. Теория с некоторой реализацией: https://www.geeksforgeeks.org/suffix-tree-application-3-longest-repeated-substring/
2. Разные реализации и дальнейшие ссылки для изучения: https://stackoverflow.com/questions/10355103/finding-the-longest-repeated-substring
   Михаил Козлов
 
10 - 08.11.19 - 15:05
(8) Пробовали в 2007 г. Ничего достойного внимания не выявили.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.