Распознавание данных в тексте является довольно распространенной задачей. И компания Microsoft предоставляет набор бесплатных библиотек recognizers-text, которые можно использовать для этой задачи.
recognizers-text-numbers: для распознавания чисел в тексте
recognizers-text-number-with-unit: для распознавания в тексте чисел вместе с единицами измерения
recognizers-text-date-time: для распознавания в тексте дат и времени
recognizers-text-sequence: для распознавания последовательностей типа номер телефона, адрес электронной почты и т.д.
Также есть общий пакет recognizers-text-suite, который объединяет все выше перечисленные библиотеки. Соответственно мы можем либо установить библиотеки по отдельности через пакетный менеджер PyPI:
pip install recognizers-text-number pip install recognizers-text-number-with-unit pip install recognizers-text-date-time pip install recognizers-text-sequence
либо установить один общий пакет
pip install recognizers-text-suite
Например, установим общий пакет. При установке пакета может потребоваться установить более старую версию библиотеки emoji, которая используется в пакете recognizers-text-suite
pip uninstall emoji pip install emoji==1.7
Для распознавания данных в тексте применяется ряд функций:
recognize_number()
: распознает числа
recognize_ordinal()
: распознает порядковые числа
recognize_percentage()
: распознает значения процентов
recognize_age()
: распознает возраст
recognize_currency()
: распознает валюты
recognize_dimension()
: распознает различные значения, которые применяются при измерении
recognize_temperature()
: распознает температуры
recognize_datetime()
: распознает дату и время
recognize_phone_number()
: распознает номер телефона
recognize_email()
: распознает адрес электронной почты
recognize_ip_address()
: распознает ip-адрес
recognize_url()
: адрес URL
recognize_guid()
: распознает GUID
Все эти методы в качестве первого параметра принимает текст, в котором надо распознать данные, а в качестве второго - культуру.
Результатом методов является список объектов ModelResult
, который хранит результы распозначания в следующих атрибутах:
text
: подстрока в текста, которая сопоставляется с данными
start
: индекс начала сопоставленной подстроки
end
: конечный индекс сопоставленной подстроки
type_name
: тип сопоставленного значения
resolution
: собственно данные сопоставления. Представляет словарь, где ключ value собственно представляет распознанные данные.
Что касается языковых культур, для которых доступно преобразование на момент написания данной статьи:
Culture.English, Culture.EnglishOthers, Culture.Dutch, Culture.Chinese, Culture.French, Culture.Italian, Culture.Japanese, Culture.Korean, Culture.Portuguese, Culture.Spanish, Culture.SpanishMexican, Culture.Turkish, Culture.German
Также ожидается добавление поддержки для арабского, японского, корейского и шведского языков.
Для распознавания чисел применяется функция recognize_number() из пакета recognizers_number
:
from recognizers_number import recognize_number, Culture # results - набор найденных чисел results = recognize_number("I have three apples and five oranges", Culture.English) for result in results: print(f"Распознанный текст: {result.text}") print(f"Начальный индекс в строке: {result.start}") print(f"Начальный индекс в строке: {result.end}") print(f"Распознаное значение: {result.resolution['value']}\n")
В данном случае исходное предложение "I have three apples and five oranges" содержит два числа: "three" и "five". Распознавание идет для английского языка. Соответственно консольный вывод распознавания будет следующим:
Распознанный текст: three Начальный индекс в строке: 7 Начальный индекс в строке: 11 Распознаное значение: 3 Распознанный текст: five Начальный индекс в строке: 24 Начальный индекс в строке: 27 Распознаное значение: 5
Таким образом, числа 3 и 5 распознаны.
Для распознавания порядковых чисел применяется функция recognize_ordinal() из пакета recognizers_number
. При обнаружении порядкового числительного она получает
его числовое значение:
from recognizers_number import recognize_ordinal, Culture # results - набор найденных чисел results = recognize_ordinal("The fifth book", Culture.English) for result in results: print(result.resolution["value"]) # 5
Для распознавания процентов применяется функция recognize_percentage() из пакета recognizers_number
:
from recognizers_number import recognize_percentage, Culture results = recognize_percentage("sixty-seven percents", Culture.English) for result in results: print(result.resolution["value"]) # 67%
Для распознавания возраста применяется функция recognize_age() из пакета recognizers_number_with_unit
:
from recognizers_number_with_unit import recognize_age, Culture results = recognize_age("Tom is thirty-eight years old", Culture.English) for result in results: print(result.resolution["value"]) # 38 results = recognize_age("she with her twenty two years of age", Culture.English) for result in results: print(result.resolution["value"]) # 22
Для распознавания валют применяется функция recognize_currency() из пакета recognizers_number_with_unit
:
from recognizers_number_with_unit import recognize_currency, Culture results = recognize_currency("the sum was $ 15.4 million", Culture.English) for result in results: print(result.resolution["value"]) # 15400000 results = recognize_currency("1 RUB = 0.013 EUR", Culture.English) for result in results: print(result.resolution["value"]) # 1 и 0.013
Для распознавания различных размеров, весов, расстояний, масс применяется функция recognize_dimension() из пакета recognizers_number_with_unit
:
from recognizers_number_with_unit import recognize_dimension, Culture results = recognize_dimension("ten kg equals 22.0462262185 pounds", Culture.English) for result in results: print(result.resolution["value"]) # 10 и 22.0462262185 results = recognize_dimension("It took him half an hour to drive home from work. He averaged thirty-four miles per hour. ", Culture.English) for result in results: print(result.resolution["value"]) # 34
Для распознавания температур применяется функция recognize_temperature() из пакета recognizers_number_with_unit
:
from recognizers_number_with_unit import recognize_temperature, Culture results = recognize_temperature("The official highest recorded temperature is now 56.7°C (134°F), which was measured on 10 July 1913 at Greenland Ranch, Death Valley, California, USA", Culture.English) for result in results: print(result.resolution["value"]) # 56.7 и 134
Для распознавания температур применяется функция recognize_datetime() из пакета recognizers_date_time
:
from recognizers_date_time import recognize_datetime, Culture results = recognize_datetime("I will go back 8pm today or 7am tomorrow", Culture.English) for result in results: for data in result.resolution["values"]: print(data["value"])
Здесь получение результата немного отличается от предыдущих примеров. В частности, атрибут result.resolution
представляет словарь, где все данные храняться в
элементе "values". Этот элемент представляет список с одним словарем, в котором собственно сопоставленное время хранится в элементе value
Результат работы программы:
2023-01-04 20:00:00 2023-01-05 07:00:00
Дополнительно пакет recognizers-sequence
предоставляет ряд функций для распознавания последовательностей:
recognize_phone_number()
(номер телефона), recognize_email()
(адрес электронной почты),
recognize_ip_address()
(ip-адрес), recognize_url()
(адрес URL), recognize_guid()
(значение guid). Применение некоторых функций
from recognizers_sequence import recognize_phone_number, recognize_email, Culture results = recognize_phone_number("Main contact: +1-234-567-8901", Culture.English) for result in results: print(result.resolution["value"]) # +1-234-567-8901 results = recognize_email("Second contact: tom@somemail.com", Culture.English) for result in results: print(result.resolution["value"]) # tom@somemail.com