PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » как автоматически удалить окончание в словах


как автоматически удалить окончание в словах

Сообщений 1 страница 13 из 13

1

Есть список слов, всего 11 тыс. Они получены методом поиска всех слов в справке, и я хочу составить индекс.
Для пример несколько слов из списка:

Код:
аккумулятор
аккумулятора
аккумуляторе
аккумуляторная
аккумуляторную
аккумуляторов
аккумулятору
аккумуляторы

Мне нужно либо получить одно слово "аккумулятор", либо тот же список с удалёнными окончаниями, при этом я обработаю список удалением дубликатов и получу слово в одном экземпляре.
Задача из 11 тыс. слов сделать список размером 1000 слов за счёт удаления однокоренных с окончаниями. Я хочу использовать это слово для поиска, то есть человек вводит в строке поиска "акк" и ему предлагается в раскрывающемся списке автозавершения слово "аккумулятор". Предлагаемых слов может быть больше, например для "то" выводится например "токовый", "токарь" и т.д. Просто я не хочу чтобы получить десяток однокоренных слов с разными окончаниями, по сути забивающие список мусором.
Возможно нужен какой-то словарь, который вычленить корни слов, то есть умеет у слова показать корень и я смогу получить корни слов, в общем любые идеи...

0

2

AZJIO
Обрезать не проблема. Я бы на PowerShell скрипт написал.
Алгоритм примерно такой (для отсортированного списка, когда одинаково начинающиеся более короткие выше более длинных):
- Берём первую строку в качестве базового слова, сохраняем её.
- Цикл по всем следующим строкам:
- Если строка длиннее базового слова и начало совпадает с базовым словом, пропускаем строку
- Иначе сохраняем строку и берём её в качестве базового слова.
Хотя, мне кажется, подобный "индекс" будет неправильным. Ведь аккумулятор и аккумуляторная (помещение для аккумуляторов) это всё-таки разные слова, а не просто словоформы одного слова.
Другие подобные примеры: компьютер и компьютеризация, снег и снегоход, стол и столяр.
В то же время, в словах аккумуляторная и аккумуляторную так просто не обрезать окончание.
Плюс 100500 нюансов русского языка в виде беглых гласных, чередований гласных...
Мне кажется, нужен словарь, по возможности наиболее полный, содержащий только базовые формы слов. Вот по нему и проверять.

Отредактировано Smitis (07.02.2024 15:46:37)

0

3

Smitis
У меня возникала мысль, если 2 и более слов подряд имеют одинаковость 70 и более процентов, то обрезать до этих 70℅. Не однокоренные слова будут иметь границу 50℅. Тот же стол и столяр 4+2, это будет 66+33℅. В любом случае можно под регулировать проценты.
Если я потеряю 10℅ слов в любом случае это лучше чем руками перебирать 11 тыс.

0

4

А ещё вам следует предусмотреть что пользователь может вводить слова с ошибками или опечатками.

0

5

AZJIO написал(а):

Тот же стол и столяр 4+2, это будет 66+33℅.

столов, столам (мн.ч.)
столик
столиц (от столицы)
столб
столен (не знаю, что это)
столищ
столки
столку
столок
столп
столпи
столпя
столь
Это я по словарю пробежался )) https://dikmax.name/post/russian-dictionary/
В общем, я бы копал в этом направлении - словарь со словоформами. К сожалению, по ссылке выше словоформы от основных слов отделены, какое к чему относится неизвестно.

0

6

В общем спасибо за подсказку destiny child здесь и всем кто пытался помочь. Онлайн Стемминг просто выдаёт готовый результат.

0

7

Webarion
Появится RadixTree(), он уже есть в бета.

0

8

AZJIO написал(а):

Появится RadixTree(), он уже есть в бета.

Строка 1: RadixTree() не является функцией, массивом, макросом или связным списком.

Это в IDE появился.

0

9

Жаль, я уже готовился использовать предполагая, что есть функция, которая превратит список в дерево.
Как то я высказался в теме про алгоритм поиска файлов, что проверка расширения по строке работает медленно и быстрее если расширения превратить в список, мне ответил, что он уже сделал что-то в виде RadixTree и это ещё быстрее моего предложения. И при разговоре о RadixTree я подумал, что будет теперь некая карта/список, в которую можно добавить элемент типа AddElementRadixTree() и элемент будет разложен на дерево. Вообще хотелось бы, чтобы был такой инструмент и он был простым и имел простые функции - создать, добавить элемент, проверить наличие элемента. Некоторые словари думаю быстрее бы работали имея такое дерево, так как не пришлось бы проверять весь список, а совершались бы прыжки по указателям. При длине слова 6 символов мы прыгаем максимум через 6 указателей и пробегаемся в среднем по 26/2=13 символов, то есть 6*13=78 шагов, не важно сколько база содержит слов, а если бы пришлось пробежаться по 100 тыс слов, очевидно что это будет работать медленно 100000*6/2 = 300000 шагов.
Ещё бы сохранять/открывать это дерево в бинарном виде, так как создание такого дерева методом вставки слов будет не быстрым.

Отредактировано AZJIO (09.02.2024 19:09:33)

0

10

Можно взять файл RadixTree.pb и использовать в своих проектах.

0

11

Пётр написал(а):

Можно взять файл RadixTree.pb и использовать в своих проектах.

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

0

12

Webarion написал(а):

Лучше всего конечно написать свой RadixTree, и забыть об этих лицензиях навсегда.

Если бы этот модуль был встроен в PureBasic, то всё было бы ясно, он бы имел ту же лицензию как и любой код созданный PureBasic`ом.

Webarion написал(а):

а вот с Fantaisie нужно разобраться.

вот как раз тут всё просто, если ты принял участие в разработке IDE, то это уже принадлежит Fantaisie, если не согласен то не пытайся помогать им. Они для того и сделали код открытым чтобы в его разработке участвовали знающие люди. Для себя и для общего блага. А лицензия защита от того что ты потом не подашь в суд, после предоставления какого-то кода для IDE, который был туда встроен.

Другое дело использование кода за пределами проекта, ведь могут найтись люди, который тупо скопируют все целиком и скажут что это их продукт, вот от этого и защита, что предоставленный код не окажется в чьих то руках как собственность. Ну и хотелось бы явно увидеть возможность использования частей кода в коммерческих проектах. Если это не описано понятным языком, то надо принимать это как недоступное. То есть я могу использовать при условии распространения своего кода открытым и ещё уведомить об этом пользователя или продать но обязательно уведомить что код открытый и то можешь взять его и скомпилировать. Также я могу предположить что если бы было разрешение брать код для коммерческой выгоды, то также любой может взять весь IDE и выдать за свой коммерческий проект, наверняка авторы этого бы не хотели. То есть адекватно разрешение такого не должно быть, можно только надеяться на чудо, которого я пока явно не нашёл в лицензии. Но не исключаю, что можно спросить авторов об этом и они всё скажут включая индивидуальное разрешение на какую либо часть с иными условиями. У меня прям нет сейчас в этом необходимости, но если вдруг возникнет желание продать прогу, а в ней окажется такой код, будет проблема, поэтому и хочется чтобы всё было изначально разрешено. Долго вкладывать огромные усилия, а потом понять что имеешь ограничение это неприятный риск. Когда-то я в винду так вкладывался и ещё окажешься виноватым, но теперь ушёл от этого.

Отредактировано AZJIO (13.02.2024 19:52:23)

0

13

Сделал Стеминг для AkelPad, теперь надо переписать его на SpiderBasic.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » как автоматически удалить окончание в словах