LexNLP - Библиотека для автоматического извлечения текста и NER
Использование LexPredict, будущей расширенной библиотеки для распознавания именованных сущностей (NER) для извлечения имен, адресов, дат и т. Д.
Вступление
Несколько недель назад мне приходилось извлекать определенные типы данных из набора документов, и я задавался вопросом, как лучше всего это сделать. Все документы представляли собой формы аренды с такими данными, как названия организаций, адреса, даты, суммы, условия и т. Д.
Я начал старомодным способом, используя регулярное выражение для идентификации определенных полей с соответствующими синонимами в каждом документе. Мне пришлось вручную настроить правила для извлечения каждого типа поля.
Однако позже я обнаружил LexNLP и его возможности. Все необходимые мне данные были извлечены с помощью LexNLP без необходимости писать какие-либо правила. Библиотека меня очень поразила, но не нашел никаких руководств, кроме документации. Итак, здесь я создаю шлюз к LexNLP для других профессионалов в области данных, которые могут извлечь выгоду из его функций.
Ниже представлен обзор LexNLP, созданного ContraxSuite. Я привожу примеры для извлечения определенных видов данных, таких как даты, названия организаций, деньги и адреса. В настоящее время библиотека доступна для извлечения на английском, испанском и немецком языках.
LexNLP может извлекать из текстовых данных всю следующую информацию:
- Действия, например, раздел 1 Закона 1986 года о продвижении надежды
- Количества, например, десять фунтов или 5,8 мегаватт
- Цитаты, например, 10 US 100 или «1998 S. Ct. 1 ”
- Компании, например, Lexpredict LLC
- Условия, например, при условии… или до тех пор, пока…
- Ограничения, например, не более чем или «
- Авторское право, например, © Copyright 2000 Acme
- Суды, например, Верховный суд Нью-Йорка
- CUSIP, например, 392690QT3
- Даты, например, 1 июня 2017 г. или 2018–01–01
- Определения, например, термин означает…
- Расстояния, например, пятнадцать миль
- Продолжительность, например, десять лет или тридцать дней
- Географические и геополитические объекты, например, Нью-Йорк или Норвегия
- Деньги и валюта, например, 5 долларов США или 10 евро.
- Проценты и ставки, например, 10% или 50 б.п.
- PII, например, 212–212–2121 или 999–999–9999.
- Соотношения, например, 3: 1 или четыре к трем
- Правила, например, 32 CFR 170
- Товарные знаки, например, MyApp (TM)
- URL-адреса, например, http://acme.com/ »
Требования
LexNLP требует Python 3.6! Поэтому вам рекомендуется создать полностью новую виртуальную среду в python 3.6 и загрузить все требования для библиотеки LexNLP по ссылке ниже на github.
Когда все будет установлено, попробуйте import LexNLP
. Если это сработает, значит, вы готовы к продолжению, но если вы столкнетесь с ошибкой, выполните требования еще раз и убедитесь, что у вас правильные версии. Прокомментируйте ниже, если вам нужна помощь.
Мы начнем с импорта каждой из следующих библиотек. Обязательно установите каждую из этих библиотек:
from tika import parser import glob, os import pandas as pd from bs4 import BeautifulSoup import codecs import re import numpy as np
Чтение текста из документов PDF / Word.
Поскольку все мои файлы были в форматах PDF / Doc, мне просто нужно было извлечь текст в виде строки из каждого документа. Я воспользуюсь для этого библиотекой Tika. Функция, которую я написал ниже, дает мне фрейм данных с информацией о каждом файле, включая текст, необходимый для извлечения.
def multipdftotxt(path): df = pd.DataFrame(columns = ['S.No', 'File_Name', 'Author', 'Creation_Date', 'Title','Content']) pdfs = [] i=0 os.chdir(path) types = ['*.pdf', '*.doc', '*.docx'] textfiles = [] for typ in types: textfiles.append(glob.glob(typ)) flat_list = [] for sublist in textfiles: for item in sublist: flat_list.append(item) textfiles = flat_list for file in textfiles: print(file) raw = parser.from_file(file) text = raw['content'] dict2 = raw['metadata'] Author = dict2.get('Author') Creation_Date = dict2.get('Creation-Date') title = dict2.get('title') i = i+1 df1 = {'S.No': i,'File_Name': file,'Author': Author,'Creation_Date': Creation_Date, 'Title': title,'Content': text} df = df.append(df1, ignore_index=True) df = df.replace('\n', ' \n ', regex=True, ) df = df.replace('\t', ' ', regex=True) df = df.dropna(subset=['Content']) return df
Изображение выше показывает нам, как будет выглядеть фрейм данных. Все, что мне нужно от этого фрейма данных, - это столбцы «Текст» и «Имена файлов», поэтому я извлечу эти два столбца в словарь, используя другую функцию.
def dftod(df): l = [] for i in df['Content']: l.append(i) emailname = [] for i in df['File_Name']: emailname.append(i) d = dict(zip(emailname, l)) k = [v.strip() for k,v in d.items()] k = [re.sub(' +', ' ', temp) for temp in k] k = [re.sub('\n +', '\n', temp) for temp in k] k = [re.sub('\n+', '\n', temp) for temp in k] d = dict(zip(emailname, k)) return d
Теперь я извлек текст в словарь и готов использовать функции извлечения LexNLP.
Добыча
Импорт правильных функций из LexNLP - ключ к правильному использованию библиотеки. Ниже я покажу вам, как извлекать определенные типы данных: имена сущностей, адреса, даты и деньги.
Имена сущностей
import lexnlp.extract.en.entities.nltk_re
#Remember d is our dictionary containing filenames and text.
#For entity names, use lexnlp.extract.en.entities.nltk_re.get_companies(text)
for filename,text in d.items():
print(list(lexnlp.extract.en.entities.nltk_re.get_entities.nltk_re.get_companies(text)))
Output:
['Target Inc',
'Hawthorne LLC',
'Willburne & Co.']
Адреса
from lexnlp.extract.en.addresses import address_features #You want to uselexnlp.extract.en.addresses.address_features.get_word_features(text)
for filename,text in d.items(): print(list(lexnlp.extract.en.addresses.address_features.get_word_features(text)))
#Check for DateTime/Zip-code/Email-Address/URL:lexnlp.extract.en.addresses.address_features.is_datetime(text) lexnlp.extract.en.addresses.address_features.is_zip_code(text) lexnlp.extract.en.addresses.address_features.is_email(text) lexnlp.extract.en.addresses.address_features.is_url(text)
Даты
Даты можно извлекать в следующих форматах:
- 1 февраля 1998 г.
- 2017–06–01
- 1 июня 2017 г.
- 31 октября 2016 г.
- 15 марта 2000 г.
import lexnlp.extract.en.dates for filename,text in d.items(): print(list(lexnlp.extract.en.dates.get_dates(text))) Output: [[datetime.date(1998, 2, 1)], [datetime.date(2017, 6, 1)], [datetime.date(2016, 10, 31)], [datetime.date(2000, 3, 15)]]
Деньги
Деньги можно получить в следующих форматах:
- пять долларов
- 5 долларов
- 5 долларов США
- $5
На данный момент через LexNLP можно определить только следующие валюты:
- USD / $: доллары США
- EUR / €: евро
- GBP / £: британский фунт стерлингов
- JPY / ¥: японская иена
- CNY / RMB / 元 / ¥: китайский юань / юань
- INR / ₨ / ₹: индийская рупия
import lexnlp.extract.en.money for filename,text in d.items(): print(list(lexnlp.extract.en.money.get_money(text))) Output: [(5000000.00, 'GBP'), (100000.00, 'INR')]
Для получения дополнительной информации и ресурсов посетите официальную документацию:
Https://lexpredict-lexnlp.readthedocs.io
Пока LexNLP копает, наслаждайтесь кофе и ждите результатов!
Продолжайте следить! Я ценю любовь.
Я не писал так много в последние несколько месяцев, но рад сообщить, что вернулся в игру.