Задать вопрос

Как посчитать количество повторяющихся букв (отрезков) в наборе слов?

Нужно из массива слов выделить те, у которых повторяется начало, т.е. посчитать слова, которые имеют больше всего вероятности семантической сходности. Например, "автострада" и "автомобиль" попадут в конечную выдачу. Это можно сделать несколькими вложенными циклами (циклы вообще заменяют почти любой алгоритм), но красота и скорость такого решения стоит под огромным сомнением...

Как бы попробовали реализовать нечто эдакое вы? Как вообще можно такое реализовать (может, существуют известные алгоритмы)?

P.S. библиотеки (вроде phpMorphy) возможны, но нежелательны.
  • Вопрос задан
  • 4493 просмотра
Подписаться 6 Оценить 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Skillbox
    Профессия PHP-разработчик с нуля до PRO
    7 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
Решения вопроса 2
если массив слов большой, предлагаю создать ориентированные деревья, узлом которой будет буква, вершина - первая буква слова, во втором уровне будут вторые буквы и т.д. до конца всех слов. И количество сходностей можно будет определить количеством узлом, уровень сходности - уровнем узла. Пример:
Слова Автострада, Автомобиль Авиация
Граф:
А - В - Т - О - С - Т - Р - А - Д - А
    |       |
    И       М - О - Й - К - А
    |       |
    А       О
    |       |
    Ц       Б
    |       |
    И       И
    |       |
    Я       Л
            |
            Ь

Такие деревья надо создать для каждой буквы, с которой начинаются слова в словаре
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Угу. Туда же попадут "автор", "автохтон", "автобиография", "автомат"... А уж слова с приставками... По хорошему, надо разделять слова на приставку, корень (корни), суффикс и окончание, для чего желательно знать, как минимум роль слова в предложении (и то может не помочь, попробуйте разобрать "Косил косой косой косой" - да, тот самый заяц на поляне, да ещё и коса кривая.
Но если так хочется - строите дерево, где каждый уровень - следующая буква слова, а в узлах и листьях стоят счётчики количества слов. Для слов "автомобиль", "авто" и "автострада" получаем:
.                   +-м(1)-о(1)-б(1)-и(1)-л(1)-ь(1)
.а(3)-в(3)-т(3)-о(3)+
.                   +-с(1)-т(1)-р(1)-а(1)-д(1)-а(1)
Затем обходим дерево, там где сумма счётчиков в дочерних узлах не равна счётчику в родительском - заканчивается слово, а разность между суммами даёт количество этих слов в тексте.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
ilyaplot
@ilyaplot
PHP программист
Возможно, следует использовать sphinx?
Ответ написан
Mnobody
@Mnobody
Сдесь описывается немного другая задача, но может натолкнет на какие-то идеи (если хочется разбираться в вопросе).
habrahabr.ru/post/190694
Еще можете погуглить стиммеры и лематизаторы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы