Определение имени в тексте/элементе

Хочу по ховеру мыши на текст/элемент определять что это имя человека. И хочу это делать на клиенте.

Вероятнее всего это сложно сделать скриптом)
Подскажете, в каком направлении думать, и возможно ли это или стоит оно того?)

Может выгрузить какую нить базу папулярных имен и фамилий и по ним сравнивать то что я “наховерил”?

Может какие-то регулярки использовать?

база - это обращение к бэку, и имена могут быть любые, завтра скажут, что Jscourse - имя человека. Можно регуляркой. Но могут быть и цифры (римские): Петр I

Ну под базой, я имел ввиду какое-то клиентское хранилище. И я не расчитываю на 100% определений. Какой нить “достаточно/приблизительно” сойдет

Можно сделать регулярными выражениями

Если надо что то сохранить то есть бд на клиенте это LocalStorege

Я думаю, что регулярка будет детектить “что-попало”. Можно в storage сохранить самые популярные имена (на русском, английском, может на укр)


Ссылка на LocalStoreage

На тостере есть годные ответы https://toster.ru/q/120155 где найти базы русских имен (предполагаю речь о них).

Я скачал базу, чуток обработал, получил 51тыщу имен в 700кб текста. Из них можно теоретически построить регулярку, можно попробовать пробегаться по всему массиву. Честно, не знаю что будет лучше/быстрее. Но делать на клиенте это в главном потоке (в котором происходит рендер) не стоит: будет тормозить.

Если нужно хочется решить задачу, то я бы пилил вебворкер, в него динамически загружал бы базу имен, потом извлекал текст со страницы, в вебворкере бы пытался распознать вхождения имен. И делал бы этого до того как пользователь наведет мышку на текст чтобы при наведении уже показать результат.

Я бы не влезал в эту тему. Тем более со стороны фронта. Лучше бы бек давал информацию в тексте что есть имя а что нет. А ты бы просто показывал.

Регуляркой по именам из базы наверное лучше, т.к. имена могут склоняться в падеже: Петр, Петра, Петру, о Петре, Петров

Если хочешь писать бек на стороне клиента то изучи node js

Идея была такова, что это будет плагин, который будет встраивать какую-то js логику в страницы. Ты предлагаешь отправлять всю страницу на бек и на беке ее парсить? и возвращать иимена, например?

И вероятнее всего мне чаще придется распознавать английский

Чтоб меньше нагружать, можно сначала определить начало слова

  1. С большой буквы
  2. de Name
  3. D’Name - хоть это и под 1 правило попадает
    по популярным правилам. Если под правило попадает, тогда искать в базе.

В контексте плагина не думал. Я думал что страницу тебе отдает сервер.

Отправление страницы на сервер может быть сопряжено с юридическими проблемами из-за privacy.

Воркер для с этой перспективы лучше.


Еще вариант с отправкой данных: можно пропустить текст через MyStem — Технологии Яндекса и он дает альтернативные формы слов, и уже использовать их для поиска имен. Я для примера прогнал такой текст

Сергей Валерианович мыл раму уксусом и неудоумевал почему у него так чертовски хорошо это получается.

И получил такой результат анализа:

Сергей{сергей}Валерианович{валерианович}мыл{мыть|мыло}раму{рама|рам}уксусом{уксус}и{и}неудоумевал{неудоумевал??}почему{почему}у{у}него{он|оно}так{так}чертовски{чертовски|чертовский}хорошо{хорошо|хороший}это{это|этот}получается{получаться}

Я делал оценку количества данных, которые необходимо хранить/загружать с сервера. Если у тебя плагин, то всю базу можно будет запихнуть в дистрибутив плагина. Предложенная методика от этого не меняется.

Вариант с отправкой данных я пытаюсь пока не трогать.

Я так и планировал сделать, держать базу где-то в background скриптах плагина. А где взять базу популярных имен на английском?

И вероятно нужно какой-то “модный/умный” алгоритм поиска придумать)

Это само собой. Нужно проверить вначале, что это два слова стоящие рядом, написанные с большой буквы и разделены пробелом.

Под такой паттерн не 100% имен попадут, ну я хочу что бы было хотя бы большинство

Узнать, какие правила именования человек, если не с большой буквы. Таких правил единицы.
Наверное даже может быть так: D’Popularname, хоть я не уверен.

Это достаточно распространенный вопрос, я видел ответы в интернете.

Я бы пробовал сначала “влоб” и смотрел на сколько это медленно.

1 лайк

Еще нашел такой ресурс, http://compromise.cool/

Но он выдает ожидаемые результаты только на очень распространенные имена