Задать вопрос
Keyon
@Keyon
fullstack developer

Как определить типы чисел в тексте?

Допустим есть два типа числа в тексте:
  1. Зарплата
  2. Телефон


Есть исходный текст: "Нам нужны программисты 25000 28315"
Вот где – 25000 нужно определить как "зарплата", а 28315 определить как "телефон".
При этом зарплату могут написать и так: 25 000, 25т 25 т.р. 25000 рублей и т.д.
Телефон могут написать так: телефон 28315, т. 28315, 2 83 15, 2-83-15, 283-15 и т.д.
Но есть еще вариант что последние два числа будут такими 28310, 28315 – и это номера телефонов.

Сейчас такие объявления разбираются регуляркой, но там ужасный кошмарный ужас от которых очень много проблем.
Вижу несколько вариантов решений: 1 – это собственно написать и обучить нейроную сеть. 2 – это описать алгоритм и я его вижу примерно таким: прогоняем в первой итерации все объявления и навешиваем на текст токены, во второй итерации читаем только числа и тут уже учим читать контекст всего текста. Например для чисел у нас есть несколько проверок на телефон и на зарплату, после выполнения проверок мы накапливаем баллы для числа и определяем если больше нужного то считаем за нужный тип.

Проблема с нейронкой, я в ней не силен и не понимаю как ей передать весь текст объявления что-бы она смогла его прочитать.
Проблема с алгоритмом, пугает его сложность т.к. я еще не до конца понимаю всех подводных камней которые могут появится.

Времени на решение проблемы не так много (ДедЛАЙН).
Прошу помощи, решали ли вы подобную задачу, как?
Как нейронке скормить все предложение чтоб она его прочитала?
Или нейронку в форточку и по старинке додумать алгоритм?
  • Вопрос задан
  • 164 просмотра
Подписаться 2 Сложный 4 комментария
Решения вопроса 1
@ivodopyanov
NLP, python, numpy, tensorflow
Эта задача называется Named Entity Recognition (NER), и state-of-the-art решение в ней - это BiLSTM + CRF. Вот здесь есть пример: https://github.com/farizrahman4u/keras-contrib/blo...

Основная проблема - это как разметить датасет. Я, когда решал недавно такую же проблему, придумал делать так:
1) Заменяем все цифры на какой-то один символ. Например, "0".
2) Разбиваем текст на слова.
3) Строим частотный словарь n-грамм (n = от 1 до какого-нибудь числа k, выбранного вручную), таких, чтобы в них входило хотя бы одно слово с цифрой. N-граммы нужны, потому что есть много числовых фактов из более чем одного слова - те же номера телефонов в формате 7 000 000 00 00 или номера паспортов 0000 000000.
4) Генерим векторные представления для этих n-грамм, используя word2vec или аналоги. Т.е. разбиваем фразу на слова, а потом вокруг какого-то слова с цифрами сливаем вместе n слов и отдаем в модель. Тем самым n-граммы различных вариантов написания телефонных номеров будут находится более-менее рядом.
5) Начинаем вручную размечать n-граммы, отсортированные по частоте. При желании потом можно взять какой-то размеченный кластер и поразмечать n-граммы, отсортированные по расстоянию до центра кластера. Т.е. сначала примерно определили, где находится кластер телефонных номеров, а потом четко обрисовали его границу. Я для всего этого написал бота в телеграмме.
6) В итоге получили кластеризацию n-грамм - далее легко получить маски фраз с метками и натравить на это ту нейронную модель.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Vlad_Fedorenko
Сейчас такие объявления разбираются регуляркой, но там ужасный кошмарный ужас от которых очень много проблем.

А вот в нейросетях всё прекрасно, пылятся и ждут, пока их кто-то обучит на десяти примерах
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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