Распознавание данных

Распознавание данных в тексте с помощью библиотеки recognizers-text

Последнее обновление: 04.01.2023

Распознавание данных в тексте является довольно распространенной задачей. И компания 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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850