Введение в извлечение информации
Извлечение информации (ИЭ) является важнейшим винтиком в области обработки естественного языка (НЛП) и лингвистики. Он широко используется для таких задач, как Системы ответов на вопросы, Машинный перевод, Извлечение сущностей, Извлечение событий, Связывание именованных сущностей, Разрешение кореференции, Извлечение отношений и т. Д.
В извлечении информации существует важное понятие троек.
Тройка представляет собой пару сущностей и отношение между ними. Например, (Obama, born, Hawaii) – это тройка, в которой “Obama” и “Hawaii” являются родственными сущностями, а отношение между ними – “born”.
В этой статье мы сосредоточимся на извлечении этих типов троек из данного текста.
Различные подходы к извлечению информации
В предыдущем разделе нам удалось легко извлечь тройки из нескольких предложений. Однако в реальном мире объем данных огромен, и ручное извлечение структурированной информации неосуществимо. Поэтому автоматизация извлечения этой информации становится важной.
Существует несколько подходов к автоматическому извлечению информации. Давайте разберемся в них один за другим:
Подход, основанный на правилах : Мы определяем набор правил для синтаксиса и других грамматических свойств естественного языка, а затем используем эти правила для извлечения информации из текста.
/|: Допустим, у нас есть предложение S. Он имеет две сущности E1 и E2. Теперь модель контролируемого машинного обучения должна определить, существует ли какое-либо отношение (R) между E1 и E2. Таким образом, в контролируемом подходе задача извлечения отношений превращается в задачу обнаружения отношений. Единственным недостатком этого подхода является то, что для обучения модели требуется много помеченных данных. Полууправляемый
: Когда у нас недостаточно помеченных данных, мы можем использовать набор начальных примеров (троек) для формулировки высокоточных шаблонов, которые можно использовать для извлечения большего количества отношений из текста.
Извлечение информации с помощью 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)
Вывод: “фрукты, особенно цельные фрукты”
Вывод
В этой статье мы узнали об извлечении информации, концепции отношений и троек, а также о различных методах извлечения отношений. Несмотря на то, что мы покрыли много земли, мы только что поцарапали поверхность области извлечения информации.
Я призываю вас всех реализовать этот код самостоятельно и посмотреть, сможете ли вы придумать несколько интересных шаблонов для моего.
Спасибо!