LexNLP - Библиотека для автоматического извлечения текста и NER

Использование LexPredict, будущей расширенной библиотеки для распознавания именованных сущностей (NER) для извлечения имен, адресов, дат и т. Д.

Вступление

Несколько недель назад мне приходилось извлекать определенные типы данных из набора документов, и я задавался вопросом, как лучше всего это сделать. Все документы представляли собой формы аренды с такими данными, как названия организаций, адреса, даты, суммы, условия и т. Д.

Я начал старомодным способом, используя регулярное выражение для идентификации определенных полей с соответствующими синонимами в каждом документе. Мне пришлось вручную настроить правила для извлечения каждого типа поля.

Однако позже я обнаружил LexNLP и его возможности. Все необходимые мне данные были извлечены с помощью LexNLP без необходимости писать какие-либо правила. Библиотека меня очень поразила, но не нашел никаких руководств, кроме документации. Итак, здесь я создаю шлюз к LexNLP для других профессионалов в области данных, которые могут извлечь выгоду из его функций.

Ниже представлен обзор LexNLP, созданного ContraxSuite. Я привожу примеры для извлечения определенных видов данных, таких как даты, названия организаций, деньги и адреса. В настоящее время библиотека доступна для извлечения на английском, испанском и немецком языках.

LexNLP может извлекать из текстовых данных всю следующую информацию:

Требования

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 use lexnlp.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 копает, наслаждайтесь кофе и ждите результатов!

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