Рубрики
Без рубрики

Извлечение информации из текста с помощью Python

Мы будем реализовывать извлечение информации с нуля в Python, используя популярную космическую библиотеку.

Автор оригинала: Prateek.

Введение в извлечение информации

Извлечение информации (ИЭ) является важнейшим винтиком в области обработки естественного языка (НЛП) и лингвистики. Он широко используется для таких задач, как Системы ответов на вопросы, Машинный перевод, Извлечение сущностей, Извлечение событий, Связывание именованных сущностей, Разрешение кореференции, Извлечение отношений и т. Д.

В извлечении информации существует важное понятие троек.

Тройка представляет собой пару сущностей и отношение между ними. Например, (Obama, born, Hawaii) – это тройка, в которой “Obama” и “Hawaii” являются родственными сущностями, а отношение между ними – “born”.

В этой статье мы сосредоточимся на извлечении этих типов троек из данного текста.

Различные подходы к извлечению информации

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

Существует несколько подходов к автоматическому извлечению информации. Давайте разберемся в них один за другим:

  1. Подход, основанный на правилах : Мы определяем набор правил для синтаксиса и других грамматических свойств естественного языка, а затем используем эти правила для извлечения информации из текста.

  2. /|: Допустим, у нас есть предложение S. Он имеет две сущности E1 и E2. Теперь модель контролируемого машинного обучения должна определить, существует ли какое-либо отношение (R) между E1 и E2. Таким образом, в контролируемом подходе задача извлечения отношений превращается в задачу обнаружения отношений. Единственным недостатком этого подхода является то, что для обучения модели требуется много помеченных данных. Полууправляемый

  3. : Когда у нас недостаточно помеченных данных, мы можем использовать набор начальных примеров (троек) для формулировки высокоточных шаблонов, которые можно использовать для извлечения большего количества отношений из текста.

Извлечение информации с помощью Python и пространства

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

1. Соответствие правил Спейси

Во – первых, мы импортируем необходимые библиотеки:

import re 
import string 
import nltk 
import spacy 
import pandas as pd 
import numpy as np 
import math 
from tqdm import tqdm 

from spacy.matcher import Matcher 
from spacy.tokens import Span 
from spacy import displacy 

pd.set_option('display.max_colwidth', 200)

Далее, давайте загрузим космическую модель.

# load spaCy model
nlp = spacy.load("en_core_web_sm")

Мы все настроены добывать информацию из текста, основываясь на некоторых интересных паттернах.

Шаблон: X, такой как Ваш

# sample text 
text = "GDP in developing countries such as Vietnam will continue growing at a high rate." 

# create a spaCy object 
doc = nlp(text)

Для того чтобы извлечь нужную информацию из приведенного выше предложения, очень важно понять его синтаксическую структуру — такие вещи, как субъект, объект, модификаторы и части речи (POS) в предложении.

Мы можем легко исследовать эти синтаксические детали в предложении, используя пространство:

# print token, dependency, POS tag 
for tok in doc: 
  print(tok.text, "-->",tok.dep_,"-->", tok.pos_)

Выход:

GDP --> nsubj --> NOUN 
in --> prep --> ADP 
developing --> amod --> VERB 
countries --> pobj --> NOUN 
such --> amod --> ADJ 
as --> prep --> ADP 
Vietnam --> pobj --> PROPN 
will --> aux --> VERB 
continue --> ROOT --> VERB 
growing --> xcomp --> VERB 
at --> prep --> ADP 
a --> det --> DET 
high --> amod --> ADJ 
rate --> pobj --> NOUN 
. --> punct --> PUNCT

Посмотрите вокруг терминов “такой” и “как” . За ними следует существительное (“страны”). И после них у нас есть имя собственное (“Вьетнам”), которое выступает в качестве гипонима.

Итак, давайте создадим необходимый шаблон, используя теги зависимостей и теги POST:

#define the pattern 
pattern = [{'POS':'NOUN'}, 
           {'LOWER': 'such'}, 
           {'LOWER': 'as'}, 
           {'POS': 'PROPN'} #proper noun]

Давайте извлекем шаблон из текста.

# Matcher class object 
matcher = Matcher(nlp.vocab) 
matcher.add("matching_1", None, pattern) 

matches = matcher(doc) 
span = doc[matches[0][1]:matches[0][2]] 

print(span.text)

Вывод: “такие страны, как Вьетнам”

Мило! Он отлично работает. Однако если бы мы могли получить “развивающиеся страны”, а не просто “страны”, то результат имел бы больше смысла.

Итак, теперь мы также захватим модификатор существительного непосредственно перед “таким как”, используя приведенный ниже код:

# Matcher class object
matcher = Matcher(nlp.vocab)

#define the pattern
pattern = [{'DEP':'amod', 'OP':"?"}, # adjectival modifier
           {'POS':'NOUN'},
           {'LOWER': 'such'},
           {'LOWER': 'as'},
           {'POS': 'PROPN'}]

matcher.add("matching_1", None, pattern)
matches = matcher(doc)

span = doc[matches[0][1]:matches[0][2]]
print(span.text)

Выход: “развивающиеся страны, такие как Вьетнам”

Примечание: Клавиша “OP”:”? ” в приведенном выше шаблоне означает, что модификатор (“amod”) может возникнуть один раз или не возникать вообще.

Аналогичным образом мы можем получить несколько пар из любого фрагмента текста:

  • Фрукты, такие как яблоки
  • Такие автомобили, как Ferrari
  • Цветы, такие как роза

Теперь давайте воспользуемся некоторыми другими шаблонами, чтобы извлечь больше гипернимов и гипонимов.

Выкройка: X и/или Y

doc = nlp("Here is how you can keep your car and other vehicles clean.") 

# print dependency tags and POS tags
for tok in doc: 
  print(tok.text, "-->",tok.dep_, "-->",tok.pos_)

Выход:

Here --> advmod --> ADV 
is --> ROOT --> VERB 
how --> advmod --> ADV 
you --> nsubj --> PRON 
can --> aux --> VERB 
keep --> ccomp --> VERB 
your --> poss --> DET 
car --> dobj --> NOUN 
and --> cc --> CCONJ 
other --> amod --> ADJ 
vehicles --> conj --> NOUN 
clean --> oprd --> ADJ 
. --> punct --> PUNCT

Выход: “автомобиль и другие транспортные средства”

# Matcher class object 
matcher = Matcher(nlp.vocab) 

#define the pattern 
pattern = [{'DEP':'amod', 'OP':"?"}, 
           {'POS':'NOUN'}, 
           {'LOWER': 'and', 'OP':"?"}, 
           {'LOWER': 'or', 'OP':"?"}, 
           {'LOWER': 'other'}, 
           {'POS': 'NOUN'}] 
           
matcher.add("matching_1", None, pattern) 

matches = matcher(doc) 
span = doc[matches[0][1]:matches[0][2]] 
print(span.text)

Выход: “автомобиль и другие транспортные средства”

Давайте попробуем тот же код, чтобы захватить шаблон “X или Y”.

# replaced 'and' with 'or' 
doc = nlp("Here is how you can keep your car or other vehicles clean.")

Остальная часть кода останется прежней.

# Matcher class object 
matcher = Matcher(nlp.vocab) 

#define the pattern 
pattern = [{'DEP':'amod', 'OP':"?"}, 
           {'POS':'NOUN'}, 
           {'LOWER': 'and', 'OP':"?"}, 
           {'LOWER': 'or', 'OP':"?"}, 
           {'LOWER': 'other'}, 
           {'POS': 'NOUN'}] 
           
matcher.add("matching_1", None, pattern) 

matches = matcher(doc) 
span = doc[matches[0][1]:matches[0][2]] 
print(span.text)

Выход: “автомобиль или другие транспортные средства”

Выкройка: X, особенно Ты

doc = nlp("A healthy eating pattern includes fruits, especially whole fruits.") 

for tok in doc: 
  print(tok.text, tok.dep_, tok.pos_)

Выход:

A --> det --> DET 
healthy --> amod --> ADJ 
eating --> compound --> NOUN 
pattern --> nsubj --> NOUN 
includes --> ROOT --> VERB 
fruits --> dobj --> NOUN 
, --> punct --> PUNCT 
especially --> advmod --> ADV 
whole --> amod --> ADJ 
fruits --> appos --> NOUN 
. --> punct --> PUNCT
# Matcher class object 
matcher = Matcher(nlp.vocab)

#define the pattern 
pattern = [{'DEP':'nummod','OP':"?"}, 
           {'DEP':'amod','OP':"?"}, 
           {'POS':'NOUN'}, 
           {'IS_PUNCT':True}, 
           {'LOWER': 'especially'}, 
           {'DEP':'nummod','OP':"?"}, 
           {'DEP':'amod','OP':"?"}, 
           {'POS':'NOUN'}] 
           
matcher.add("matching_1", None, pattern) 

matches = matcher(doc) 
span = doc[matches[0][1]:matches[0][2]] 
print(span.text)

Вывод: “фрукты, особенно цельные фрукты”

Вывод

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

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

Спасибо!