Comments 4
Тоже на коленке делал в своё время TF-IDF (кликабельно) и прикручивал его на laravel.su для генерации ключевых слов (html meta keywords) для страниц документации (это когда ещё старый дизайн был). Работает великолепно, всем советую впихнуть к себе такую штуку для подобных задач.
Поэтому могу дополнить, что если уж взбредёт такая мысль пилить такое софтварно, то:
Для токенизации лучше всего использовать
IntlRuleBasedBreakIterator: https://www.php.net/manual/en/class.intlrulebasedbreakiterator.php - мне показалось это как минимум и самым эффективным, так и самым грамотным способом (в разных локалях/языках “пробельные” символы могут быть различными, intl всё это учитывает).Плюс не забывать про stop words: Нужно из результата выкидывать всякие предлоги, местоимения и прочее. Они вообще никакой роли не играют (кроме названий/заголовков, там они могут быть важны).
Нельзя забывать ещё и о нормализации юникода, весь текст стоит приводить явно к какому-нибудь NFC, иначе потом можно удивиться почему одно и тоже вроде бы слово по разному считается.
В качестве супер-костыля для “стемминга” можно использовать doctrine/inflector. Да, это вообще про другое, но оно может вполне сгладить лишнюю избыточность на первом этапе.
Опять же, это делалось всё для опенсорса в качестве эксперимента, “фор фан”, и просто чтобы “хоть как-то работало”, поэтому приведённые выше ремарки могут быть оторваны от реальности и грамотные люди могут меня поправить ниже в комментариях.
Приведённые примеры с статье были только для понимания концепции, для нормальной работы я бы рекомендовал использовать TfIdfTransformer от RubixML: https://rubixml.github.io/ML/2.0/transformers/tf-idf-transformer.html
Но меня лично радует тот факт, что есть люди, которые пытаются разобраться в теме самостоятельно. Скажите, вы поддерживаете как-то этот репозиторий? Я бы хотел добавить его в https://github.com/apphp/awesome-php-ml
И ещё - а каким образом конкретно вы использовали его для генерации ключевых слов?
Скажите, вы поддерживаете как-то этот репозиторий?
Поддерживаю в формате “пока ишью не прилетит, тогда поправлю”. На PHP 8.5 он вроде заводится вполне. Из проблем - только зависимость на voku/stop-words, которая в каком-то полузаброшенном состоянии и выплёвывет deprecation notice. Плюс “политически ангажированный” пакет (автор), что может быть не совсем безопасным. Но альтернатив чтоб “стоп-слова” поддерживалось кем-то я не находил.
И ещё - а каким образом конкретно вы использовали его для генерации ключевых слов?
Есть массив из документов (страниц документации) по фреймворку. Самое “редкое” слово между разными документами, но самое “частое” на конкретно этой странице и является в большинстве случаев ключевым словом и темой страницы документации.
Например, на странице “установки” чаще всего упоминается именно “установка”, всякие “windows”, “docker” и прочие. В отличие от других страниц, где про установку наоборот ничего нет.
Или на странице роутинга чаще всего говорится как раз про “роутинг”, “миддлвари” и прочее. На остальных страницах документации таких упоминаний нет (или в разы меньше), как следствие и ключевые слова для страницы будут именно такими.
Есть массив из документов (страниц документации) по фреймворку. Самое “редкое” слово между разными документами, но самое “частое” на конкретно этой странице и является в большинстве случаев ключевым словом и темой страницы документации.
Спасибо, как-то я прошёл мимо такой возможности использовать TF-IDF, хотя это действительно абсолютно естественным образов вытекает из свойств этой модели.
AI для PHP-разработчиков. Часть 6: Bag of Words и TF–IDF – как компьютер превращает текст в математику